Ich kann keinen Befehl ausführen, der eine Internetverbindung in einem Docker-Container erfordert.
Werke:
docker run ubuntu /bin/echo 'Hello world'
Funktioniert nicht:
docker run ubuntu apt-get update
Err:1 http://archive.ubuntu.com/ubuntu xenial InRelease
Temporary failure resolving 'archive.ubuntu.com'
Err:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease
Temporary failure resolving 'archive.ubuntu.com'
Err:3 http://archive.ubuntu.com/ubuntu xenial-security InRelease
Temporary failure resolving 'archive.ubuntu.com'
Reading package lists...
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial/InRelease Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial-updates/InRelease Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial-security/InRelease Temporary failure resolving 'archive.ubuntu.com'
Ähnlich wie bei pip
und ping
.
Ich bin auf Ubuntu 16.04 und verwende keine Firewall oder einen Firmen-Proxy-Server und habe versucht, Docker neu zu starten.
Update:
Die Aktualisierung im interaktiven Modus schlägt auf dieselbe Weise fehl.
docker exec -ti angry_goodall /bin/bash
apt-get update
#fails
ping google.com
#fails with "unknown host" message
ping 8.8.8.8
# shows PING 8.8.8.8 (8.8.8.8): 56 data bytes
# and than hangs indefinetly
sudo apt-get update
Läuft erfolgreich auf dem Host, dh auf meinem Computer außerhalb von Docker.
Aktualisieren Sie Docker Version 1.12.1, Build 23cf638
networking
ubuntu
docker
Sashko Lykhenko
quelle
quelle
apt-get update
im interaktiven Modus mit dem Docker ausgeführt werden?Antworten:
Wie von creack zu GitHub, Ausgabe 866 für Docker, vorgeschlagen :
"Docker wird gezwungen, die Bridge neu zu erstellen und alle Netzwerkregeln neu zu erstellen."
quelle
-d
Flagge wird nicht verlassen.Bei StackOverflow gibt es ein ähnliches Problem, bei dem dieses Problem mit Docker 17.09 unter Ubuntu 16.04 durch eine andere Lösung behoben wird:
Überprüfen Sie den Inhalt von
resolv.conf
:Wenn es eine Zeile wie
nameserver 127.0.1.1
diese enthält, erhalten die Container einen falschen Nameserver. Um dies zu beheben, bearbeiten Sie dieNetworkManager.conf
Datei:Und kommentieren Sie die Zeile mit
dns=dnsmasq
; Die Datei sollte folgendermaßen aussehen:Starten Sie abschließend den Netzwerkmanager neu:
Testen Sie den Container erneut:
quelle
Das erste, was überprüft werden muss, ist
cat /etc/resolv.conf
der Docker-Container . 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ösenping 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. Also, wenn der Gastgeber/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 es
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