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?

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!


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


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


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

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.