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

Romeo Mihalcea
quelle
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.

wisbucky
quelle
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

Romeo Mihalcea
quelle
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
Bitmaske
quelle
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.

linke Hand
quelle
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
dctremblay
quelle
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.

Job in
quelle
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

LJ
quelle
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.

Adrian Gunawan
quelle
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.

Simon A. Eugster
quelle
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
brandones
quelle
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

Adelin
quelle
2

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

Eli
quelle
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"
Thami Bouchnafa
quelle
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

Jeff Beagley
quelle
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.

Will Stern
quelle
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>

Achintya Ashok
quelle
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.

Thorie
quelle
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
Viet Hoang
quelle
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.

Rajesh Guptan
quelle
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.

Rocckk
quelle
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

BlackCetha
quelle
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.

Jasonw
quelle