2016-03-28 15 views
2

Ich habe eine CoreOS-Instanz, die einen Docker-Container ausgeführt, der dnsmasq ausgeführt wird. Derzeit die dnsmasq Konfiguration nur gesetzt, um alle Abfragen zu protokollieren und im Debug-Modus zu laufen, so sollte es nur das Zwischenspeichern tun.Odd Verhalten von Dnsmasq über Docker Container

Wenn ich versuche, dies mit aus einem anderen Behälter zu verwenden, nslookup oder einfach ping google.com läuft ich wieder Bad hostname: google.com und ich kann in der Log-Abfrage sehen, die Anfragen werden in mehrfach kommen, als wenn erneut versucht wird.

Wenn ich versuche, die gleichen Befehle vom Host-Rechner mit CoreOS auszuführen, löst alles kein Problem im einzelnen Versuch.

Mein Plan ist es, die dnsmasq auf jedem CoreOS-Rechner im Cluster laufen zu lassen, und es von confd gesichert, so dass alle Dienste entsprechende Gegenstücke auflösen können.

Ich benutze Alpine Linux für meine Basisbilder, aber ich habe versucht, diese Befehle in einem Ubuntu und einem Debian-Image mit dem gleichen Ergebnis auszuführen.

+0

"so dass alle Dienste geeignete Gegenstücke auflösen können"; Beachten Sie, dass Sie mit docker 1.9 andere Container im selben Netzwerk über ihren Namen direkt auflösen können. (z. B. "ping anderen Container"). Docker 1.10 bietet dafür zusätzliche Verbesserungen und ermöglicht es Ihnen, "containerspezifische Aliase" und "netzwerkspezifische Aliase" für Container festzulegen. – thaJeztah

+0

Ja, mir ist klar, dass es Teil des CoreOS-Clusters sein wird. Daher weiß ich nicht, wie Docker das über mehrere Hosts kommunizieren wird. Wir planen auch, CoreOS + Flannel auszuführen, so dass jeder Container eine routbare IP-Adresse erhält. Ich denke, dass dieser Mechanismus außerhalb von Docker liegt. –

+0

Also, ich komme näher an die Antwort. Ich habe "nslookup" durch "strace" in einem der Container gelaufen und eine Zeile war besonders interessant - "Antwort von unerwarteter Quelle: 172.17.42.1 # 53, erwartet 10.137.64.102 # 53" Grundsätzlich ist die '10.' Adresse wird an den Container übergeben, da es "-dns" ist. Aber die Antworten kommen vom "docker" -Netzwerkadapter des Hosts, so dass er verworfen und erneut versucht wird. Wenn ich den Resolver als IP-Adresse für das interne Docker-Netzwerk einstelle, funktioniert es einwandfrei. –

Antwort

0

Das Richtige zu tun war im folgenden Thread (Setting Up Docker Dnsmasq)

, wenn der Port aussetzt es ausdrücklich zu einer IP-Adresse des Hosts (intern, in unserem Fall) gebunden werden soll.

Invocation des Behälters sieht ungefähr so ​​aus:

source /etc/environment 
docker run -d --cap-add NET_ADMIN \ 
    -p "$COREOS_PRIVATE_IPV4:53:53" \ 
    -p "$COREOS_PRIVATE_IPV4:53:53/udp" \ 
    -e COREOS_PRIVATE_IPV4="$COREOS_PRIVATE_IPV4"\ 
    someorg/dnsmasq 

Dann werden alle Container, die mit --dns "$COREOS_PRIVATE_IPV4" lief werden erhalten korrekt über den maschinennahen dnsmasq zu lösen.