Docker Networking Disabled: OSTRZEŻENIE: przekazywanie IPv4 jest wyłączone. Sieć nie będzie działać

106

Kontenery w hoście „nagle” tracą połączenie z kontenerami ze świata zewnętrznego. Jednak niektórzy gospodarze zostali odświeżeni i nagle mieliśmy następującą sytuację:

  1. Host może komunikować się z innymi hostami.
  2. Kontenery działające na hoście nie mogą komunikować się z innymi hostami.

Oto przykład:

[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

Teraz z samego kontenera nie możemy pingować tego samego hosta:

[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

Po raz pierwszy zobaczyłem to ostrzeżenie w początkowych wersjach Dockera ... Mając Docker 1.9.1 i 1.10.3, jak rozwiązać ten problem?

Marcello de Sales
źródło

Odpowiedzi:

177

Sprawdziłem http://chrisgilmerproj.github.io/ubuntu/network/docker/2013/09/05/ipv4-forwarding-and-docker.html i pomogło mi to rozwiązać problem na hoście.

Dodałem do /etc/sysctl.conf :

net.ipv4.ip_forward=1

Następnie ponownie uruchomiłem usługę sieciową i zweryfikowałem ustawienie:

[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

Wszystkie kontenery mogą teraz komunikować się z kontenerami świata zewnętrznego!

Marcello de Sales
źródło
15
W Ubuntu musiałem sudo sysctl -pprzeładować ustawienia (nie znaleziono systemctl).
Nacho Coloma
2
To rozwiązanie było potrzebne w Centos 7, gdy po prostu próbowano uzyskać dostęp do kontenera z hosta (w celu przetestowania).
Dave C
Podobnie mam w kontenerach działających na hoście Windows (na Hyper-V). Czy jest gdzieś podobne ustawienie dla systemu Windows?
Anthony Mastrean
4
ale DLACZEGO jest potrzebny? sieć działa idealnie bez przekazywania, więc docker też nie powinien tego wymagać ...
user3338098
2
@ user3338098, ponieważ podstawowa sieć wewnętrzna przekazuje ruch między interfejsami w celu uzyskania dostępu do Internetu. Było to potrzebne, aby wskazać każdemu systemowi linux, że ma on kierować ruch między interfejsami w sposób, w jaki router sieciowy robi to przez bardzo długi czas. Jest to domyślnie wyłączone, ponieważ większość urządzeń z systemem Linux nie przekazuje dalej, a przypadkowe przekazywanie ruchu mogłoby w najgorszym przypadku stanowić zagrożenie dla bezpieczeństwa lub w najlepszym przypadku bardzo skomplikować sieć.
Josiah
26

Spróbuj ponownie uruchomić usługę Docker.

Np. Dla Ubuntu:

$ sudo systemctl restart docker

DmitrySandalov
źródło
5
W CentOS7 ten problem nagle się pojawił i po prostu ponowne uruchomienie usługi dockera działało idealnie.
steven87vt
1
To zadziałało, denerwuje mnie, że nie wiem, dlaczego zadziałało. Czy ktoś ma wskazówkę? Albo przynajmniej kroki, aby powtórzyć awarię?
Josiah
reprodukcja? Stało się to tutaj po aktualizacji Dockera i ponownym uruchomieniu (na Oracle Linux Server w wersji 7.8 z jądrem: - 3.10.0-1127.el7.x86_64 # 1 SMP środa 1 kwietnia 10:20:09 PDT 2020 x86_64 x86_64 x86_64 GNU / Linux - aktualizacja Dockera do: docker-ce-3: 19.03.8-3.el7.x86_64 via yum repo: @ docker-ol7-prod)
JohannesB
1
Działa, dzięki! Ale ktoś wie, jak to się stało?
c0degeas
17

Spróbuj dodać --network=hostwraz z docker runpoleceniem, aby to naprawić.

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

Ganesh Chandrasekaran
źródło
2
Przydatne dla pojedynczego kontenera w ruchu. Parametr to--net=host
Max13
1
Problem z tym podejściem polega na tym, że jeśli masz wiele kontenerów działających równolegle, na przykład na Jenkins, porty są udostępniane i ryzykujesz napotkanie problemów na tych udostępnionych portach. Mówiąc konkretnie, przeprowadzamy testy e2e z Cypress i otrzymujemy problemy z Xvfb, które nie mogą odrodzić nowej instancji, ponieważ porty są już zajęte.
Alex Rashkov
1

Rozwiązałem mój problem z ponownym uruchomieniem sieci.

systemctl restart network
Cristiano Kubiaki
źródło