2015-01-19 12 views
15

Ich habe zwei Docker-Container mit Nginx. container1 ist mit container2 verknüpft. Docker fügt dann einen Eintrag in /etc/hosts, die ich wie so in die nginx-Konfiguration eingetragen:nginx proxy_pass zu einem verknüpften Docker-Container

server { 
    location ~ ^/some_url/(.*)$ { 
     proxy_pass http://container1/$1; 
    } 
} 

I container1 von container2 kann ping, aber nginx kann es nicht lösen:

* 1 kein Resolver definiert container1

lösen Wie kann ich eine Anfrage an anothe proxy_pass r docker container?

+0

Can Sie teilen Ihre Hosts-Datei? Wie haben Sie die beiden Container miteinander verbunden? (Welchen Namen hat der Link?) Außerdem: Wenn Sie einen der Container 'rm'dten und später neu starten, hat sich die IP geändert (Hosts werden nicht aktualisiert) – wpp

+0

Ich habe gerade die Konfiguration versucht, die der Ihren ähnlich ist, und es hat funktioniert gut für mich mit 'nginx: 1.7.9'. Kannst du bash bei * container2 * und curl * container1 * starten? Sie verwenden nicht die gleichen Konfigurationen Container1 und 2, oder? –

+0

@MykolaGurov Ich kann ping und curl und was nicht container1 von container2. Mein Problem ist, dass nginx nicht in der Lage ist, es zu lösen. Ich verwende nicht die gleichen Konfigurationen, nein (wenn Sie sich auf nginx config beziehen). –

Antwort

5

Sie einen Blick auf diese Antwort über die Verwendung von/etc/hosts als Resolver nehmen sollte: Using /etc/hosts as resolver for url rewriting

Grundsätzlich Ihre dns oder Resolver/etc nicht/hosts Namen bei einer Referenz zu lösen, aber man kann Umgehen Sie dies, indem Sie dnsmasq installieren und 127.0.0.1 als Resolver verwenden. Sie können 127.0.0.1 als Resolver direkt in Ihrem nginx Konfiguration hinzuzufügen:

server { 
    location ~ ^/some_url/(.*)$ { 
     resolver 127.0.0.1; 
     proxy_pass http://container1/$1; 
    } 
} 
+0

Das habe ich eigentlich schon probiert, aber da dnsmasq nicht ohne Fehler gestartet hat, habe ich aufgegeben. Vielleicht zu schnell. Werde es noch einmal versuchen und dich wissen lassen. –

+0

Ich versuchte es erneut, fügte einfach dnsmasq zu meinem Einstiegspunkt hinzu. Wenn Sie Ihren Container innerhalb einer VM ausführen, stellen Sie sicher, dass Sie dnsmasq als root ausführen. Andernfalls funktioniert es nicht. –

25

einen vorgeschalteten Block anstelle des Containernamen direkt

upstream backend { 
    server container1; 
} 
server { 
    location ~ ^/some_url/(.*)$ { 
     proxy_pass http://backend/$1; 
    } 
} 

Diese normale Namensauflösung eine Möglichkeit, die Bereitstellung auftreten lassen sollte Docker-Links mit nginx einfach zu verwenden.

+0

Beste Antwort, wenn Sie keine externen Abhängigkeiten haben wollen. –

+3

Das Problem, das ich mit dieser Lösung hatte, ist, dass "container1" gestartet werden muss, bevor Sie Ihren Nginx-Container starten können, sonst wird es nicht gestartet –

+1

Schreiben Sie ein Skript, das wartet, bis das Back-End aktiv ist. So etwas sollte funktionieren: "bash -c" while! Curl -s container1: 8080>/dev/null; do echo wartet auf container1; sleep 3; done; start_nginx.sh "' wobei 'start_nginx.sh' eigentlich das startet Nginx-Dienst. – threejeez

14

Sie eingebettet Docker DNS-Dienst verwenden können, wenn aktiviert, überprüfen Sie die Behälter Resolver:

cat /etc/resolv.conf 

werden sollten:

nameserver 127.0.0.11 

Verwenden Sie diese IP als Resolver:

server { 
    location ~ ^/some_url/(.*)$ { 
     resolver 127.0.0.11; 
     proxy_pass http://container1/$1; 
    } } 
+1

Ich frage mich, warum niemand das aufgewertet hat. Gibt es einen Vorbehalt? – activatedgeek

+1

Hmm, vielleicht könnte die hartcodierte IP 127.0.0.11 einige Probleme bringen –

+0

Ich denke ja. Der ideale Weg wäre, die 'etc/resolv.conf' für die Nameserver-IP zu parsen. – activatedgeek

Verwandte Themen