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 ufw
deaktiviert
sysctl -w net.ipv4.ip_forward=1
(auf Centos 6)sysctl -w net.ipv4.ip_forward=1
/etc/resolv.conf
auf dem Host- Computer habensysctl -w net.ipv4.ip_forward=1
ich rennen musstesudo service docker restart
.Antworten:
Als erstes muss
cat /etc/resolv.conf
im 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 daherping google.com
fehl.Die zweite zu überprüfende Sache 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. Wenn also der Host/etc/resolv.conf
falsch ist, wird auch der Docker-Container falsch sein.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 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
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.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 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-resolved
zum 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.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) verweist .Ändern Sie einfach den Symlink so, dass er auf verweist, in
/run/systemd/resolve/resolv.conf
dem 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.conf
Datei auf dem Host haben, damit Docker sie in die Container kopieren kann.quelle
systemctl
(Ubuntu 14.04) verfügt, versuchen Sie , den Netzwerkdienst neu zu starten. und / oder starten Sie Ihren Computer neu./etc/resolv.conf
beim Erstellen nicht in den Container übertragen, ich musste die Datei manuell in den Container kopieren.Durch Befolgen dieses Hinweises behoben:
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
iptables
und allem anfangen .sudo service docker restart
oder (wenn Sie sich in einer Linux-Distribution befinden, die keinen Upstart verwendet)sudo systemctl restart docker
quelle
docker -d
schlägt fehl. Es gibt keine-d
Flagge.ip link del docker0
docker -d
existiert in neueren Versionen nicht. Stattdessen:service docker stop
danndockerd
dannservice docker start
Der beabsichtigte Weg, Docker neu zu starten, besteht nicht darin, dies manuell zu tun, sondern den
service
Befehl oder init zu verwenden:quelle
systemctl enable docker
)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:
Dann (zumindest nach meiner Erfahrung), wenn Sie google.com von einem Container aus anpingen, ist alles in Ordnung.
quelle
Ich weiß nicht was ich tue, aber das hat bei mir funktioniert:
quelle
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
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. IchDOCKER_OPTS
habe Folgendes geändert :Ersetzen
internal_corporate_dns_address
durch die IP-Adresse oder FQDN unseres DNS und Neustart von Docker mitund dann meinen Container hervorgebracht und überprüft, ob er Zugang zum Internet hat.
quelle
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
Compose
Definition nichts auszusetzen war . Ein Neustart des VM / Docker-Daemons hat nicht geholfen. Es war auch kein DNS-Problem, da der Container nicht einmalping
eine 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
quelle
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.
quelle
sudo service iptables stop
undsudo chkconfig iptables off
(unter CentOS / RHEL) deaktivieren .Kein Internetzugang kann auch durch fehlende Proxy- Einstellungen verursacht werden . In diesem Fall
--network host
funktioniert möglicherweise auch nicht. Der Proxy kann konfiguriert werden, indem die Umgebungsvariablen festgelegt werdenhttp_proxy
undhttps_proxy
: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.
quelle
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
:quelle
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
Verwenden Sie --dns your_dns, wie von @jobin vorgeschlagen
Docker run --dns your_dns -it --name cowayay --hostname cowayay debian bash
quelle
Unter Windows (8.1) habe ich die Virtualbox-Schnittstelle (über taskmgr) beendet und das Problem behoben.
quelle
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:
quelle
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
Docker-Version: Docker-Version 19.03.0-rc2, Build f97efcc
quelle
Wenn Sie unter OSX arbeiten, müssen Sie Ihren Computer möglicherweise nach der Installation von Docker neu starten. Dies war manchmal ein Problem.
quelle
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>
quelle
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.
quelle
Für mich war mein Problem, dass iptables-services nicht installiert war. Dies funktionierte für mich (CentOS):
quelle
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.
quelle
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.
quelle
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=true
den[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
quelle
/usr/lib/sysctl.d/50-default.conf
aber die Syntax ist anders./etc/systemd/network/10-mainif.network
für mich. Andere Orte, die Sie überprüfen könnten, sind/usr/local/lib/systemd/
und/usr/lib/systemd/
gemäß der Systemd-Manpage.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.
quelle