Docker-Netzwerk deaktiviert: WARNUNG: Die IPv4-Weiterleitung ist deaktiviert. Netzwerk funktioniert nicht

106

Container in einem Host verlieren "plötzlich" die Verbindung zu Containern außerhalb der Welt. Einige Gastgeber wurden jedoch aktualisiert und plötzlich hatten wir die folgende Situation:

  1. Der Host kann mit anderen Hosts kommunizieren.
  2. Auf dem Host ausgeführte Container können nicht mit anderen Hosts kommunizieren.

Hier ist ein Beispiel:

[root@pprdespap322 deploy]# ping ci.docker.company.net
PING pprdespap324.corp.company.net (10.137.55.22) 56(84) bytes of data.
64 bytes from pprdespap324.corp.company.net (10.137.55.22): icmp_seq=1 ttl=64 time=0.282 ms
64 bytes from pprdespap324.corp.company.net (10.137.55.22): icmp_seq=2 ttl=64 time=0.341 ms
^C
--- pprdespap324.corp.company.net ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.282/0.311/0.341/0.034 ms

Vom Container selbst aus können wir nicht denselben Host anpingen:

[root@pprdespap322 deploy]# docker run -ti quay.io/coreos/registry ping ci.docker.company.net
WARNING: IPv4 forwarding is disabled. Networking will not work.
ping: unknown host ci.docker.company.net

Das erste Mal, dass ich diese Warnung sah, war in den ersten Versionen von Docker ... Mit Docker 1.9.1 und 1.10.3, Wie kann man dieses Problem lösen?

Marcello de Sales
quelle

Antworten:

177

Ich habe http://chrisgilmerproj.github.io/ubuntu/network/docker/2013/09/05/ipv4-forwarding-and-docker.html überprüft und es hat mir geholfen, das Problem auf dem Host zu lösen.

Ich habe Folgendes zu /etc/sysctl.conf hinzugefügt :

net.ipv4.ip_forward=1

Ich habe dann den Netzwerkdienst neu gestartet und die Einstellung überprüft:

[root@pprdespap322 deploy]#  systemctl restart network
[root@pprdespap322 deploy]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
[root@pprdespap322 deploy]# docker run -ti quay.io/coreos/registry ping ci.docker.company.net
PING pprdespap324.corp.company.net (10.137.55.22) 56(84) bytes of data.
64 bytes from pprdespap324.corp.company.net (10.137.55.22): icmp_seq=1 ttl=63 time=0.329 ms
64 bytes from pprdespap324.corp.company.net (10.137.55.22): icmp_seq=2 ttl=63 time=0.306 ms
^C
--- pprdespap324.corp.company.net ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.306/0.317/0.329/0.021 ms

Alle Container können jetzt mit Containern der Außenwelt kommunizieren!

Marcello de Sales
quelle
15
Unter Ubuntu musste ich sudo sysctl -pdie Einstellungen neu laden (systemctl wurde nicht gefunden).
Nacho Coloma
2
Diese Lösung wurde unter Centos 7 benötigt, wenn lediglich versucht wurde, vom Host aus auf den Container zuzugreifen (zum Testen).
Dave C
Ich habe ähnliche in Containern, die auf einem Windows-Host (auf Hyper-V) ausgeführt werden. Gibt es irgendwo eine ähnliche Einstellung für Windows?
Anthony Mastrean
4
aber warum wird es gebraucht? Das Netzwerk funktioniert einwandfrei ohne Weiterleitung, daher sollte Docker es auch nicht benötigen ...
user3338098
2
@ user3338098, da das zugrunde liegende interne Netzwerk Datenverkehr zwischen Schnittstellen weiterleitet, um Internetzugang zu erhalten. Dies wurde benötigt, um jedem Linux-System anzuzeigen, dass der Datenverkehr zwischen Schnittstellen so weitergeleitet werden soll, wie es ein Netzwerkrouter über einen sehr langen Zeitraum tut. Dies ist standardmäßig deaktiviert, da die meisten Linux-Boxen keine Weiterleitung durchführen und das versehentliche Weiterleiten von Datenverkehr im schlimmsten Fall eine Sicherheitsbedrohung darstellt oder Ihr Netzwerk im besten Fall wirklich kompliziert.
Josiah
23

Starten Sie den Docker-Dienst neu.

ZB für Ubuntu:

$ sudo systemctl restart docker

DmitrySandalov
quelle
5
Unter CentOS7 trat dieses Problem plötzlich auf und der einfache Neustart des Docker-Dienstes funktionierte einwandfrei.
steven87vt
1
Das hat funktioniert, macht mich nervös, dass ich nicht weiß, warum es funktioniert hat. Hat jemand eine Ahnung? Oder zumindest Schritte, um den Fehler zu wiederholen?
Josiah
Reproduktion? Dies geschah hier nach dem Upgrade von Docker und dem Neustart (unter Oracle Linux Server Version 7.8 mit Kernel: - 3.10.0-1127.el7.x86_64 # 1 SMP Mi Apr 1 10:20:09 PDT 2020 x86_64 x86_64 x86_64 GNU / Linux - Docker aktualisieren an: docker-ce-3: 19.03.8-3.el7.x86_64 über yum repo: @ docker-ol7-prod)
JohannesB
17

Versuchen Sie, --network=hostzusammen mit dem docker runBefehl hinzuzufügen , um dies zu beheben.

https://medium.com/@gchandra/docker-ipv4-forwarding-is-disabled-8499ce59231e

Ganesh Chandrasekaran
quelle
2
Nützlich für einen einzelnen Container beim Laufen. Der Parameter ist--net=host
Max13
1
Das Problem bei diesem Ansatz besteht nun darin, dass mehrere Container parallel ausgeführt werden, wie bei Jenkins. Die Ports werden gemeinsam genutzt, und es besteht die Gefahr, dass Probleme bei diesen gemeinsam genutzten Ports auftreten. Um genau zu sein, führen wir e2e-Tests mit Cypress durch und es treten Probleme mit Xvfb auf, die keine neue Instanz erzeugen können, da bereits Ports belegt sind.
Alex Rashkov
1

Mein Problem beim Neustart des Netzwerks wurde behoben.

systemctl restart network
Cristiano Kubiaki
quelle