it-swarm.com.de

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

Ich habe ein Problem mit meinen Docker-Containern unter 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 ließ mich zunächst glauben, dass apt-get versucht, das DNS über IPv6 aufzulösen.

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

Ich habe meine /etc/resolve.conf-Nameserver 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 den Docker neu gestartet.

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

Es ist seltsam, weil DNS zwar nicht funktioniert, ich aber dennoch eine Antwort erhalte, 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 aktuell und frisch (ich habe sie vor zwei Tagen installiert, um näher am Docker zu sein).

Ich habe dies in anderen Beiträgen zu Stackoverflow- und Github-Problemen gründlich untersucht, aber keine Lösung gefunden. Ich habe keine Ideen, 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
[email protected]:/# 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)

[email protected]:/# 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
[email protected]:/# 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:

[email protected]:/# 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  
51
Thomas V.

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

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

Anscheinend wurde die Docker0-Netzwerkbrücke aufgehängt. Durch das Installieren von Bridge-Utils und das Ausführen der folgenden Funktionen funktionierte mein Docker:

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

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

Als erstes müssen Sie cat /etc/resolv.conf Im Docker-Container ausführen. Wenn es einen ungültigen DNS-Server wie nameserver 127.0.x.x Hat, kann der Container die Domänennamen nicht in IP-Adressen auflösen, sodass ping google.com Fehlschlägt.

Als zweites müssen Sie cat /etc/resolv.conf Auf dem Host-Computer ausführen. Docker kopiert im Grunde jedes Mal, wenn ein Container gestartet wird, den /etc/resolv.conf Des Hosts in den Container. Wenn also der /etc/resolv.conf Des Hosts falsch ist, wird dies auch der Docker-Container tun.

Wenn Sie festgestellt haben, dass der /etc/resolv.conf Des Hosts falsch 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. Korrigieren Sie die /etc/resolv.conf Der Hosts. Dies ist etwas kniffliger, wird jedoch dynamisch generiert und Sie codieren den DNS-Server nicht fest.


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

  • Bearbeiten Sie /etc/docker/daemon.json

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

  • Wenn Sie jetzt einen Container ausführen/starten, füllt Docker /etc/resolv.conf Mit den Werten von daemon.json.


2. Korrigieren Sie den /etc/resolv.conf Des Hosts

A. Ubuntu 16.04 und früher

  • Für Ubuntu 16.04 und früher wurde /etc/resolv.conf Dynamisch von NetworkManager generiert.

  • Kommentieren Sie die Zeile dns=dnsmasq (Mit einem #) In /etc/NetworkManager/NetworkManager.conf Aus.

  • Starten Sie den NetworkManager neu, um /etc/resolv.conf Neu zu generieren:
    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-resolved Zum Generieren von /etc/resolv.conf zu verwenden. Standardmäßig wird jetzt ein lokaler DNS-Cache 127.0.0.53 verwendet. Das funktioniert in einem Container nicht, daher verwendet Docker standardmäßig den 8.8.8.8-DNS-Server von Google, der für Personen hinter einer Firewall möglicherweise beschädigt wird.

  • /etc/resolv.conf Ist eigentlich ein Symlink (ls -l /etc/resolv.conf), Der in Ubuntu 18.04 standardmäßig auf /run/systemd/resolve/stub-resolv.conf (127.0.0.53) verweist.

  • Ändern Sie einfach den Symlink so, dass er auf /run/systemd/resolve/resolv.conf Zeigt, in dem die tatsächlichen DNS-Server aufgelistet sind:
    Sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

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

Jetzt sollten Sie auf dem Host ein gültiges /etc/resolv.conf Haben, damit Docker es in die Container kopieren kann.

16
wisbucky

In dem Versuch, einem Problem, das ich ebenfalls erlebt habe, einen Mehrwert zu verleihen; 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.

Das /etc/resolv.conf Meines Gastgeber 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 die DNS-Serverdetails maskiert.

Leider filtert der Docker gemäß Docker-Handbücher alle Localhost-IP-Adressen heraus, wenn er die resolv.conf des Containers erstellt, und ersetzt sie durch die DNS-IPs von Google. Was in meinem Fall dazu führte, dass Domain-Namen verboten waren.

Ich musste:

  • Setzen Sie meinen /etc/default/docker Auf den Standardwert zurück, damit Container stattdessen den resolv.conf-Inhalt meines Hosts verwenden.
  • Bearbeiten Sie /etc/NetworkManager/NetworManager.conf Und kommentieren Sie die Zeile dns=dnsmasq Aus. Dies ist so NM kann die tatsächlichen DNS-IP-Adressen anstelle von 127.0.0.1 angeben.
  • Starten Sie NM mit Sudo service network-manager restart Neu.
  • Starten Sie den Docker-Dienst mit Sudo service docker restart Neu.

Wenn Sie einen Container ausführen, kann er beispielsweise apt-get update/upgrade Ausführen.

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

  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 Sie 8.8.8.8 mit einem lokalen DNS-Server wie 192.168.1.1. Sie können auch mehrere DNS-Server angeben. Trennen Sie sie mit Leerzeichen, zum 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, müssen 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 service docker restart
    
8
tryer3000

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 bei DNS. 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 eigentliche 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, ein IPv6-Archiv zu verwenden, da Ihr System der Meinung ist, dass es funktionieren sollte.)

Sie sollten dies entweder durch Installation von miredo beheben oder es erneut versuchen, bis Sie einen IPv4-Spiegel treffen.

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

8
user9565

Für andere Leser, die hierher kommen, während sie boot2docker verwenden, habe ich Folgendes behoben. Tatsächlich hat mich die obige Antwort 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 ordnungsgemäß 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
Eye

Starten Sie den Docker-Daemon unter Debian9 ne

service docker restart

und die Verbindungen und Netzwerke funktionieren gut

0
Nolwennig

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

0
speedplane