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
quelle
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 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:
quelle
ip link set down docker0
stattifconfig docker0 down
undsystemctl restart docker
stattservice docker start
. Um alle Bilder zu löschen, habe ichdocker rmi $(docker images -q)
/etc/init.d/docker restart
und es ist wieder betriebsbereitWenn es sich um ein DNS-Auflösungsproblem handelt, finden Sie hier die Lösung:
Als erstes müssen Sie
cat /etc/resolv.conf
den 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, sodassping google.com
ein Fehler auftritt.Das zweite zu überprüfende Element wird
cat /etc/resolv.conf
auf dem Host-Computer ausgeführt . Docker kopiert die Hosts grundsätzlich/etc/resolv.conf
jedes Mal in den Container, wenn ein Container gestartet wird. Wenn also der Host/etc/resolv.conf
falsch ist, ist auch der Docker-Container falsch.Wenn Sie festgestellt haben, dass der Host
/etc/resolv.conf
falsch ist, haben Sie zwei Möglichkeiten:Codieren Sie den DNS-Server in daemon.json fest. Dies ist einfach, aber nicht ideal, wenn Sie erwarten, dass sich der DNS-Server ändert.
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
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.conf
mit den Werten von gefülltdaemon.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 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-resolved
zu 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.conf
ist eigentlich ein symlink (ls -l /etc/resolv.conf
), der/run/systemd/resolve/stub-resolv.conf
in 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.conf
auf dem Host ein gültiger Docker vorhanden sein, der in die Container kopiert werden kann.quelle
systemd
Pakets nicht überleben ...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.conf
sah ursprünglich so aus.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:
/etc/default/docker
auf die Standardeinstellungen zurück, sodass Container stattdessen den Inhalt von resolv.conf meines Hosts verwenden./etc/NetworkManager/NetworManager.conf
die Zeile und kommentieren Sie sie ausdns=dnsmasq
. Auf diese Weise kann NM die tatsächlichen DNS-IP-Adressen anstelle von 127.0.0.1 angeben.sudo service network-manager restart
.sudo service docker restart
.Das Ausführen eines Containers würde dies
apt-get update/upgrade
beispielsweise ermöglichen.quelle
Ihr Fehler ist hier:
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
Das offizielle Docker-Dokument enthält Instrumente zum Konfigurieren eines DNS-Servers für die Verwendung durch Docker
Öffnen Sie die
/etc/default/docker
Datei zum Bearbeiten:Fügen Sie eine Einstellung für Docker hinzu:
Ersetzen Sie
8.8.8.8
durch einen lokalen DNS-Server wie192.168.1.1
. Sie können auch mehrere DNS-Server angeben. Trennte sie mit Leerzeichen, zum Beispiel: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-tool
kann verwendet werden, um den DNS-Server des lokalen Hosts zu überprüfenSpeichern und schließen Sie die Datei.
Starten Sie den Docker-Daemon neu.
quelle
/etc/docker/daemon.json
für Docker-Daemon-Einstellungen wie dns.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.
quelle
Ich hatte das gleiche Problem unter Windows. Dieser Befehl hat bei mir funktioniert:
docker-machine restart
quelle
Starten Sie den Docker-Daemon unter Debian9 neu
service docker restart
und die Verbindungen und Netzwerke funktionieren gut
quelle
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.
quelle