it-swarm.com.de

Keine Internetverbindung in Docker-Containern

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'

Ähnliches gilt für 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 die gleiche 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 wird erfolgreich auf dem Host ausgeführt, d. h. auf meinem Computer außerhalb von docker.

Upd Docker Version 1.12.1, Build 23cf638

18
Sashko Lykhenko

Wie von vorgeschlagen, lesen Sie in GitHub Ausgabe 866 für Docker :

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."

7
adampski

Es gibt ein ähnliches Problem bei StackOverflow, bei dem eine andere Lösung dieses Problem mit Docker 17.09 unter Ubuntu 16.04 löst:

Überprüfen Sie den Inhalt von resolv.conf:

$ cat /etc/resolv.conf

Wenn es eine Zeile wie nameserver 127.0.1.1 enthält, bedeutet dies, dass die Container einen falschen Nameserver erhalten. Um dies zu beheben, bearbeiten Sie die NetworkManager.conf-Datei:

$ Sudo pico /etc/NetworkManager/NetworkManager.conf

Und kommentiere die Zeile mit dns=dnsmasq aus; 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]
11
Luís de Sousa

Als erstes muss cat /etc/resolv.conf im Docker-Container ausgeführt werden. 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, sodass ping google.com fehlschlägt.

Als zweites muss cat /etc/resolv.conf auf dem Host-Rechner ausgeführt werden. Docker kopiert grundsätzlich den /etc/resolv.conf des Hosts bei jedem Start eines Containers in den Container. Wenn also der /etc/resolv.conf des Hosts falsch ist, ist dies auch für den Docker-Container der Fall.

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 den /etc/resolv.conf des Hosts. Dies ist etwas komplizierter, wird jedoch dynamisch generiert und der DNS-Server wird nicht hartcodiert.


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

  • /etc/docker/daemon.json bearbeiten

    {
        "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, füllt Docker /etc/resolv.conf mit den Werten aus 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 später

  • Ubuntu 18.04 wurde geändert, um systemd-resolved ZUM GENERIEREN VON /etc/resolv.conf zu verwenden. 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 in Ubuntu 18.04 standardmäßig auf /run/systemd/resolve/stub-resolv.conf (127.0.0.53) zeigt.

  • Ändern Sie einfach den Symlink so, dass er auf /run/systemd/resolve/resolv.conf zeigt, in dem die realen 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 sollte auf dem Host ein gültiger /etc/resolv.conf vorhanden sein, den Docker in die Container kopieren kann.

5
wisbucky