Docker Networking-nginx: [emerg] host not found in upstream

Niedawno rozpocząłem migrację do Dockera 1.9 i funkcji sieciowych Docker-Compose 1.5, aby zastąpić je za pomocą linków.

Do tej pory z linkami nie było problemów z połączeniem nginx z moim serwerem FastCGI php5-fpm znajdującym się na innym serwerze w jednej grupie przez docker-compose. Gdy uruchamiam docker-compose --x-networking up Moje kontenery php-FPM, mongo i Nginx uruchamiają się, jednak nginx od razu rezygnuje z [emerg] 1#1: host not found in upstream "waapi_php_1" in /etc/nginx/conf.d/default.conf:16

Jednakże, jeśli uruchomię ponownie polecenie docker-compose podczas gdy php i kontenery mongo są uruchomione( nginx zakończony), nginx uruchamia się i działa dobrze od tego czasu.

To jest mój docker-compose.yml Plik:

nginx:
  image: nginx
  ports:
    - "42080:80"
  volumes:
    - ./config/docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro

php:
  build: config/docker/php
  ports:
    - "42022:22"
  volumes:
    - .:/var/www/html
  env_file: config/docker/php/.env.development

mongo:
  image: mongo
  ports:
    - "42017:27017"
  volumes:
    - /var/mongodata/wa-api:/data/db
  command: --smallfiles

To jest moje default.conf dla nginx:

server {
    listen  80;

    root /var/www/test;

    error_log /dev/stdout debug;
    access_log /dev/stdout;

    location / {
        # try to serve file directly, fallback to app.php
        try_files $uri /index.php$is_args$args;
    }

    location ~ ^/.+\.php(/|$) {
        # Referencing the php service host (Docker)
        fastcgi_pass waapi_php_1:9000;

        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;

        # We must reference the document_root of the external server ourselves here.
        fastcgi_param SCRIPT_FILENAME /var/www/html/public$fastcgi_script_name;

        fastcgi_param HTTPS off;
    }
}
W jaki sposób mogę zmusić nginx do pracy tylko z jednym wywołaniem docker-compose?
Author: Attila Szeremi, 2015-11-10

12 answers

Istnieje możliwość użycia "volumes_from" jako obejścia, dopóki nie zostanie wprowadzona funkcja depends_on (omówiona poniżej). Wszystko, co musisz zrobić, to zmienić plik docker-compose jak poniżej:

nginx:
  image: nginx
  ports:
    - "42080:80"
  volumes:
    - ./config/docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
  volumes_from:
    - php

php:
  build: config/docker/php
  ports:
    - "42022:22"
  volumes:
    - .:/var/www/html
  env_file: config/docker/php/.env.development

mongo:
  image: mongo
  ports:
    - "42017:27017"
  volumes:
    - /var/mongodata/wa-api:/data/db
  command: --smallfiles

Jednym dużym zastrzeżeniem w powyższym podejściu jest to, że wolumeny php są narażone na działanie nginx, co nie jest pożądane. Ale w tej chwili jest to jedno obejście specyficzne dla Dockera, które można wykorzystać.

Depends_on feature To prawdopodobnie byłaby futurystyczna odpowiedź. Ponieważ funkcjonalność nie jest jeszcze zaimplementowana w Docker (od wersji 1.9)

Pojawiła się propozycja wprowadzenia "depends_on" w nowej funkcji sieciowej wprowadzonej przez Docker. Ale długo trwa dyskusja na temat tego samego @ https://github.com/docker/compose/issues/374 stąd, gdy już zostanie zaimplementowana, funkcja depends_on może zostać użyta do zlecenia uruchomienia kontenera, ale w tej chwili będziesz musiał skorzystać z jednej z następujących opcji:

  1. make nginx retry until the php serwer już działa-wolałbym ten
  2. użyj obejścia volums_from, jak opisano powyżej - unikałbym tego, ze względu na wyciek objętości do niepotrzebnych pojemników.
 14
Author: Phani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-28 02:31:29

Można to rozwiązać za pomocą wspomnianej dyrektywy depends_on, ponieważ jest ona zaimplementowana teraz (2016):

version: '2'
  services:
    nginx:
      image: nginx
      ports:
        - "42080:80"
      volumes:
        - ./config/docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
      depends_on:
        - php

    php:
      build: config/docker/php
      ports:
        - "42022:22"
      volumes:
        - .:/var/www/html
      env_file: config/docker/php/.env.development
      depends_on:
        - mongo

    mongo:
      image: mongo
      ports:
        - "42017:27017"
      volumes:
        - /var/mongodata/wa-api:/data/db
      command: --smallfiles

Pomyślnie przetestowany z:

$ docker-compose version
docker-compose version 1.8.0, build f3628c7
Więcej szczegółów znajdziesz w dokumentacji .

Jest też bardzo ciekawy artykuł poświęcony temu tematowi: kontrolowanie kolejności uruchamiania w Compose

 11
Author: czerasz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-19 13:05:35

Możesz ustawić dyrektywy max_fails i fail_timeout nginx, aby wskazywać, że nginx powinien ponownie spróbować X liczby żądań połączenia do kontenera przed niepowodzeniem w niedostępności serwera.

Możesz dostroić te dwie liczby zgodnie z infrastrukturą i prędkością, z jaką zbliża się cała konfiguracja. Możesz przeczytać więcej szczegółów na temat sekcji kontroli zdrowia pod poniższym adresem URL: http://nginx.org/en/docs/http/load_balancing.html

Poniżej jest fragment http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server max_fails=number

Ustawia liczbę nieudanych prób komunikacji z serwer, który powinien mieć miejsce w czasie ustawionym przez fail_timeout parametr do uznania serwera za niedostępny również ustawiony przez parametr fail_timeout. Domyślnie liczba nieudanych próby są ustawione na 1. Wartość zerowa wyłącza księgowanie próby. Co jest uważane za nieudana próba jest definiowana przez proxy_next_upstream, fastcgi_next_upstream, uwsgi_next_upstream, dyrektywy scgi_next_upstream i memcached_next_upstream.

fail_timeout=time

Ustawia czas, w którym określona liczba nieudanych próby komunikowania się z serwerem powinny mieć na uwadze serwer niedostępny; a okres, w którym serwer będzie uważany za niedostępny. Domyślnie parametr jest ustawiony na 10 sekund.

Aby być precyzyjnym Twój zmodyfikowany plik konfiguracyjny nginx powinien wyglądać następująco (ten skrypt zakłada, że wszystkie kontenery są aktywne co najmniej o 25 Sekund, jeśli nie, zmień fail_timeout lub max_fails w poniższej sekcji): Uwaga: sam nie testowałem skryptu, więc możecie spróbować!

upstream phpupstream {
   waapi_php_1:9000 fail_timeout=5s max_fails=5;
}
server {
    listen  80;

    root /var/www/test;

    error_log /dev/stdout debug;
    access_log /dev/stdout;

    location / {
        # try to serve file directly, fallback to app.php
        try_files $uri /index.php$is_args$args;
    }

    location ~ ^/.+\.php(/|$) {
        # Referencing the php service host (Docker)
        fastcgi_pass phpupstream;

        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;

        # We must reference the document_root of the external server ourselves here.
        fastcgi_param SCRIPT_FILENAME /var/www/html/public$fastcgi_script_name;

        fastcgi_param HTTPS off;
    }
}

Również, zgodnie z poniższą notatką od docker (https://github.com/docker/compose/blob/master/docs/networking.md ), jest oczywiste, że logika retry kontrola stanu pozostałych kontenerów nie jest obowiązkiem Dockera, a kontenery powinny same przeprowadzić kontrolę stanu.

Aktualizacja kontenerów

Jeśli dokonasz zmiany konfiguracji usługi i uruchomisz docker-compose aby go zaktualizować, stary kontener zostanie usunięty, a nowy dołączy do sieci pod innym adresem IP, ale o tej samej nazwie. Uruchomione kontenery będą mogły wyszukać tę nazwę i połączyć się z nowy adres, ale stary adres przestanie działać.

Jeśli jakieś pojemniki mają połączenia otwarte do starego pojemnika, to będzie zamknięte. Do obowiązków kontenera należy wykrycie tego warunek, sprawdź jeszcze raz nazwę i połącz się ponownie.

 7
Author: Phani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-27 16:07:05

Uważam, że Nginx nie bierze w account Docker resolver( 127.0.0.11), więc proszę, Możesz spróbować dodać:

resolver 127.0.0.11
W Twoim pliku konfiguracyjnym nginx?
 4
Author: Thomas Decaux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-30 20:30:47

Miałem ten sam problem i go rozwiązałem. Proszę dodać następujący wiersz do docker-compose.sekcja yml nginx:

links:
  - php:waapi_php_1

Host w sekcji nginx Config fastcgi_pass powinien być połączony wewnątrz docker-compose.konfiguracja yml nginx.

 1
Author: st0at,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-10 15:39:52

Jeśli jesteś tak zagubiony za przeczytanie ostatniego komentarza. Osiągnąłem inne rozwiązanie.

Głównym problemem jest sposób, w jaki nazwałeś nazwy usług.

W tym przypadku, jeśli w docker-compose.yml usługa dla php nazywa się " api " lub coś w tym stylu, musisz upewnić się, że w pliku nginx.conf linia zaczynająca się od fastcgi_pass ma taką samą nazwę jak usługa php. i. E fastcgi_pass api:9000;

 1
Author: julian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-14 04:21:25

Mieć ten sam problem, dopóki nie było w docker-compose.YML zdefiniowano dwie sieci: backend i frontend. Podczas uruchamiania wszystkich kontenerów w tej samej domyślnej sieci Wszystko działa poprawnie.

 1
Author: smola,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-02 20:31:50

Z linkami wymuszana jest kolejność uruchamiania kontenera. Bez linków kontenery mogą zaczynać się w dowolnej kolejności (lub naprawdę wszystkie na raz).

Myślę, że stara konfiguracja mogła trafić w ten sam problem, jeśli kontener waapi_php_1 był powolny do uruchomienia.

Myślę, że aby to zadziałało, możesz utworzyć skrypt entrypoint nginx, który przepytuje i czeka na uruchomienie kontenera php.

Nie jestem pewien, czy nginx ma jakiś sposób na ponowne spróbowanie połączenia z upstream automatycznie, ale jeśli tak, to byłoby lepszym rozwiązaniem.
 0
Author: dnephin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-11 20:59:41

Musisz użyć czegoś takiego jak Docker-gen, aby dynamicznie aktualizować konfigurację nginx, gdy twój backend jest aktywny.

Zobacz:

Jeśli nie masz konta premium, możesz skorzystać z tej opcji. http://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstream )
 0
Author: Laurent B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-18 09:00:29

Być może najlepszym wyborem, aby uniknąć problemów z połączeniem kontenerów, są funkcje docker networking

Ale aby to zadziałało, docker tworzy wpisy w /etc / hosts dla każdego kontenera z przypisanych nazw do każdego kontenera.

Z docker-compose --x-networking-up jest czymś w rodzaju [docker_compose_folder]-[service] - [incremental_number]

Aby nie zależeć od nieoczekiwanych zmian w tych nazwach należy użyć parametru

Container_name

W Twoim docker-compose.yml w następujący sposób:

php:
      container_name: waapi_php_1
      build: config/docker/php
      ports:
        - "42022:22"
      volumes:
        - .:/var/www/html
      env_file: config/docker/php/.env.development

Upewnienie się, że jest to ta sama nazwa przypisana w pliku konfiguracyjnym dla tej usługi. Jestem pewien, że są lepsze sposoby, aby to zrobić, ale jest to dobre podejście do rozpoczęcia.

 0
Author: JorelC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-30 14:10:54

Dodaj sekcjęLinki do konfiguracji kontenera nginx.

Musisz uwidocznić php kontener do nginx kontenera.

nginx:
  image: nginx
  ports:
    - "42080:80"
  volumes:
    - ./config/docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
  links:
    - php:waapi_php_1
 -1
Author: nessuno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-10 20:54:19

To jest najlepszy sposób, jaki mogę wymyślić.

ADD root /

RUN cp /etc/hosts /etc/hosts.tmp && \
    echo -e "\
127.0.0.1 code_gogs_1 \n\
127.0.0.1 pm_zentao_1 \n\
127.0.0.1 ci_drone_1 \n\
    " >> /etc/hosts && \
    nginx -t && \
# mv: can't rename '/etc/hosts.tmp': Resource busy
# mv /etc/hosts.tmp /etc/hosts
    cat /etc/hosts.tmp > /etc/hosts && \
    rm /etc/hosts.tmp
 -1
Author: wener,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-23 08:20:18