it-swarm.com.de

docker.io DNS funktioniert nicht, es wird versucht 8.8.8.8 zu verwenden

Ich habe eine neue Ubuntu 14.04-Installation und möchte Docker verwenden, um meine alten Sachen auszuführen, die 12.04 benötigen. DNS in Docker funktioniert nicht.

Die resolv.conf meines Laptops sieht so aus:

nameserver 127.0.0.1

Was bei Docker anscheinend nicht funktioniert. Es wird daher versucht, die Nameserver auf 8.8.8.8 und 8.8.4.4 zu setzen; wenn ich es tue

$ Sudo docker run -i -t ubuntu /bin/bash

Es sagt:

WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it. Using default external servers : [8.8.8.8 8.8.4.4]

Und tatsächlich sieht die Datei resolv.conf in der Docker-Instanz folgendermaßen aus:

nameserver 8.8.8.8
nameserver 8.8.4.4

Ich kann beide von der Docker-Instanz aus erfolgreich pingen. Es ist jedoch kein DNS vorhanden (z. B. schlägt ping google.com fehl).

ifconfig-Ausgabe in Docker:

eth0      Link encap:Ethernet  HWaddr aa:e9:9f:83:9d:92  
          inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::a8e9:9fff:fe83:9d92/64 Scope:Link
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:648 (648.0 B)  TX bytes:738 (738.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Was jetzt?

32
RemcoGerlich

Wenn das Ubuntu Docker-Paket auf die Verwendung von systemd aktualisiert wurde, wurde die Unterstützung für die Konfigurationsdatei /etc/default/docker eingestellt, sodass die ursprüngliche Lösung vorgeschlagen von rocketman10404 nicht mehr funktioniert (Deaktivieren von dnsmasq weiterhin funktioniert funktionieren, aber es hat den Nachteil, dass Ubuntu den DNS-Server nicht automatisch aktualisiert).

Korrektur in der neuen daemon.json Konfigurationsdatei

Finden Sie den DNS-Server Ihres Netzwerks:

$ nmcli dev show | grep 'IP4.DNS'
IP4.DNS[1]:                             10.0.0.2

Öffnen oder erstellen Sie, falls nicht vorhanden, /etc/docker/daemon.json und fügen Sie der Zeile ExecStart DNS-Einstellungen hinzu:

# /etc/docker/daemon.json
{
    "dns": ["10.0.0.2", "8.8.8.8"]
}

Starten Sie den Docker-Daemon neu:

$ Sudo service docker restart

Ich schrieb einen ausführlichen Blog-Beitrag und auch einen Fehler gemeldet über dieses Problem, wenn Sie weitere Details wünschen.

(Ursprünglich habe ich es durch gelöst öffnen Sie /lib/systemd/system/docker.service und fügen Sie der ExecStart-Zeile DNS-Einstellungen hinzu, aber das ist schlimm - wir sollten systemd-Dateien nicht direkt bearbeiten .)

22
Robin Winslow

Ich benutze Docker nicht selbst, daher würde ich mich normalerweise nicht in eine Docker-Frage einmischen, aber ich habe zufällig darüber gelesen und bin auf eine Docker-Dokumentation gestoßen, die anscheinend m genau dieses Problem zu lösen . Um zusammenzufassen...

In der Dokumentation werden einige Problemumgehungen vorgeschlagen. Der erste besteht darin, den DNS-Server anzugeben, der vom Docker-Daemon für die Container verwendet werden soll, indem die folgende Zeile zu /etc/default/docker hinzugefügt wird:

docker_OPTS="--dns 8.8.8.8"

bei dem bereitgestellten DNS kann es sich um einen lokalen DNS-Server handeln, z. B. 192.168.1.1 (Gateway). Starten Sie dann mit neu

Sudo restart docker

Eine alternative Lösung besteht darin, dnsmasq in NetworkManager zu deaktivieren, indem Sie die Konfiguration in /etc/NetworkManager/NetworkManager.conf wie folgt auskommentieren:

#dns=dnsmasq

starten Sie dann beide neu

Sudo restart network-manager
Sudo restart docker
15
rocketman10404

Ich bin in meiner spezifischen Situation darauf gestoßen

  • Ausführen von Docker-Containern auf meinem lokalen Entwicklungscomputer
  • Welches ist mit einem VPN verbunden
  • Einige unserer Container-Build-Skripte führen beispielsweise npm install aus einem benutzerdefinierten Repository im VPN im Container aus.
    • Dies funktioniert über eine CI-Pipeline, jedoch nicht über unsere Entwicklercomputer, da npm keine erfolgreiche DNS-Suche durchführen kann
    • Wir hatten auch Probleme mit Containern, die Lookups durchführen müssen, um externe REST APIs aufzurufen

Ubuntu verwendet standardmäßig dnsmasq, das von NetworkManager gestartet wurde, um DNS-Anforderungen zwischenzuspeichern, und konfiguriert /etc/resolv.conf so, dass es auf diese Instanz in 127.0.1.1 verweist.

  • Der von uns verwendete VPN-Client ist nicht mit NetworkManager kompatibel und erzwingt einen eigenen /etc/resolv.conf, der die NetworkManager-Konfiguration überschreibt
  • Dadurch werden die DNS-Server für das VPN konfiguriert
  • Docker spiegelt Ihren /etc/resolv.conf standardmäßig in den Container
    • Normalerweise leitet es unter Ubuntu die Google-DNS-Server an den Container weiter (da es über die Situation dnsmasq Bescheid weiß.
    • Es ist jedoch hilfreich, die VPN-DNS-Serverkonfiguration an den Container zu übergeben
    • Es gibt keine Route vom Container auf der docker0 Netzwerkbrücke zu den DNS-Servern über den VPN-Adapter tap0.
  • Ergo schlagen alle DNS-Suchvorgänge im Container fehl, da nicht die einzigen DNS-Server erreicht werden können, mit denen der Container ausgeliefert wird
  • Darüber hinaus blockieren einige Netzwerke Anfragen an die Google DNS-Server, da diese alle Ihre DNS-Lookups abrufen möchten

Die Lösung :

Es scheint eleganter zu sein, NetworkManager und seine unverlierbare dnsmasq -Instanz so zu verwenden, wie sie entworfen wurde.

  1. Weisen Sie Docker an, Ihre dnsmasq -Instanz für DNS zu verwenden

    • Fügen Sie die Datei /etc/docker/daemon.json hinzu oder bearbeiten Sie sie, um Docker anzuweisen, den Bridge-Adapter docker0 für DNS zu verwenden

      {
        "dns": ["172.17.0.1"]
      }
      
  2. Konfigurieren Sie die Instanz NM dnsmasq so, dass sie auch die Docker-Bridges überwacht, da standardmäßig nur 127.0.1.1 abgehört wird - Datei /etc/NetworkManager/dnsmasq.d/docker-bridge.conf erstellen

    # Default Docker bridge
    interface=docker0
    # Other Docker bridges
    interface=br-*
    
  3. Ich mag das unhöfliche Verhalten dieses VPN-Clients nicht und ich würde das DNS lieber nur am VPN-Ende für VPN-Lookups verwenden (wenn Sie einen höflichen VPN-Client haben, der NetworkManager richtig konfiguriert hat, müssen Sie dies nicht tun )

    • Deaktivieren Sie die DNS-Funktion im VPN-Client (das Überschreiben von resolv.conf beim Herstellen einer Verbindung wird beendet, und jetzt wird das gesamte DNS erneut durch dnsmasq geleitet.)
    • Fügen Sie eine Konfigurationsdatei hinzu, um dnsmasq anzuweisen, DNS-Anforderungen für Ihre Domain entsprechend weiterzuleiten - fügen Sie die Datei `/etc/NetworkManager/dnsmasq.d/vpn-dns.conf hinzu

      server=/myprivatedomain.net/10.0.0.1  
      # or whatever your private DNS server is
      
    • Fügen Sie optional eine Suchdomäne für Ihre Domäne hinzu, damit Sie Kurznamen verwenden können

      • Ich habe gerade unsere lokale Domain zur Suchliste in meiner Standardnetzwerkverbindung hinzugefügt
  4. Starten Sie NetworkManager und Docker neu

    Sudo service network-manager restart
    Sudo service docker restart
    

Zu diesem Zeitpunkt sollten Ihre Docker-Container in der Lage sein, nslookup ohne Probleme auszuführen, wenn Sie sich in einem VPN befinden, sowohl für Domänen innerhalb als auch außerhalb Ihres VPN.

9
Adrian

Hier ist, wie ich Docker auf meinem Ubuntu 14.04 Server einrichte, der ohne Kopf läuft.

Ich verwende Ubuntu Server 14.04 mit der folgenden Docker-Version.

#docker version
Client version: 0.9.1
Go version (client): go1.2.1
Git commit (client): 3600720
Server version: 0.9.1
Git commit (server): 3600720
Go version (server): go1.2.1

Die Datei /etc/init/docker.io.conf und das Skript enthalten die folgende Zeile:

# modify these in /etc/default/$UPSTART_JOB (/etc/default/docker)
    DOCKER=/usr/bin/$UPSTART_JOB
    DOCKER_OPTS=

Die obige Antwort hat mir geholfen, die obige Datei zu finden.

Ich habe das Folgende in /etc/default/docker.io auskommentiert und meinen lokalen DNS-Server hinzugefügt:

# Use DOCKER_OPTS to modify the daemon startup options.  
DOCKER_OPTS="--dns 192.168.X.X"

Service neu gestartet mit:

Sudo service docker.io restart

Ran docker run <image> /bin/bash

Keine DNS-Meldungen beim Starten des Containers.

Startete einen neuen Container, installierte dnsutils.

Ran Dig und die Servermeldung ist der richtige lokale DNS-Server.

2
Hank

Sie können den lokalen DNS-Resolver des Hosts (z. B. dnsmasq) aus Ihren Docker-Containern verwenden, wenn sie sich in einem benutzerdefinierten Netzwerk befinden. In diesem Fall hat der _/etc/resolv.conf_ eines Containers den Nameserver _127.0.0.11_ (auch bekannt als der eingebettete DNS-Server des Dockers ), der DNS-Anforderungen an die Loopback-Adresse des Hosts weiterleiten kann richtig.

_$ cat /etc/resolv.conf
nameserver 127.0.0.1
$ docker run --rm Alpine cat /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
$ docker network create demo
557079c79ddf6be7d6def935fa0c1c3c8290a0db4649c4679b84f6363e3dd9a0
$ docker run --rm --net demo Alpine cat /etc/resolv.conf
nameserver 127.0.0.11
options ndots:0    
_

Wenn Sie docker-compose verwenden, wird automatisch ein benutzerdefiniertes Netzwerk für Ihre Container eingerichtet (mit einem Dateiformat v2 + ). Beachten Sie jedoch, dass _docker-compose_ zwar Container in einem benutzerdefinierten Netzwerk ausführt, diese jedoch weiterhin im Standardnetzwerk erstellt. Um ein benutzerdefiniertes Netzwerk für Builds zu verwenden, können Sie den Parameter network in der Build-Konfiguration angeben (erfordert das Dateiformat v3.4 + ).

0
Eugene Yarmash

Ich hatte ein ähnliches Problem, StackOverflow gemeldet . Es scheint, dass ich den in der Ubuntu-Standardinstallation von Docker angegebenen Nameserver 8.8.8.8 nicht abfragen konnte. Ich könnte es jedoch anpingen. Verwenden Sie in diesem Fall einen DNS-Server, den Sie tatsächlich abfragen können. Testen Sie mit

nslookup - dns.server.name

und starte den Container über

docker run --dns=ip.addr.of.dns

Ich muss noch einen Weg finden, um https://askubuntu.com/q/607172/30266 eine automagische Lösung abzuleiten.

0
krlmlr