Niedawno rozpocząłem migrację do funkcji sieciowych Docker 1.9 i Docker-Compose 1.5, aby zastąpić użycie 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. Niedawno jednak, kiedy uruchamiam docker-compose --x-networking up
moje kontenery php-fpm, mongo i nginx, jednak nginx kończy pracę natychmiast po[emerg] 1#1: host not found in upstream "waapi_php_1" in /etc/nginx/conf.d/default.conf:16
Jeśli jednak uruchomię ponownie polecenie docker-compose, gdy kontenery php i mongo są uruchomione (wyjście z nginx), nginx uruchamia się i od tego momentu działa dobrze.
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;
}
}
Jak sprawić, by nginx działał tylko z jednym wywołaniem docker-compose?
źródło
Odpowiedzi:
Istnieje możliwość użycia „volume_from” jako obejścia do czasu wprowadzenia funkcji depend_on (omówionej poniżej). Wszystko, co musisz zrobić, to zmienić plik docker-compose, jak poniżej:
Jednym dużym zastrzeżeniem w powyższym podejściu jest to, że woluminy php są narażone na działanie nginx, co nie jest pożądane. Ale w tej chwili jest to jedno obejście specyficzne dla platformy Docker, którego można użyć.
Funkcja depends_on To prawdopodobnie byłaby futurystyczna odpowiedź. Ponieważ funkcja nie została jeszcze zaimplementowana w Dockerze (od 1.9)
Istnieje propozycja wprowadzenia „depends_on” w nowej funkcji sieciowej wprowadzonej przez Docker. Ale trwa długo trwająca debata na temat tego samego @ https://github.com/docker/compose/issues/374.W związku z tym po wdrożeniu funkcja depends_on może zostać użyta do zamówienia uruchomienia kontenera, ale w tej chwili musiałbyś uciec się do jednego z następujących:
źródło
links:
który zawarłem w nginx, używał tej samej nazwy, co sama usługa, jak- my-service:my-service
w tym przykładzie- mongo:mongo
.Można to rozwiązać za pomocą wspomnianej
depends_on
dyrektywy, ponieważ została ona wdrożona teraz (2016):Pomyślnie przetestowano z:
Więcej szczegółów znajdziesz w dokumentacji .
Jest też bardzo ciekawy artykuł poświęcony temu tematowi: Kontrolowanie kolejności uruchamiania w Compose
źródło
Możesz ustawić dyrektywy max_fails i fail_timeout nginx, aby wskazać, że nginx powinien ponawiać x liczbę żądań połączenia do kontenera, zanim zakończy się niepowodzeniem w przypadku niedostępności serwera nadrzędnego.
Możesz dostroić te dwie liczby zgodnie ze swoją infrastrukturą i szybkością, z jaką nadchodzi cała konfiguracja. Więcej informacji na temat sekcji dotyczącej kontroli stanu można znaleźć pod poniższym adresem URL: http://nginx.org/en/docs/http/load_balancing.html
Poniżej znajduje się fragment z http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server
max_fails=number
fail_timeout=time
Aby być precyzyjnym, twój zmodyfikowany plik konfiguracyjny nginx powinien wyglądać następująco (ten skrypt zakłada, że wszystkie kontenery są wydłużone o co najmniej 25 sekund, jeśli nie, zmień fail_timeout lub max_fails w poniższej sekcji upstream): Uwaga: nie samodzielnie przetestuj skrypt, więc możesz spróbować!
Ponadto, zgodnie z następującą uwagą od docker ( https://github.com/docker/docker.github.io/blob/master/compose/networking.md#update-containers ), jest oczywiste, że logika ponawiania sprawdzania Docker nie ponosi odpowiedzialności za stan innych kontenerów i raczej kontenery powinny samodzielnie przeprowadzić kontrolę stanu.
źródło
Uważam, że Nginx nie bierze pod uwagę programu rozpoznawania nazw Docker (127.0.0.11), więc proszę, czy możesz spróbować dodać:
w twoim pliku konfiguracyjnym nginx?
źródło
resolver 127.0.0.11 8.8.8.8;
Jeśli jesteś tak zagubiony, przeczytaj ostatni komentarz. Osiągnąłem inne rozwiązanie.
Głównym problemem jest sposób nadawania nazw usługom.
W tym przypadku, jeśli twoja
docker-compose.yml
usługa dla php nazywa się "api" lub coś w tym stylu, musisz upewnić się, że w plikunginx.conf
wiersz zaczynający się odfastcgi_pass
ma taką samą nazwę jak usługa php. to znaczyfastcgi_pass api:9000;
źródło
Miałem ten sam problem, ponieważ w moim zdefiniowano dwie sieci
docker-compose.yml
: jeden backend i jeden frontend.Kiedy zmieniłem to, aby uruchamiać kontenery w tej samej domyślnej sieci, wszystko zaczęło działać dobrze.
źródło
Miałem ten sam problem i rozwiązałem go. Dodaj następujący wiersz do sekcji docker-compose.yml nginx:
Host w sekcji fastcgi_pass konfiguracji nginx powinien być połączony w konfiguracji docker-compose.yml nginx.
źródło
Warto wspomnieć o dwóch rzeczach:
links
do dodawania hostów resolMój przykład:
Jeśli nie określisz specjalnego mostu sieciowego, wszystkie będą używać tego samego domyślnego.
źródło
Na pierwszy rzut oka przegapiłem, że moja usługa „sieciowa” tak naprawdę się nie uruchomiła, dlatego nginx nie mógł znaleźć żadnego hosta
źródło
W przypadku linków wymuszana jest kolejność uruchamiania kontenera. Bez linków kontenery mogą uruchamiać się w dowolnej kolejności (lub naprawdę wszystkie na raz).
Myślę, że stara konfiguracja mogła napotkać ten sam problem, jeśli plik
waapi_php_1
kontener uruchamiał się wolno.Myślę, że aby to działało, możesz stworzyć skrypt punktu wejścia nginx, który sonduje i czeka, aż kontener php zostanie uruchomiony i gotowy.
Nie jestem pewien, czy nginx ma jakikolwiek sposób na ponowienie próby połączenia z nadrzędnym automatycznie, ale jeśli tak, to byłaby lepsza opcja.
źródło
Musisz użyć czegoś takiego jak docker-gen, aby dynamicznie aktualizować konfigurację nginx, gdy twój backend jest uruchomiony.
Widzieć:
Uważam, że Nginx + (wersja premium) zawiera również parametr rozwiązania ( http://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstream )
źródło
Być może najlepszym rozwiązaniem pozwalającym uniknąć problemów z łączeniem kontenerów jest sieć Dockera funkcje
Ale żeby to zadziałało, docker tworzy wpisy w / etc / hosts dla każdego kontenera z przypisanych nazw do każdego kontenera.
Aby nie polegać na nieoczekiwanych zmianach tych nazw, należy użyć parametru
w twoim docker-compose.yml w następujący sposób:
Upewnij się, że jest to ta sama nazwa przypisana w pliku konfiguracyjnym dla tej usługi. Jestem prawie pewien, że istnieją lepsze sposoby, aby to zrobić, ale na początek jest to dobre podejście.
źródło
Moje obejście (po wielu próbach i błędach):
Aby obejść ten problem, musiałem uzyskać pełną nazwę kontenera Docker `` upstream '', znalezioną przez uruchomienie
docker network inspect my-special-docker-network
i pobranie pełnejname
właściwości kontenera wyższego rzędu:Następnie użyłem tego w
my-network.local.conf
pliku NGINX wlocation
blokuproxy_pass
właściwości: (Zwróć uwagę na dodanie identyfikatora GUID do nazwy kontenera):W przeciwieństwie do poprzednio działającego, ale teraz zepsutego:
Najbardziej prawdopodobną przyczyną jest niedawna zmiana w Docker Compose w ich domyślnym schemacie nazewnictwa kontenerów, jak wymieniono tutaj .
Wydaje się, że dzieje się tak w przypadku mnie i mojego zespołu w pracy z najnowszymi wersjami obrazu platformy Docker
nginx
:źródło
(nowy w nginx) W moim przypadku była to zła nazwa folderu
W przypadku config
upewnij się, że folder aplikacji znajduje się w folderze ex2:
ex2 / app / ...
źródło
ten błąd pojawił się, ponieważ mój
php-fpm
obraz jest włączonycron
i nie mam pojęcia, dlaczegoźródło
Mój problem polegał na tym, że zapomniałem podać alias sieciowy w docker-compose.yml w php-fpm
To działa dobrze!
źródło
Dodaj sekcję linków do konfiguracji kontenera nginx.
Musisz sprawić, by
php
kontener był widoczny dlanginx
kontenera.źródło
link
wycofania. Czy coś mi brakuje?docker-compose --x-networking up
z linkami zdefiniowanymi w moimdocker-compose.yml
, otrzymuję wyraźne ostrzeżenie:WARNING: "nginx" defines links, which are not compatible with Docker networking and will be ignored. Future versions of Docker will not support links - you should remove them for forwards-compatibility.
docker-compose.yml
plik znajduje się w folderze o nazwiewaapi
?waapi