Docker-Container können DNS auf Ubuntu 14.04 Desktop Host nicht auflösen

48

Ich habe ein Problem mit meinen Docker-Containern auf Ubuntu 14.04 LTS. Docker funktionierte zwei Tage lang einwandfrei, und dann verlor ich plötzlich die gesamte Netzwerkverbindung in meinen Containern. Die folgende Fehlerausgabe hat mich zunächst zu der Annahme veranlasst, dass apt-get versucht, den DNS über IPv6 aufzulösen.

Ich habe IPv6 auf meinem Host-Computer deaktiviert und trotzdem alle Bilder entfernt, Base Ubuntu abgerufen und trotzdem auf das Problem gestoßen.

Ich habe meine Nameserver /etc/resolve.conf von meinem lokalen DNS-Server auf die öffentlichen DNS-Server von Google (8.8.8.8 und 8.8.4.4) geändert und habe immer noch kein Glück. Ich habe auch den DNS in den DOCKER_OPTS von / etc / default / docker auf Google gesetzt und docker neu gestartet.

Ich versuchte auch, Coreos zu ziehen, und yum konnte DNS auch nicht auflösen.

Es ist seltsam, denn während DNS nicht funktioniert, erhalte ich immer noch eine Antwort, wenn ich dieselben Update-Server anpinge, die apt-get nicht auflösen kann.

Ich bin nicht hinter einem Proxy, ich bin in einem sehr normalen lokalen Netzwerk und diese Version von Ubuntu ist auf dem neuesten Stand und frisch (ich habe sie vor zwei Tagen installiert, um Docker näher zu sein).

Ich habe dies in anderen Beiträgen zu Stackoverflow- und Github-Problemen gründlich recherchiert, aber keine Lösung gefunden. Ich habe keine Ahnung, wie ich dieses Problem lösen kann. Kann mir jemand helfen?

Fehlermeldung

➜  arthouse git:(docker) ✗ docker build --no-cache .
Sending build context to Docker daemon 51.03 MB
Sending build context to Docker daemon 
Step 0 : FROM ubuntu:14.04
 ---> 5506de2b643b
Step 1 : RUN apt-get update
 ---> Running in 845ae6abd1e0
Err http://archive.ubuntu.com trusty InRelease
Err http://archive.ubuntu.com trusty-updates InRelease
Err http://archive.ubuntu.com trusty-security InRelease   
Err http://archive.ubuntu.com trusty-proposed InRelease  
Err http://archive.ubuntu.com trusty Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Err http://archive.ubuntu.com trusty-updates Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Err http://archive.ubuntu.com trusty-security Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Err http://archive.ubuntu.com trusty-proposed Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Reading package lists...
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/InRelease  
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-updates/InRelease  
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-security/InRelease  
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-proposed/InRelease  
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-updates/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-security/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-proposed/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Some index files failed to download. They have been ignored, or old ones used instead.

Container IFCONFIG / PING

➜  code  docker run -it ubuntu /bin/bash
root@7bc182bf87bb:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:04  
          inet addr:172.17.0.4  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:4/64 Scope:Link
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:7 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:738 (738.0 B)  TX bytes:648 (648.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:65536  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)

root@7bc182bf87bb:/# ping google.com
PING google.com (74.125.226.0) 56(84) bytes of data.
64 bytes from lga15s42-in-f0.1e100.net (74.125.226.0): icmp_seq=1 ttl=56 time=12.3 ms
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 12.367/12.367/12.367/0.000 ms
root@7bc182bf87bb:/# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=44 time=21.8 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=44 time=21.7 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=44 time=21.7 ms

Außerdem schlägt die Aktualisierung von apt-get fehl, wenn ich IPv4 erzwinge:

root@6d925cdf84ad:/# sudo apt-get update -o Acquire::ForceIPv4=true
Err http://archive.ubuntu.com trusty InRelease

Err http://archive.ubuntu.com trusty-updates InRelease

Err http://archive.ubuntu.com trusty-security InRelease

Err http://archive.ubuntu.com trusty-proposed InRelease

Err http://archive.ubuntu.com trusty Release.gpg
  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Err http://archive.ubuntu.com trusty-updates Release.gpg
  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Err http://archive.ubuntu.com trusty-security Release.gpg
  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Err http://archive.ubuntu.com trusty-proposed Release.gpg
  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Reading package lists... Done
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/InRelease  
Thomas V.
quelle
Bei mir hat es nach einem Neustart geklappt.
ssi-anik

Antworten:

63

Woo, ich habe einen Post auf Github gefunden, der mein Problem gelöst hat.

Nachdem Steve K. darauf hingewiesen hatte, dass es sich nicht wirklich um ein DNS-Problem handelte und es sich um ein Konnektivitätsproblem handelte, konnte ich auf github einen Beitrag finden , in dem beschrieben wurde, wie dieses Problem behoben werden kann.

Anscheinend war die docker0-Netzwerkbrücke aufgelegt. Das Installieren von Bridge-Utils und das Ausführen des folgenden Befehls haben meinen Docker in Betrieb genommen:

apt-get install bridge-utils
pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
service docker restart
Thomas V.
quelle
1
Sie müssen Ihre Bilder nicht neu berechnen. Die Datei resolv.conf wird jedes Mal generiert, wenn Sie einen neuen Container ausführen. Sie müssen also den alten Container entfernen und einen neuen starten. Ich war dieses Problem gestern fased. Wenn Sie sich im Intranet eines Unternehmens befinden, können Sie auch --dns-search = Ihre.Firmendomäne an den Docker-Dämon in / etc / default / docker in der Umgebungsvariablen DOCKER_OPTS in der Nähe der Flags --dns --dns übergeben.
Alexander.Iljushkin
Dadurch wurden auch meine Docker-Probleme behoben.
BobMcGee
3
Auf Arch Linux brauchte ich ip link set down docker0statt ifconfig docker0 downund systemctl restart dockerstatt service docker start. Um alle Bilder zu löschen, habe ichdocker rmi $(docker images -q)
meshy
Das hat das erste Mal bei mir geklappt. Dann habe ich neu gestartet, und das Problem trat erneut auf: Durch das Reproduzieren dieser Schritte wurde das Problem nicht erneut behoben. Ich habe keine Ahnung, worum es geht.
user626921
1
Ich habe gerade gesehen, dass mein docker0-Interface ausgefallen ist, ich habe es ausgeführt /etc/init.d/docker restartund es ist wieder betriebsbereit
lolesque
14

Wenn es sich um ein DNS-Auflösungsproblem handelt, finden Sie hier die Lösung:

Als erstes müssen Sie cat /etc/resolv.confden Docker-Container überprüfen . Wenn der DNS-Server ungültig ist, z. B. nameserver 127.0.x.x, kann der Container die Domänennamen nicht in IP-Adressen auflösen, sodass ping google.comein Fehler auftritt.

Das zweite zu überprüfende Element wird cat /etc/resolv.confauf dem Host-Computer ausgeführt . Docker kopiert die Hosts grundsätzlich /etc/resolv.confjedes Mal in den Container, wenn ein Container gestartet wird. Wenn also der Host /etc/resolv.conffalsch ist, ist auch der Docker-Container falsch.

Wenn Sie festgestellt haben, dass der Host /etc/resolv.conffalsch ist, haben Sie zwei Möglichkeiten:

  1. Codieren Sie den DNS-Server in daemon.json fest. Dies ist einfach, aber nicht ideal, wenn Sie erwarten, dass sich der DNS-Server ändert.

  2. Repariere die Hosts /etc/resolv.conf. Dies ist etwas komplizierter, wird jedoch dynamisch generiert und der DNS-Server wird nicht hartcodiert.


1. Hardcode-DNS-Server in docker daemon.json

  • Bearbeiten /etc/docker/daemon.json

    {
        "dns": ["10.1.2.3", "8.8.8.8"]
    }
    
  • Starten Sie den Docker-Daemon neu, damit die Änderungen wirksam werden:
    sudo systemctl restart docker

  • Wenn Sie jetzt einen Container ausführen / starten, wird der Docker /etc/resolv.confmit den Werten von gefüllt daemon.json.


2. Korrigieren Sie die Hosts /etc/resolv.conf

A. Ubuntu 16.04 und früher

  • Für Ubuntu 16.04 und früher /etc/resolv.confwurde dynamisch von NetworkManager generiert.

  • Kommentieren Sie die Zeile dns=dnsmasq(mit einem #) in aus /etc/NetworkManager/NetworkManager.conf

  • Starten Sie den NetworkManager neu, um Folgendes zu generieren /etc/resolv.conf:
    sudo systemctl restart network-manager

  • Überprüfen Sie auf dem Host: cat /etc/resolv.conf

B. Ubuntu 18.04 und höher

  • Ubuntu 18.04 wurde geändert, um systemd-resolvedzu generieren/etc/resolv.conf . Jetzt wird standardmäßig ein lokaler DNS-Cache 127.0.0.53 verwendet. In einem Container funktioniert dies nicht. Daher verwendet Docker standardmäßig den DNS-Server 8.8.8.8 von Google, der für Benutzer hinter einer Firewall möglicherweise fehlerhaft ist.

  • /etc/resolv.confist eigentlich ein symlink ( ls -l /etc/resolv.conf), der /run/systemd/resolve/stub-resolv.confin Ubuntu 18.04 standardmäßig auf (127.0.0.53) zeigt.

  • Ändern Sie einfach den Symlink so, dass er auf zeigt /run/systemd/resolve/resolv.conf, der die realen DNS-Server auflistet:
    sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

  • Überprüfen Sie auf dem Host: cat /etc/resolv.conf

Jetzt sollte /etc/resolv.confauf dem Host ein gültiger Docker vorhanden sein, der in die Container kopiert werden kann.

weises Glück
quelle
Vielen Dank, dass ich wirklich den Verstand verloren habe, als ich versuchte zu verstehen, was mit Docker-Containern und dem Auflösen von IPs in einem VPN 18.04 passierte. Das Reparieren von /etc/resolv.conf für 18.04 hat bei mir funktioniert!
George Papas
Option B arbeitete für mich ..
CodeSetter
Sicher wird 2B ein Update des systemdPakets nicht überleben ...
Auspex
13

In dem Versuch, einem Problem einen Mehrwert zu verleihen, habe ich auch erlebt; mit einer alternativen Antwort:

Mein Netzwerk war bürobezogen und die DNS-Einstellungen von Google wurden blockiert, sodass der Container IP-Adressen, jedoch keine Domainnamen anpingen konnte.

Mein Gastgeber /etc/resolv.confsah ursprünglich so aus.

#Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.1.1
search companyDomain.co.za

Dies liegt daran, dass Network Manager die DNS-Serverdetails maskiert.

Leider filtert Docker gemäß den Docker-Handbüchern beim Erstellen der resolv.conf des Containers alle lokalen Host-IP-Adressen heraus und ersetzt sie durch die DNS-IPs von Google. Was in meinem Fall dazu führte, dass Domainnamen verboten waren.

Ich musste:

  • Setzen Sie my /etc/default/dockerauf die Standardeinstellungen zurück, sodass Container stattdessen den Inhalt von resolv.conf meines Hosts verwenden.
  • Bearbeiten Sie /etc/NetworkManager/NetworManager.confdie Zeile und kommentieren Sie sie aus dns=dnsmasq. Auf diese Weise kann NM die tatsächlichen DNS-IP-Adressen anstelle von 127.0.0.1 angeben.
  • NM neu starten mit sudo service network-manager restart.
  • Starten Sie den Docker-Dienst mit neu sudo service docker restart.

Das Ausführen eines Containers würde dies apt-get update/upgradebeispielsweise ermöglichen.

David 'der kahle Ingwer'
quelle
3
Das hat bei mir tatsächlich funktioniert. Und ich war hinter dem Intranet der Firma
Daniel Andrei Mincă
1
Diese Lösung funktioniert hervorragend für Ubuntu 16.04 und früher. Informationen zu
wisbucky am
Vielen Dank! Dies funktionierte, während die akzeptierte Antwort dies nicht tat. :)
Devolus
8

Ihr Fehler ist hier:

 Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19).
 connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]

Dies ist kein DNS-Fehler. Stattdessen versucht Ihr System, eine Verbindung zu IPv6-Hosts herzustellen, und schlägt fehl. Vermutlich, weil Sie auf Ihrem Host keinen IPv6-Zugriff haben. Die tatsächliche Suche nach der IPv6-Adresse ist erfolgreich. (Der Ubuntu-Spiegel / das Ubuntu-Archiv ist sowohl über IPv6 als auch über IPv4 verfügbar. Sie hatten gerade das Pech, einen IPv6-Spiegel zu erhalten, da Ihr System glaubt, dass er funktionieren sollte.)

Sie sollten entweder das beheben, indem Sie miredo installieren , oder es erneut versuchen , bis Sie einen IPv4-Spiegel treffen.

Auch hier ist es wichtig zu erkennen, dass DNS nicht die Schuld trägt, wie Sie anhand Ihrer eigenen Ping-Tests sehen können.


quelle
1
Vielen Dank für die schnelle Antwort und die Klarstellung, dass es sich nicht um ein DNS-Problem handelt. Ich weiß das zu schätzen. Ich habe miredo installiert - no go. Es ist auch erwähnenswert, dass ich meinen ursprünglichen Beitrag mit dieser Antwort aktualisiert habe, wenn ich apt-get update -o Acquire :: ForceIPv4 ausführe = true apt-get update schlägt immer noch fehl. Ich habe versucht, UFW zu deaktivieren, und habe immer noch kein Glück gehabt.
Thomas V.
Seltsam - Sie können sehen, dass Sie IPv4-Konnektivität haben, weil Ihr Ping erfolgreich ist. Sie können sich jedoch nicht mit dem Spiegel verbinden,
8

Das offizielle Docker-Dokument enthält Instrumente zum Konfigurieren eines DNS-Servers für die Verwendung durch Docker

  1. Öffnen Sie die /etc/default/dockerDatei zum Bearbeiten:

    sudo nano /etc/default/docker
    
  2. Fügen Sie eine Einstellung für Docker hinzu:

    DOCKER_OPTS="--dns 8.8.8.8"
    
  3. Ersetzen Sie 8.8.8.8durch einen lokalen DNS-Server wie 192.168.1.1. Sie können auch mehrere DNS-Server angeben. Trennte sie mit Leerzeichen, zum Beispiel:

    --dns 8.8.8.8 --dns 192.168.1.1
    

    Warnung: Wenn Sie dies auf einem Laptop tun, der mit verschiedenen Netzwerken verbunden ist, müssen Sie einen öffentlichen DNS-Server auswählen.

    PS: nm-toolkann verwendet werden, um den DNS-Server des lokalen Hosts zu überprüfen

  4. Speichern und schließen Sie die Datei.

  5. Starten Sie den Docker-Daemon neu.

    sudo service docker restart
    
tryer3000
quelle
Beachten Sie, dass dies die alte Konfigurationsdatei für Docker Upstart und SysVinit ist. Die aktuelle Methode für systemd (seit Ubuntu 16.04) ist die Verwendung /etc/docker/daemon.jsonfür Docker-Daemon-Einstellungen wie dns.
wisbucky
0

Für andere Leser, die hierher kommen, während sie boot2docker verwenden, habe ich Folgendes behoben. Die Antwort oben hat mich in die richtige Richtung gelenkt.

Grundsätzlich konnten Container in boot2docker aus irgendeinem Grund Hostnamen nicht auflösen.

Also habe ich gerade boot2docker neu gestartet und die Container gestartet. Jetzt können Hostnamen wieder korrekt aufgelöst werden.

Ich nehme an, dass das Problem darin bestand, boot2docker zu starten, während das Netzwerk auf dem Host verbunden war, was dazu führte, dass boot2docker gestartet wurde und in einen nicht funktionierenden Zustand überging.

Auge
quelle
0

Ich hatte das gleiche Problem unter Windows. Dieser Befehl hat bei mir funktioniert:docker-machine restart

Speedplane
quelle
0

Starten Sie den Docker-Daemon unter Debian9 neu

service docker restart

und die Verbindungen und Netzwerke funktionieren gut

Nolwennig
quelle
-1

Hatte ein ähnliches Problem, aber auch die Namensauflösung zwischen Containern innerhalb eines benutzerdefinierten Netzwerks schien etwas unzuverlässig zu sein. Einige konnten so etwas wie dich nicht lösen.

Das Problem war ein verschobenes / var / lib / docker. Aus Platzgründen wurde es via nfs gemountet. Durch Hinzufügen eines lokalen Dateisystems und Verschieben der Dateien wird das Problem behoben.

michi.0x5d
quelle
Wenn Sie der Meinung sind, dass eine Frage durch eine Antwort auf eine ähnliche Frage beantwortet werden kann, markieren Sie diese als Duplikat dieser Frage. Wenn Sie das nicht können, sollten Sie einen Kommentar hinterlassen, anstatt eine separate Antwort darauf zu geben.
Jenny D sagt Reinstate Monica