Keine Internetverbindung in Docker-Containern

24

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 pipund 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

Sashko Lykhenko
quelle
Können Sie eine Domain vom Host pingen? Können Sie apt-get updateim interaktiven Modus mit dem Docker ausgeführt werden?
Adampski
In der Ausgabe wird der Fehler angezeigt: Temporärer Fehler bei der Behebung von 'archive.ubuntu.com' ... versuchen Sie es mit einem Ping-Befehl auf www.google.com .. Sehen Sie, ob Sie dieselbe Antwort erhalten .. dann versuchen Sie es mit einem Ping-Befehl auf 8.8.8.8 .. Wenn die IP funktioniert und der Hostname nicht, ist Ihr DNS defekt (mehr /etc/resolv.conf, um zu sehen, welcher DNS-Server verwendet wird)
TG2
@adampski, ich habe die Frage basierend auf Ihren Vorschlägen aktualisiert.
Sashko Lykhenko
@ TG2, ich habe die Frage auch basierend auf Ihren Vorschlägen aktualisiert.
Sashko Lykhenko
Welche Version der Docker-Engine verwenden Sie?
Adampski

Antworten:

13

Wie von creack zu GitHub, Ausgabe 866 für Docker, vorgeschlagen :

pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
docker -d

"Docker wird gezwungen, die Bridge neu zu erstellen und alle Netzwerkregeln neu zu erstellen."

adampski
quelle
1
Ich habe es versucht, und das tötet das Netzwerk auf meinem gesamten Computer.
Petersohn
Dies ist hilfreich und hat das Problem für mich gelöst. Vielen Dank.
Rao
10
Die -dFlagge wird nicht verlassen.
Luís de Sousa
2
Hi @ LuísdeSousa, es ist eine Schande, dass Sie dies abgelehnt haben, aber die Möglichkeit in Betracht ziehen, dass möglicherweise einige Schalter in neueren Releases entfernt oder geändert wurden. Zumal dies vor über einem Jahr war.
Adampski
3
Anstatt nur den Befehl zu kopieren / zu überschreiben, könnten Sie erklären, was diese bedeuten :)
Adelin
12

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:

$ cat /etc/resolv.conf

Wenn es eine Zeile wie nameserver 127.0.1.1diese enthält, erhalten die Container einen falschen Nameserver. Um dies zu beheben, bearbeiten Sie die NetworkManager.confDatei:

$ sudo pico /etc/NetworkManager/NetworkManager.conf

Und kommentieren Sie die Zeile mit dns=dnsmasq; Die Datei sollte folgendermaßen aussehen:

[main]
plugins=ifupdown,keyfile,ofono
#dns=dnsmasq

[ifupdown]
managed=false

Starten Sie abschließend den Netzwerkmanager neu:

$ sudo systemctl restart network-manager

Testen Sie den Container erneut:

$ docker run ubuntu:16.04 apt-get update
Get:1 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB]
Get:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [102 kB]
Luís de Sousa
quelle
Meine Installation stimmte mit der Beschreibung überein und der oben beschriebene Ansatz löste das Problem für mich.
Krcools
aktualisiert Antwort für Ubuntu 18.04: superuser.com/a/1335054
wisbucky
7

Das erste, was überprüft werden muss, ist cat /etc/resolv.confder 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.confauf dem Host-Computer ausgeführt . Docker kopiert die Hosts grundsätzlich /etc/resolv.confjedes 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.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 es 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