Mein Docker-Container hat kein Internet


137

Ich hatte es in Ordnung, aber jetzt hörte es auf. Ich habe die folgenden Befehle ohne Erfolg ausprobiert:

docker run -dns 8.8.8.8 base ping google.com

docker run base ping google.com

sysctl -w net.ipv4.ip_forward=1 - sowohl auf dem Host als auch auf dem Container

Ich bekomme nur unknown host google.com. Docker Version 0.7.0

Irgendwelche Ideen?

PS auch ufwdeaktiviert


9
Ihre Frage hat mein Problem behoben: musste laufen sysctl -w net.ipv4.ip_forward=1(auf Centos 6)
qwertzguy

Da Sie möglicherweise ein Problem mit dem Docker-DNS-Routing haben, überprüfen Sie diese ähnliche Lösung stackoverflow.com/questions/35515203/…
Aditya Kresna Permana

Gleich hier, nachdem ich die /etc/resolv.conf auf der Host-Box repariert hatte, würde es nicht funktionieren ohnesysctl -w net.ipv4.ip_forward=1
Reeebuuk

Überprüfen Sie auch, ob Sie die richtigen Werte für /etc/resolv.confauf dem Host- Computer haben
Hanxue

für mich, nachdem sysctl -w net.ipv4.ip_forward=1ich rennen musste sudo service docker restart.
Asif Ali

Antworten:


99

Als erstes muss cat /etc/resolv.confim Docker-Container überprüft werden . Wenn es einen ungültigen DNS-Server hat, z. B. nameserver 127.0.x.x, kann der Container die Domänennamen nicht in IP-Adressen auflösen und schlägt daher ping google.comfehl.

Die zweite zu überprüfende Sache 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. Wenn also der Host /etc/resolv.conffalsch ist, wird auch der Docker-Container falsch sein.

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 kniffliger, wird jedoch dynamisch generiert und Sie codieren den DNS-Server nicht fest.


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 diese Änderungen wirksam werden:
    sudo systemctl restart docker

  • Wenn Sie jetzt einen Container ausführen / starten, wird 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 a #) in aus /etc/NetworkManager/NetworkManager.conf

  • Starten Sie den NetworkManager neu, um Folgendes neu 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-resolvedzum Generieren zu verwenden/etc/resolv.conf . Standardmäßig wird jetzt ein lokaler DNS-Cache 127.0.0.53 verwendet. Dies 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.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) verweist .

  • Ändern Sie einfach den Symlink so, dass er auf verweist, in /run/systemd/resolve/resolv.confdem 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 eine gültige /etc/resolv.confDatei auf dem Host haben, damit Docker sie in die Container kopieren kann.


1
Dies löste das Problem unter Ubuntu 16.04 mit Docker 17.09.
Luís de Sousa

2
Dies löste mein Problem (wie OP, Ubuntu 14.04 / Docker 18.01.0-ce). Dieser Link kann nützlich sein, um die Internetverbindung ohne Ping zu testen, wenn Ihr Docker-Image keinen Ping-Befehl enthält. Wenn Ihr Host nicht über systemctl(Ubuntu 14.04) verfügt, versuchen Sie , den Netzwerkdienst neu zu starten. und / oder starten Sie Ihren Computer neu.
Benjamin

Lief wie am Schnürchen!
Homewrecker

1
Dies funktioniert unter Ubuntu 18.04 (Option B). Allerdings hat Docker das jetzt korrekte /etc/resolv.confbeim Erstellen nicht in den Container übertragen, ich musste die Datei manuell in den Container kopieren.
Glaux

1
Auf meinem Computer (RedHat 7.4) ist die Konfigurationsdatei des Hosts korrekt, aber die Containerdatei zeigt immer noch auf 172.0.0.11. Was tun jetzt?
Martin Majewski

89

Durch Befolgen dieses Hinweises behoben:

[...] können Sie versuchen, alles zurückzusetzen?

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 aktivieren

https://github.com/dotcloud/docker/issues/866#issuecomment-19218300

Scheint, dass die Schnittstelle irgendwie "gehängt" wurde.

Update für neuere Versionen von Docker:

Die obige Antwort erledigt möglicherweise immer noch die Arbeit für Sie, aber es ist schon ziemlich lange her, dass diese Antwort veröffentlicht wurde und Docker jetzt besser ist. Versuchen Sie diese also zuerst, bevor Sie mit iptablesund allem anfangen .

sudo service docker restart oder (wenn Sie sich in einer Linux-Distribution befinden, die keinen Upstart verwendet) sudo systemctl restart docker


31
docker -dschlägt fehl. Es gibt keine -dFlagge.
Luís de Sousa

1
Für diejenigen, die das Problem noch haben, gibt es eine offene Ausgabe auf Mobys Github, die seit über einem Jahr geöffnet ist: github.com/moby/moby/issues/26567
Nepoxx

1
@ Pawan:ip link del docker0
Drawrockshard

1
oder installieren Sie Bridge-Utils
cjdcordeiro

5
docker -dexistiert in neueren Versionen nicht. Stattdessen: service docker stopdann dockerddannservice docker start
Telmo Marques

64

Der beabsichtigte Weg, Docker neu zu starten, besteht nicht darin, dies manuell zu tun, sondern den serviceBefehl oder init zu verwenden:

service docker restart

5
Wenn Sie in einer Linux-Distribution sind, die keinen Upstart verwendet, hat Sudo Systemctl Restart Docker für mich
funktioniert

Neustart hat gut funktioniert. Ich weiß nicht, ob es damit zu tun hat, dass ich es aktiviert habe, um "automatisch zu starten" ( systemctl enable docker)
Lucas Pottersky

Scheint für die Frage des OP nicht relevant zu sein.
Kevin Buchs

Dies ist der Fall, da in der von OP beschriebenen Situation das Zurücksetzen des Dockers die Netzwerkschnittstellen neu initialisiert und somit den Internetzugang wieder aktiviert. Es ist wahr, dass dies nicht das WARUM anspricht, warum es manchmal kaputt geht, aber es bietet eine Lösung für das Problem.
Bitmaske

In der Produktionsumgebung ist ein Neustart des Dockers jedoch nicht möglich. Wie kann das Problem in diesem Fall gelöst werden?
Suyanhanx

22

Aktualisieren dieser Frage mit einer Antwort für OSX (mit Docker Machine)

Wenn Sie Docker unter OSX mit Docker Machine ausführen, hat Folgendes für mich funktioniert:

docker-machine restart

<...wait for it to restart, which takes up to a minute...>

docker-machine env
eval $(docker-machine env)

Dann (zumindest nach meiner Erfahrung), wenn Sie google.com von einem Container aus anpingen, ist alles in Ordnung.


Funktionierte auch in Windows, damit der Netzwerkzugriff wieder funktioniert.
Mikael Lepistö

1
Das hat bei mir funktioniert. Ich habe ein Docker-Symbol in der oberen Menüleiste, im Menü hatte ich eine "Neustart" -Option. Danach war die Vernetzung wieder in Ordnung
olidem

8

Ich weiß nicht was ich tue, aber das hat bei mir funktioniert:

OTHER_BRIDGE=br-xxxxx # this is the other random docker bridge (`ip addr` to find)    
service docker stop

ip link set dev $OTHER_BRIDGE down
ip link set dev docker0 down
ip link delete $OTHER_BRIDGE type bridge
ip link delete docker0 type bridge
service docker start && service docker stop

iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE
iptables -t nat -A POSTROUTING ! -o docker0 -s 172.18.0.0/16 -j MASQUERADE

service docker start

2
schönes Klebeband!
dctremblay

1
Ihre Antwort hat geholfen, ein ähnliches Problem zu lösen. Ich habe Stunden damit verbracht! Nach unvollständiger Kubespray-Installation haben Docker-Container das Internet mit der Meldung "Temporäre Fehlerbehebung" verloren, wenn versucht wurde, einen öffentlichen Host oder eine IP-Adresse zu pingen. Also hatte ich diese Regel nicht, die obligatorisch ist - iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE. Sie können überprüfen, ob Sie diese Regel mitiptables -t nat -L POSTROUTING
Laimison

6

Ich habe verwendet DOCKER_OPTS="--dns 8.8.8.8"und später festgestellt, dass mein Container keinen direkten Zugang zum Internet hatte, aber auf mein Unternehmens-Intranet zugreifen konnte. Ich DOCKER_OPTShabe Folgendes geändert :

DOCKER_OPTS="--dns <internal_corporate_dns_address"

Ersetzen internal_corporate_dns_addressdurch die IP-Adresse oder FQDN unseres DNS und Neustart von Docker mit

sudo service docker restart

und dann meinen Container hervorgebracht und überprüft, ob er Zugang zum Internet hat.


5

Ich war ratlos, als dies für mich zufällig für einen meiner Container passierte, während die anderen Container in Ordnung waren. Der Container war an mindestens ein nicht internes Netzwerk angeschlossen, sodass an der ComposeDefinition nichts auszusetzen war . Ein Neustart des VM / Docker-Daemons hat nicht geholfen. Es war auch kein DNS-Problem, da der Container nicht einmal pingeine externe IP konnte. Was es für mich gelöst hat, war, die Docker-Netzwerke neu zu erstellen. In meinem Fall,docker-compose down && docker-compose up funktioniert.

Komponieren

Dies erzwingt die Wiederherstellung aller Netzwerke aller Container:

docker-compose down && docker-compose up

Schwarmmodus

Ich nehme an, Sie entfernen einfach den Dienst und erstellen ihn neu, wodurch die Netzwerke des Dienstes neu erstellt werden:

docker service rm some-service

docker service create ...

Wenn die Netzwerke des Containers extern sind

Entfernen Sie einfach die externen Netzwerke dieses Dienstes und erstellen Sie sie neu:

docker network rm some-external-network

docker network create some-external-network


4

Für mich war es die Firewall des Hosts. Ich musste DNS auf der Firewall des Hosts zulassen. Außerdem musste Docker nach dem Ändern der Host-Firewall-Einstellung neu gestartet werden.


Oder Sie können die iptables mit sudo service iptables stopund sudo chkconfig iptables off(unter CentOS / RHEL) deaktivieren .
MichaelZ

4

Kein Internetzugang kann auch durch fehlende Proxy- Einstellungen verursacht werden . In diesem Fall --network hostfunktioniert möglicherweise auch nicht. Der Proxy kann konfiguriert werden, indem die Umgebungsvariablen festgelegt werden http_proxyund https_proxy:

docker run -e "http_proxy=YOUR-PROXY" \
           -e "https_proxy=YOUR-PROXY"\
           -e "no_proxy=localhost,127.0.0.1" ... 

Vergessen Sie nicht, auch no_proxy oder alle festzulegen Anforderungen (einschließlich der an localhost) über den Proxy .

Weitere Informationen: Proxy-Einstellungen im Archlinux-Wiki.


1
Das war die Lösung für mich. Achtung: Ich habe alpine verwendet, das eine Busybox-Implementierung von wget enthält, die die Proxy-Einstellungen zu ignorieren scheint. Daher habe ich den Vorteil der Einstellung der Umgebungsvariablen nicht gesehen.
Pelson

Vielen Dank für den Hinweis zu Busybox; Ich wusste es noch nicht!
Simon A. Eugster

1
Beachten Sie, dass einige Betriebssysteme Großbuchstaben benötigen, wie im Link zur Dokumentation .
Flo

3

Für mich war es eine Iptables-Weiterleitungsregel. Aus irgendeinem Grund hat die folgende Regel in Verbindung mit den iptables-Regeln des Dockers dazu geführt, dass der gesamte ausgehende Datenverkehr von Containern getroffen wurde localhost:8080:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8080

3
Also ... was ist die Lösung? :) Ich habe die erste Regel und benötige sie, um eingehenden Verkehr auf 80 bis 8080 umzuleiten. Wie ändere ich dies, um den ausgehenden Verkehr nicht zu beeinflussen?
Mrooney

3

Ich hatte das Problem unter Ubuntu 18.04. Das Problem war jedoch mit dem DNS. Ich war in einem Unternehmensnetzwerk, das einen eigenen DNS-Server hat und andere DNS-Server blockiert. Dies dient zum Blockieren einiger Websites (Pornos, Torrents, ... usw.)

Um Ihr Problem zu lösen

  1. Finden Sie Ihren DNS auf dem Host-Computer
  2. Verwenden Sie --dns your_dns, wie von @jobin vorgeschlagen

    Docker run --dns your_dns -it --name cowayay --hostname cowayay debian bash


2

Unter Windows (8.1) habe ich die Virtualbox-Schnittstelle (über taskmgr) beendet und das Problem behoben.


2

Möglicherweise haben Sie Ihr Docker mit DNS-Optionen gestartet --dns 172.x.x.x

Ich hatte den gleichen Fehler und entfernte die Optionen aus /etc/default/docker

Die Linien:

# Use DOCKER_OPTS to modify the daemon startup options.
DOCKER_OPTS="--dns 172.x.x.x"

2

Für Ubuntu 19.04 mit openconnect 8.3 für VPN musste ich /etc/resolve.conf mit dem in systemd verknüpfen (Gegenteil von answerby wisbucky).

sudo ln -sf /etc/resolv.conf /run/systemd/resolve/resolv.conf

Schritte zum Debuggen

  1. Stellen Sie eine Verbindung zum Firmen-VPN her
  2. Suchen Sie in /etc/resolv.conf oder /run/systemd/resolve/resolv.conf nach korrekten VPN-Einstellungen
  3. Je nachdem, welche DNS-Einstellungen korrekt sind, verknüpfen wir diese mit der anderen Datei (Hinweis: Platzieren Sie eine mit den richtigen Einstellungen links neben der Zuweisung).

Docker-Version: Docker-Version 19.03.0-rc2, Build f97efcc


2
Danke dir. Unter Ubuntu 18.04 wurde beim Herstellen einer Verbindung zum Unternehmens-VPN nur die Datei /etc/resolve.conf vom DHCP aktualisiert, und die Datei / run / systemd / resolve / resolve / conf blieb konstant / statisch. Diese Lösung hat geholfen. Jetzt stellen Container auf dem lokalen Computer eine Verbindung zu Servern im VPN her (was für mich nicht früher der
Fall war

1

Wenn Sie unter OSX arbeiten, müssen Sie Ihren Computer möglicherweise nach der Installation von Docker neu starten. Dies war manchmal ein Problem.


1

Ursprünglich konnte mein Docker-Container das externe Internet erreichen (dies ist ein Docker-Dienst / Container, der auf einem Amazon EC2 ausgeführt wird).

Da es sich bei meiner App um eine API handelt, habe ich nach der Erstellung meines Containers (es gelang mir, alle benötigten Pakete abzurufen) meine IP-Tabellen aktualisiert, um den gesamten Datenverkehr von Port 80 zu dem Port zu leiten, an dem sich meine API (auf Docker ausgeführt) befand zuhören.

Als ich später versuchte, den Container neu aufzubauen, schlug dies fehl. Nach langem Hin und Her stellte ich fest, dass mein vorheriger Schritt (Festlegen der IPTable-Portweiterleitungsregel) die externen Netzwerkfunktionen des Dockers durcheinander brachte.

Lösung: Beenden Sie Ihren IPTable-Dienst:

sudo service iptables stop

Starten Sie den Docker-Daemon neu:

sudo service docker restart

Versuchen Sie dann, Ihren Container neu aufzubauen. Hoffe das hilft.


Nachverfolgen

Ich habe völlig übersehen, dass ich mich nicht mit den IP-Tabellen herumschlagen musste, um eingehenden Datenverkehr an 80 an den Port weiterzuleiten, auf dem die auf Docker ausgeführte API ausgeführt wurde. Stattdessen habe ich Port 80 nur auf den Port ausgerichtet, auf dem die API im Docker ausgeführt wurde:

docker run -d -p 80:<api_port> <image>:<tag> <command to start api>


1

Fügen Sie dies hier hinzu, falls jemand in einem Virtualbox-Container, in dem Docker ausgeführt wird, auf dieses Problem stößt. Ich habe das Virtualbox-Netzwerk so konfiguriert, dass es anstelle von nat überbrückt wird, und das Problem ist behoben.


1

Für mich war mein Problem, dass iptables-services nicht installiert war. Dies funktionierte für mich (CentOS):

sudo yum install iptables-services
sudo service docker restart

Denken Sie daran, iptable-Dienste zu starten und zu aktivieren
Jay

1

Auf Centos 8 bestand mein Problem darin, dass ich iptables vor dem Start des Docker-Dienstes nicht installiert und gestartet habe. Stellen Sie sicher, dass der iptables-Dienst aktiv ist, bevor Sie den Docker-Dienst starten.


0

Ich bin auch auf ein solches Problem gestoßen, als ich versucht habe, ein Projekt mit Docker-Compose unter Ubuntu einzurichten.

Der Docker hatte überhaupt keinen Zugang zum Internet, als ich versuchte, eine IP-Adresse zu pingen oder eine URL zu suchen - es schlug die ganze Zeit fehl.

Ich habe alle möglichen Lösungen mit der oben beschriebenen DNS-Auflösung ohne Erfolg ausprobiert.

Ich verbrachte den ganzen Tag damit, herauszufinden, was zum Teufel los ist, und fand schließlich heraus, dass die Ursache aller Probleme das Antivirus war, insbesondere die Firewall, die Docker aus irgendeinem Grund daran hinderte, die IP-Adresse und den Port zu erhalten.

Als ich es deaktiviert habe, hat alles gut funktioniert.

Wenn Sie also ein Antivirenprogramm installiert haben und nichts zur Behebung des Problems beiträgt, liegt das Problem möglicherweise an der Firewall des Antivirenprogramms.


0

Ich hatte in den letzten Tagen ein ähnliches Problem. Für mich war die Ursache eine Kombination aus systemd, docker und meinem Hosting-Anbieter. Ich verwende aktuelles CentOS (7.7.1908).

Mein Hosting-Anbieter generiert automatisch eine Konfigurationsdatei für systemd-networkd. Beginnend mit systemd 219, der aktuellen Version für CentOS 7, übernahm systemd-networkd die Kontrolle über netzwerkbezogene sysctl-Parameter. Docker scheint mit dieser Version nicht kompatibel zu sein und setzt die IP-Weiterleitungsflags bei jedem Start eines Containers zurück.

Meine Lösung bestand darin, IPForward=trueden [Network]Abschnitt meiner vom Anbieter generierten Konfigurationsdatei hinzuzufügen . Diese Datei befindet sich möglicherweise an mehreren Stellen, höchstwahrscheinlich in /etc/systemd/network.

Der Prozess wird auch in den offiziellen Docker-Dokumenten beschrieben: https://docs.docker.com/v17.09/engine/installation/linux/linux-postinstall/#ip-forwarding-problems


Könnten Sie bitte den genauen Ort angeben, an dem Sie diesen Parameter eingestellt haben? Ich habe genau den gleichen Speicherort wie Sie, führe eine VM auf der Google Cloud Platform aus und konnte keine * .network-Dateien auf dem Server finden. Nur ein, /usr/lib/sysctl.d/50-default.confaber die Syntax ist anders.
el.severo

Mein Cluster ist selbst verwaltet und mein Provider führt nur grundlegende Bootstrapping-Aktionen beim Setup durch. Die Netzwerkkonfiguration war /etc/systemd/network/10-mainif.networkfür mich. Andere Orte, die Sie überprüfen könnten, sind /usr/local/lib/systemd/und /usr/lib/systemd/gemäß der Systemd-Manpage.
BlackCetha

0

Für mich war es mit Centos 7.4 kein Problem mit /etc/resolve.conf, iptables, iptables nat rules oder Docker selbst. Das Problem ist, dass dem Host das Paket Bridge-Utils fehlt, das Docker benötigt, um die Bridge mit dem Befehl brctl zu erstellen. yum installiere -y Bridge-Utils und starte Docker neu, löse das Problem.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.