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


Ich stoße auf ein Problem mit meinen Docker-Containern unter Ubuntu 14.04 LTS. Docker funktionierte zwei Tage lang, und dann verlor ich plötzlich die gesamte Netzwerkverbindung in meinen Containern. Die unten angegebene Fehlerausgabe führte zunächst zu der Annahme, dass apt-get versucht, das DNS über IPv6 aufzulösen.

Ich habe IPv6 auf meinem Host-Rechner deaktiviert und trotzdem alle Bilder entfernt, Base-Ubuntu gezogen und trotzdem das Problem erkannt.

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 auf Google in der DOCKER_OPTS von / etc / default / docker und neu gestartet Docker.

Ich habe auch versucht, Coreos zu ziehen, und Yum konnte DNS auch nicht auflösen.

Es ist komisch, weil, während DNS nicht funktioniert, ich immer noch eine Antwort bekomme, wenn ich die gleichen 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 aktuell und frisch (ich habe vor zwei Tagen installiert, um docker näher zu sein).

Ich habe das gründlich durch andere Posts auf stackoverflow- und github-Problemen recherchiert, aber keine Lösung gefunden. Ich habe keine Ideen, wie ich dieses Problem lösen kann, kann 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 das apt-get-Update 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  

43
2017-11-08 18:26


Ursprung




Antworten:


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

Nachdem Steve K. darauf hingewiesen hatte, dass es sich nicht um ein DNS-Problem handelte und es sich um ein Konnektivitätsproblem handelte, konnte ich es finden ein Post auf GitHub das beschreibt, wie dieses Problem behoben werden kann.

Anscheinend wurde die Netzwerkbrücke docker0 aufgelegt. Das Installieren von Bridge-Utils und das Ausführen der folgenden Funktionen haben meinen Docker funktionstüchtig gemacht:

apt-get install bridge-utils
pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
service docker restart

54
2017-11-08 19:09



Sie müssen Ihre Bilder nicht erneut bearbeiten. resolv.conf wird jedes Mal generiert, wenn Sie einen neuen Container ausführen. Sie müssen also den alten Container entfernen und einen anderen starten. Ich habe dieses Problem gestern gelöst. Wenn Sie sich im Firmenintranet befinden, können Sie --dns-search = your.company.domain an den Docker-Daemon in / etc / default / docker in der Variablen DOCKER_OPTS env in der Nähe der --dns --dns-Flags übergeben. - Alexander.Iljushkin
Dies hat meine Probleme mit dem Docker behoben. - BobMcGee
Auf Arch Linux brauchte ich ip link set down docker0 anstatt ifconfig docker0 down und systemctl restart docker anstatt service docker start. Um alle Bilder zu löschen, tat ich es docker rmi $(docker images -q) - meshy
Das hat das erste Mal für mich funktioniert. Dann startete ich neu, und das Problem tauchte wieder auf: Das Reproduzieren dieser Schritte behob das Problem nicht erneut. Ich habe keine Ahnung, worum es geht. - user626921
Habe gerade gesehen, dass meine docker0-Schnittstelle nicht funktionierte /etc/init.d/docker restart und es geht zurück zur Sache - lolesque


In einem Versuch, einen zusätzlichen Wert zu einem Problem hinzuzufügen, erlebte ich auch; mit einer alternativen Antwort:

Mein Netzwerk war bürobezogen und die Google DNS-Einstellungen wurden blockiert, sodass der Container zwar IP-Adressen, aber keine Domänennamen pingen konnte.

Mein Gastgeber /etc/resolv.conf sah 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 eine Maskierung der DNS-Serverdetails vornimmt.

Leider laut der Docker Handbücher docker filtert beim Erstellen der resolv.conf des Containers alle IP-Adressen des lokalen Hosts aus und ersetzt sie durch die DNS-IPs von Google. Was in meinem Fall dazu führte, dass Domain-Namen tabu sind.

Ich musste:

  • Setze meine zurück /etc/default/docker Standardmäßig verwenden Container stattdessen den resolv.conf-Inhalt meines Hosts.
  • Bearbeiten /etc/NetworkManager/NetworManager.conf und die Zeile auskommentieren dns=dnsmasq. Dies ist der Fall, damit NM die tatsächlichen DNS-IP-Adressen anstelle von 127.0.0.1 angeben kann.
  • NM neu starten mit sudo service network-manager restart.
  • Starten Sie den Andockdienst mit sudo service docker restart.

Dann würde es einen Container laufen lassen apt-get update/upgrade, zum Beispiel.


10
2017-07-26 09:43



Das hat wirklich für mich funktioniert. Und ich war hinter dem Firmenintranet - Mincă Daniel Andrei
Diese Lösung funktioniert hervorragend für Ubuntu 16.04 und früher. Für Ubuntu 18.04 und später, siehe serverfault.com/a/918568 - wisbucky
Vielen Dank! Dies funktioniert, während die angenommene Antwort nicht funktioniert. :) - Devolus


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 Fehler mit DNS, stattdessen versucht Ihr System, sich mit IPv6-Hosts zu verbinden und schlägt fehl. Vermutlich, weil Sie auf Ihrem Host keinen IPv6-Zugriff haben. Das tatsächliche Nachschlagen der IPv6-Adresse ist erfolgreich. (Das Ubuntu Mirror / Archive ist sowohl über IPv6 als auch über IPv4 verfügbar. Sie hatten einfach Pech, ein IPv6 zu treffen, weil Ihr System glaubt, dass es funktionieren sollte.)

Sie sollten das entweder beheben, indem Installation von Miredooder versuchen Sie es erneut, bis Sie auf einen IPv4-Spiegel treffen.

Auch hier ist es wichtig zu wissen, dass DNS nicht schuld ist, wie Sie anhand Ihrer eigenen Ping-Tests sehen können.


7
2017-11-08 18:38



Vielen Dank für die schnelle Antwort und die Klarstellung, dass es sich nicht um ein DNS-Problem handelt. Ich installierte Miredo - nicht gehen. Es ist auch erwähnenswert, dass, wenn ich apt-get-update -o Acquire :: ForceIPv4 = true ausführen apt-get-Update immer noch fehlschlägt, habe ich meinen ursprünglichen Beitrag mit dieser Antwort aktualisiert. Ich habe versucht, UFW zu deaktivieren, dachte vielleicht, dass das der Fall war, und hatte immer noch kein Glück. - Thomas V.
Seltsam - Sie können sehen, dass Sie IPv4-Konnektivität haben, weil Ihr Ping erfolgreich ist. Aber du kannst dich nicht mit dem Spiegel verbinden, egal, ob du ein seltsames Routing / Netzwerk-Problem hast (was vermutlich der Grund ist, warum du hier postest!) - Steve Kemp


Docker offizielles Dokument gibt Instrumente zum Konfigurieren eines DNS-Servers für die Verwendung durch Docker

  1. Öffne das /etc/default/docker Datei 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 8.8.8.8 mit einem lokalen DNS-Server wie z 192.168.1.1. Sie können Geben Sie auch mehrere DNS-Server an. Trennte sie mit Leerzeichen, z Beispiel:

    --dns 8.8.8.8 --dns 192.168.1.1
    

    Warnung: Wenn Sie dies auf einem Laptop tun, der eine Verbindung zu verschiedenen Netzwerken herstellt, stellen Sie sicher, dass Sie einen öffentlichen DNS-Server auswählen.

    PS: nm-tool kann verwendet werden, um den lokalen Host-DNS-Server zu überprüfen

  4. Speichern und schließen Sie die Datei.

  5. Starten Sie den Docker-Daemon neu.

    sudo restart docker
    

7
2018-05-27 05:48



Beachten Sie, dass dies die alte Konfigurationsdatei für Docker Upstart und SysVinit ist. Der aktuelle Weg für Systemd (seit Ubuntu 16.04) ist zu benutzen /etc/docker/daemon.json für Docker-Dämoneinstellungen wie DNS. - wisbucky


Wenn es ein DNS-Resolver-Problem ist, hier ist die Lösung:

Das erste zu überprüfende Element wird ausgeführt cat /etc/resolv.conf in dem Andockbehälter. Wenn es einen ungültigen DNS-Server wie z nameserver 127.0.x.x, dann wird der Container nicht in der Lage sein, die Domänennamen in IP-Adressen aufzulösen ping google.com wird versagen.

Das zweite zu überprüfende Element wird ausgeführt cat /etc/resolv.conf auf der Host-Maschine. Docker kopiert grundsätzlich den Host /etc/resolv.conf an den Container jedes Mal, wenn ein Container gestartet wird. Also wenn der Wirt /etc/resolv.conf ist falsch, dann wird auch der Docker Container.

Wenn du das vom Host gefunden hast /etc/resolv.conf ist falsch, dann haben Sie 2 Möglichkeiten:

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

  2. Repariere die Hosts /etc/resolv.conf. Dies ist ein wenig schwieriger, aber es wird dynamisch generiert, und Sie werden den DNS-Server nicht hartcodieren.


1. Hardcode-DNS-Server im Andockfenster daemon.json

  • Bearbeiten /etc/docker/daemon.json

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

  • Wenn Sie jetzt einen Container ausführen / starten, wird das Andockfenster gefüllt /etc/resolv.conf mit den Werten von 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.conf wurde dynamisch vom NetworkManager generiert.

  • Kommentiere die Zeile aus dns=dnsmasq (mit einer #) im /etc/NetworkManager/NetworkManager.conf

  • Starten Sie den NetworkManager neu, um neu 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 später

  • Ubuntu 18.04 geändert zu verwenden systemd-resolved generieren /etc/resolv.conf. Jetzt verwendet es standardmäßig einen lokalen DNS-Cache 127.0.0.53. Das funktioniert nicht in einem Container, daher wird Docker standardmäßig auf den 8.8.8.8 DNS-Server von Google zugreifen, was für Leute hinter einer Firewall zu Problemen führen kann.

  • /etc/resolv.conf ist eigentlich ein Symlink (ls -l /etc/resolv.conf) was auf zeigt /run/systemd/resolve/stub-resolv.conf (127.0.0.53) standardmäßig in Ubuntu 18.04.

  • Ändern Sie einfach den Symlink, auf den verwiesen werden soll /run/systemd/resolve/resolv.conf, die die echten 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 sollten Sie eine gültige haben /etc/resolv.conf auf dem Host zum Andocken in die Container.


6
2018-06-27 23:06



Danke dafür, ging wirklich meinen Verstand verloren, zu versuchen zu verstehen, was mit Dockercontainern geschah und 18.04, die IPs auf einem VPN auflöst. Fixing /etc/resolv.conf für 18.04 hat für mich funktioniert! - George Papas
Option B hat für mich funktioniert. - codeSetter


Für andere Leser, die mit boot2docker hierher kommen, habe ich das hier behoben. In der Tat wies mich die obige Antwort in die richtige Richtung.

Aus irgendeinem Grund konnten Container innerhalb von boot2docker Hostnamen nicht auflösen.

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

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


0
2018-06-23 01:42





Ich hatte das gleiche Problem unter Windows. Dieser Befehl hat es für mich funktioniert: docker-machine restart


0
2017-08-11 22:16





Starte den Docker-Daemon auf Debian9 neu

service docker restart 

und die Verbindungen und Netzwerke funktioniert gut


0
2018-06-07 15:30





Hatte ein ähnliches Problem, aber auch Namensauflösung zwischen den Containern in einem benutzerdefinierten Netzwerk schien ein bisschen flockig zu sein. Manche konnten nichts wie dich lösen.

Das Problem war ein verschobener / var / lib / docker. Aus Platzgründen wurde es über nfs gemountet. Das Hinzufügen eines lokalen Dateisystems und das Verschieben der Dateien dort behebt das Problem.


-1
2017-08-10 10:54



Wenn Sie der Meinung sind, dass eine Frage mit einer Antwort auf eine ähnliche Frage beantwortet werden kann, markieren Sie sie bitte als Duplikat dieser Frage. Wenn Sie das nicht können, sollten Sie einen Kommentar hinterlassen, anstatt eine separate Antwort zu geben. - Jenny D


ich habe Docker version 1.12.6, build 78d1802 und es war genug, um den Docker für mich neu zu starten (Ubuntu 16.04).

$ sudo systemctl restart docker

-1
2017-09-21 16:52