Ich habe kürzlich mit der Migration auf die Netzwerkfunktionen von Docker 1.9 und Docker-Compose 1.5 begonnen, um die Verwendung von Links zu ersetzen.
Bisher gab es bei Links keine Probleme mit der Verbindung von nginx zu meinem php5-fpm fastcgi-Server, der sich über Docker-Compose auf einem anderen Server in einer Gruppe befindet. Neu, wenn ich docker-compose --x-networking up
meine PHP-Fpm laufen lasse, starten Mongo- und Nginx-Container, aber Nginx wird sofort mit beendet[emerg] 1#1: host not found in upstream "waapi_php_1" in /etc/nginx/conf.d/default.conf:16
Wenn ich jedoch den Docker-Compose-Befehl erneut ausführe, während die PHP- und Mongo-Container ausgeführt werden (Nginx beendet), wird Nginx gestartet und funktioniert von da an einwandfrei.
Das ist meine docker-compose.yml
Datei:
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
Dies ist meine default.conf
für 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;
}
}
Wie kann ich Nginx dazu bringen, mit nur einem einzigen Docker-Compose-Aufruf zu arbeiten?
quelle
Antworten:
Es besteht die Möglichkeit, "volume_from" als Problemumgehung zu verwenden, bis die Funktion "abhängig_on" (siehe unten) eingeführt wird. Alles, was Sie tun müssen, ist, Ihre Docker-Compose-Datei wie folgt zu ändern:
Eine große Einschränkung bei dem obigen Ansatz besteht darin, dass die PHP-Volumina Nginx ausgesetzt sind, was nicht erwünscht ist. Im Moment ist dies jedoch eine Docker-spezifische Problemumgehung, die verwendet werden könnte.
abhängige_auf Funktion Dies wäre wahrscheinlich eine futuristische Antwort. Da die Funktionalität in Docker noch nicht implementiert ist (ab 1.9)
Es gibt einen Vorschlag, "abhängige_on" in die neue Netzwerkfunktion von Docker einzuführen. Aber es gibt eine langen laufende Debatte über die gleichen @ https://github.com/docker/compose/issues/374 daher , sobald sie umgesetzt werden, könnte das Merkmal depends_on verwendet werden , um die Behälter Inbetriebnahme zu bestellen, aber bei der Moment müssten Sie auf eines der folgenden zurückgreifen:
quelle
links:
in nginx enthaltenen Elemente denselben Namen wie der Dienst selbst- my-service:my-service
oder in diesem Beispiel verwenden- mongo:mongo
.Dies kann mit der genannten
depends_on
Richtlinie gelöst werden, da sie jetzt (2016) implementiert ist:Erfolgreich getestet mit:
Weitere Details finden Sie in der Dokumentation .
Es gibt auch einen sehr interessanten Artikel zu diesem Thema: Steuern der Startreihenfolge in Compose
quelle
Sie können die Direktiven max_fails und fail_timeout von nginx festlegen, um anzugeben, dass nginx die x-Anzahl von Verbindungsanforderungen an den Container wiederholen soll, bevor ein Fehler auf der Nichtverfügbarkeit des Upstream-Servers auftritt.
Sie können diese beiden Zahlen entsprechend Ihrer Infrastruktur und Geschwindigkeit einstellen, mit der das gesamte Setup ausgeführt wird. Weitere Informationen zum Abschnitt " Integritätsprüfungen" finden Sie unter der folgenden URL: http://nginx.org/en/docs/http/load_balancing.html
Es folgt der Auszug aus http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server
max_fails=number
fail_timeout=time
Um genau zu sein, sollte Ihre geänderte Nginx-Konfigurationsdatei wie folgt lauten (dieses Skript geht davon aus, dass alle Container mindestens 25 Sekunden in Betrieb sind. Wenn nicht, ändern Sie bitte das Fail_timeout oder max_fails im folgenden Upstream-Abschnitt): Hinweis: Ich habe es nicht getan Testen Sie das Skript selbst, damit Sie es ausprobieren können!
Gemäß dem folgenden Hinweis von Docker ( https://github.com/docker/docker.github.io/blob/master/compose/networking.md#update-containers ) ist es offensichtlich, dass die Wiederholungslogik für die Überprüfung Die Gesundheit der anderen Container liegt nicht in der Verantwortung des Dockers, sondern die Container sollten den Gesundheitscheck selbst durchführen.
quelle
Ich glaube, Nginx berücksichtigt den Docker-Resolver (127.0.0.11) nicht. Können Sie also bitte hinzufügen:
in Ihrer Nginx-Konfigurationsdatei?
quelle
resolver 127.0.0.11 8.8.8.8;
Wenn Sie so verloren sind, lesen Sie den letzten Kommentar. Ich habe eine andere Lösung erreicht.
Das Hauptproblem ist die Art und Weise, wie Sie die Dienstnamen benannt haben.
In diesem Fall
docker-compose.yml
müssen Sie sicherstellen, dass in der Dateinginx.conf
die Zeile, die mit beginntfastcgi_pass
, denselben Namen wie der PHP-Dienst hat , wenn in Ihrem Fall der Dienst für PHP "API" oder ähnliches heißt . dhfastcgi_pass api:9000;
quelle
Hatte das gleiche Problem und löste es. Bitte fügen Sie die folgende Zeile zum Abschnitt docker-compose.yml nginx hinzu:
Der Host im Abschnitt nginx config fastcgi_pass sollte in der Konfiguration docker-compose.yml nginx verknüpft sein.
quelle
Ich hatte das gleiche Problem, weil in meinem Netzwerk zwei Netzwerke definiert waren
docker-compose.yml
: ein Backend und ein Frontend.Als ich das änderte, um Container im selben Standardnetzwerk auszuführen, funktionierte alles einwandfrei.
quelle
Zwei erwähnenswerte Dinge:
links
zum Hinzufügen von Hosts ResolMein Beispiel:
Wenn Sie keine spezielle Netzwerkbrücke angeben, verwenden alle dieselbe Standardbrücke.
quelle
Auf den ersten Blick habe ich übersehen, dass mein "Web" -Dienst nicht gestartet wurde. Deshalb konnte nginx keinen Host finden
quelle
Bei Links wird die Reihenfolge des Container-Starts erzwungen. Ohne Links können die Container in beliebiger Reihenfolge (oder wirklich alle auf einmal) starten.
Ich denke, das alte Setup hätte das gleiche Problem haben können, wenn der
waapi_php_1
Container nur langsam gestartet worden wäre.Ich denke, um es zum Laufen zu bringen, könnten Sie ein Nginx-Einstiegspunkt-Skript erstellen, das abfragt und darauf wartet, dass der PHP-Container gestartet und bereit ist.
Ich bin mir nicht sicher, ob nginx eine Möglichkeit hat, die Verbindung zum Upstream automatisch erneut zu versuchen, aber wenn dies der Fall ist, wäre dies eine bessere Option.
quelle
Sie müssen so etwas wie Docker-Gen verwenden, um die Nginx-Konfiguration dynamisch zu aktualisieren, wenn Ihr Backend aktiv ist.
Sehen:
Ich glaube, Nginx + (Premium-Version) enthält auch einen Auflösungsparameter ( http://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstream ).
quelle
Vielleicht ist die beste Wahl Behälter Probleme zu vermeiden Verknüpfung sind die Docker Networking - Funktionen
Damit dies funktioniert, erstellt Docker Einträge in den Dateien / etc / hosts für jeden Container aus den zugewiesenen Namen für jeden Container.
Um nicht von unerwarteten Änderungen dieser Namen abhängig zu sein, sollten Sie den Parameter verwenden
in Ihrer docker-compose.yml wie folgt:
Stellen Sie sicher, dass es sich um denselben Namen handelt, der in Ihrer Konfigurationsdatei für diesen Dienst zugewiesen ist. Ich bin mir ziemlich sicher, dass es bessere Möglichkeiten gibt, dies zu tun, aber es ist ein guter Ansatz, um anzufangen.
quelle
Meine Problemumgehung (nach langem Ausprobieren):
Um dieses Problem zu umgehen, musste ich den vollständigen Namen des 'Upstream'-Docker-Containers abrufen, der durch Ausführen
docker network inspect my-special-docker-network
und Abrufen der vollständigenname
Eigenschaft des Upstream-Containers als solcher ermittelt wurde:Verwenden Sie dies dann in der NGINX-
my-network.local.conf
Datei imlocation
Block derproxy_pass
Eigenschaft: (Beachten Sie das Hinzufügen der GUID zum Containernamen):Im Gegensatz zu den bisher funktionierenden, aber jetzt kaputten:
Die wahrscheinlichste Ursache ist eine kürzlich vorgenommene Änderung von Docker Compose im Standard-Benennungsschema für Container, wie hier aufgeführt .
Dies scheint für mich und mein Team bei der Arbeit mit den neuesten Versionen des Docker-
nginx
Images zu geschehen :quelle
(neu bei nginx) In meinem Fall war es ein falscher Ordnername
Für die Konfiguration
Stellen Sie sicher, dass sich der App-Ordner im ex2-Ordner befindet:
ex2 / app / ...
quelle
Dieser Fehler erschien mir, weil mein
php-fpm
Bild aktiviertcron
war und ich keine Ahnung habe, warumquelle
Fügen Sie den Linkabschnitt zu Ihrer Nginx-Containerkonfiguration hinzu.
Sie müssen den
php
Container für dennginx
Container sichtbar machen .quelle
link
es veraltet ist. Vermisse ich etwasdocker-compose --x-networking up
mit in meinem definierten Links laufedocker-compose.yml
, erhalte ich folgende eindeutige Warnung: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
Datei in einem Ordner mit dem Namenwaapi
?waapi