2014-04-11 11 views
8

Ich versuche, einen dinner-dnsmasq-Container einzurichten, damit ich alle Docker-Container nach den Domänennamen suchen kann, anstatt fest codierte IPs zu haben (wenn sie sich auf demselben Host befinden). Dies behebt ein Problem mit der Tatsache, dass one cannot alter the /etc/hosts file in docker Container, und dies ermöglicht es mir, alle meine Container auf einfache Weise zu aktualisieren, durch Ändern einer einzigen Datei, die der Dnsmasq-Container verweist.Einrichten von Docker Dnsmasq

Es sieht so aus als hätte jemand die harte Arbeit für mich erledigt und eine dnsmasq container erstellt. Leider "funktioniert" das nicht für mich. Ich einen Bash-Skript geschrieben, den Behälter zu beginnen wie folgt:

name="dnsmasq_" 
timenow=$(date +%s) 
name="$name$timenow" 

sudo docker run \ 
-v="$(pwd)/dnsmasq.hosts:/dnsmasq.hosts" \ 
--name=$name \ 
-p='127.0.0.1:53:5353/udp' \ 
-d sroegner/dnsmasq 

Davor läuft, habe ich das dnsmasq.hosts Verzeichnis und eingefügt, um eine einzelne Datei in ihrem hosts.txt mit den folgenden Inhalten genannt:

192.168.1.3 database.mydomain.com 

Leider wenn ich versuche, diese Domäne ping aus:

  • der Host
  • der dnsmasq Behälter
  • ein anderer Behälter auf demselben Host

Ich erhalte immer die ping: unknown host Fehlermeldung.

Ich versuchte, den dnsmasq Container ohne Daemon-Modus starten, damit ich seine Ausgabe debuggen konnte, was unten ist:

dnsmasq: started, version 2.59 cachesize 150 
dnsmasq: compile time options: IPv6 GNU-getopt DBus i18n DHCP TFTP conntrack IDN 
dnsmasq: reading /etc/resolv.dnsmasq.conf 
dnsmasq: using nameserver 8.8.8.8#53 
dnsmasq: read /etc/hosts - 7 addresses 
dnsmasq: read /dnsmasq.hosts//hosts.txt - 1 addresses 

ich, dass ich nicht die richtig -p Parameter angegeben bin zu raten, wenn der Behälter zu starten. Kann mir jemand sagen, was es für andere Docker-Container sein soll, nach dem DNS zu suchen, oder ob das, was ich versuche, tatsächlich unmöglich ist?

Antwort

9

Der Build-Skript für den Docker dnsmasq Service benötigt, um bindet an Ihren Server des öffentlichen IP-, die in diesem Fall ist 192.168.1.12 auf meiner eth0 Schnittstelle

#!/bin/bash 

NIC="eth0" 

name="dnsmasq_" 
timenow=$(date +%s) 
name="$name$timenow" 

MY_IP=$(ifconfig $NIC | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}') 


sudo docker run \ 
-v="$(pwd)/dnsmasq.hosts:/dnsmasq.hosts" \ 
--name=$name \ 
-p=$MY_IP:53:5353/udp \ 
-d sroegner/dnsmasq 

Auf dem geändert werden host (in diesem Fall ubuntu 12), müssen Sie die Datei resolv.conf oder/etc/network/interfaces aktualisieren, damit Sie Ihre öffentliche IP-Adresse (Gerät eth0 oder eth1) als Nameserver registriert haben.

enter image description here

Sie können einen sekundären Name-Server setzen Google zu sein, wenn der Behälter nicht ausgeführt wird, indem Sie die Zeile zu ändern sein dns-nameservers xxx.xxx.xxx.xxx 8.8.8.8 Z.B. Es gibt kein Komma oder eine andere Zeile.

Anschließend müssen Sie Ihren Netzwerkdienst sudo /etc/init.d/networking restart neu starten, wenn Sie die Datei/etc/network/interfaces aktualisiert haben, damit die Datei /etc/resolve.conf, die während des Builds in den Container kopiert wird, automatisch aktualisiert wird.

Jetzt neu starten alle Ihre Container

  • sudo docker stop $CONTAINER_ID
  • sudo docker start $CONTAINER_ID

Dies bewirkt, dass ihre /etc/resolv.conf Dateien aktualisieren, damit sie die neuen Name-Server-Einstellungen zeigen.

DNS-Lookups in all Ihren Docker-Containern (die Sie seit dem Vornehmen der Änderungen erstellt haben) sollten jetzt mit Ihrem dnsmasq-Container funktionieren!

Als Randbemerkung, bedeutet dies, dass Docker Behälter auf anderen Hosts auch die Vorteile Ihres dnsmasq-Dienst auf diesem Host als gesetzt, so lange dauern kann ihre Host-Name-Server-Einstellungen mit diesem öffentlichen IP des Servers.