2016-03-02 13 views
23

Ich versuche, veraltete Docker Links in meiner Konfiguration loszuwerden. Was übrig bleibt, ist diese Bad Gateway Nginx Reverse Proxy-Fehler loszuwerden, wenn ich einen Container neu erstellt habe.Docker Netzwerk Nginx Resolver

Hinweis: Ich verwende Docker-Netzwerke im Bridge-Modus. (docker network create nettest)

Ich verwende die folgende Konfiguration Schnipsel innen nginx:

location/{ 
     resolver 127.0.0.1 valid=30s; 
     set $backend "http://confluence:8090"; 
     proxy_pass $backend; 
  1. ich einen Container mit dem Hostnamen confluence auf meinem Docker Netzwerk mit dem Namen nettest gestartet.
  2. Dann startete ich den Nginx-Container im Netzwerk nettest.
  3. I confluence aus dem Inneren des nginx Behälter
  4. confluence innerhalb der /etc/hosts des ping aufgeführt ist nginx Containerdatei log
  5. nginx sagt `() fehlgeschlagen senden (111: Connection refused), während die Lösung, Resolver: 127.0.0.1: 53``
  6. ich versuchte, das docker Netzwerk Standard-dNS-Resolver 127.0.0.11 von /etc/resol.conf
  7. nginx log sagt confluence could not be resolved (3: Host not found)

Jeder weiß, wie man den Nginx-Resolver mit Docker Networks konfiguriert oder wie man Nginx dazu bringt, den Docker-Netzwerk-Hostnamen korrekt aufzulösen?

+0

mag dies nicht aussehen wird, ohne ein Netzwerk-Treiber in irgendeiner Weise gelöst werden. Die Ursache ist Nginx, da sie eine IP für einen Resolver benötigen und diese nicht automatisch mit einem von Docker verwalteten DNS-Resolver verknüpft werden kann. – blacklabelops

Antwort

43

Als Erstes sollten Sie den Docker Embedded DNS-Server unter 127.0.0.11 verwenden.

Ihr Problem könnte durch 1 der folgenden Ursachen haben:

  1. nginx versucht IPv6 (AAAA-Record) für die DNS-Abfragen zu verwenden.

    Siehe https://stackoverflow.com/a/35516395/1529493 für die Lösung.

    Im Grunde so etwas wie:

    http { 
        resolver 127.0.0.11 ipv6=off; 
    } 
    

    Dies ist wahrscheinlich kein Problem mehr mit Docker 1.11:

    Fix nicht vorwärts Docker Domäne IPv6 Anfragen an externem Server (#21396)

  2. Achten Sie darauf, dass Sie dienicht versehentlich überschreibenKonfigurationsanweisung. In meinem Fall hatte ich in der server Block resolver 8.8.8.8 8.8.4.4; von Mozilla's SSL Configuration Generator, die resolver 127.0.0.11; im http Block überschreiben. Das hat mich lange am Kopf kratzen lassen ...


Siehe https://trac.nginx.org/nginx/ticket/658#comment:5 für wie hartzucodieren die IP-Adresse des DNS-Servers zu vermeiden.

erstellen Grundsätzlich ein Startskript für Ihren Docker Behälter, z.B .:

#!/bin/bash 

export NAMESERVERS=$(cat /etc/resolv.conf | grep "nameserver" | awk '{print $2}' | tr '\n' ' ') 

envsubst '$NAMESERVERS' </etc/nginx/nginx.conf.tmpl> /etc/nginx/nginx.conf 

exec nginx -g "daemon off;" 

Angenommen, Sie haben zum Beispiel

http { 
    # ... 

    resolver $NAMESERVERS; 

    include /etc/nginx/conf.d/*.conf; 
} 

in /etc/nginx/nginx.conf.tmpl.

Persönlich verwende ich confd, was die Dinge viel überschaubarer macht.

+0

Danke, funktioniert perfekt! – blacklabelops

+0

danke das hat mir auch geholfen – Plato

+4

Das Festcodieren der IP Adresse des Docker DNS Resolvers ('127.0.0.11') sollte kein Problem sein, da es sich nicht ändert. Beachten Sie, dass der Docker DNS-Resolver nur mit benutzerdefinierten Netzwerken verfügbar ist ('docker network create ...'). Referenz: https://github.com/docker/docker/issues/22262 –

0

Sie benötigen einen lokalen DNS-Server wie dnsmasq zum Auflösen mit 127.0.0.1. Versuchen Sie es mit apk add --update dnsmasq zu installieren und richten Sie es ein, wenn Sie eine alpine (nginx:alpine) Variante verwenden.

0

Vielleicht sollten Sie Ihren Containers überprüfen /etc/resolv.conf

Es zeigt korrekte DNS-Konfiguration des Containers und dann diese IP-DNS-Server für Resolver verwenden.

127.0.0.11 nicht funktioniert nicht in Rancher

+0

Bitte werfen Sie einen Blick auf die angenommene Antwort. Da es eine akzeptierte Antwort gibt, bedeutet dies, dass das Problem von OP bereits gelöst wurde und dies der einzige Zweck einer Antwort ist. Das macht deine ziemlich überflüssig. –

+0

Oh sorry, nur für zusätzliche Empfehlung. Weil mein Freund sich beschwert hat, hat es nicht funktioniert, vielleicht haben wir die Antworten sorgfältiger gelesen. – exiaohao

+0

Ich weiß, dass Sie neu bei Stack Overflow sind und zuerst müssen Sie sich an die Regeln hier gewöhnen. Was beinhaltet, dass die Antwort-Shell nur das Problem von OP löst. Also nichts als die einzige und vollständige Antwort. Also keine zusätzliche Frage, Anregung, Hinweis oder was auch immer. Willkommen bei Stack Overflow. :-) –