Докер-мережа відключена: ПОПЕРЕДЖЕННЯ: Переадресація IPv4 відключена. Мережа не працюватиме


106

Контейнери в хості "раптово" втрачають зв'язок із контейнерами із зовнішнього світу. Однак деякі господарі були оновлені, і раптом у нас виникла така ситуація:

  1. Ведучий може спілкуватися з іншими хостами.
  2. Контейнери, що працюють в хості, не можуть спілкуватися з іншими хостами.

Ось приклад:

[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

Тепер із самого контейнера ми не можемо пінгнути того самого хоста:

[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

Я вперше побачив це попередження в початкових версіях Docker ... Маючи Docker 1.9.1 та 1.10.3, як вирішити цю проблему?

Відповіді:


177

Я переглянув http://chrisgilmerproj.github.io/ubuntu/network/docker/2013/09/05/ipv4-forwarding-and-docker.html, і це допомогло мені вирішити проблему на хості.

До /etc/sysctl.conf я додав :

net.ipv4.ip_forward=1

Потім я перезапустив мережевий сервіс і підтвердив налаштування:

[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

Усі контейнери тепер можуть спілкуватися з контейнерами із зовнішнього світу!


15
На Ubuntu мені потрібно sudo sysctl -pбуло перезавантажити налаштування (systemctl не знайдено).
Nacho Coloma

2
Це рішення було потрібне Centos 7, коли він просто намагався отримати доступ до контейнера від хоста (для тестування).
Дейв С

У мене є подібне в контейнерах, що працюють на хості Windows (на Hyper-V). Чи є подібні налаштування десь для Windows?
Ентоні Мастрен

4
але ЧОМУ це потрібно? мережа працює ідеально без переадресації, тому докер також не повинен цього вимагати ...
user3338098

2
@ user3338098, оскільки основна внутрішня мережа пересилає трафік між інтерфейсами для отримання доступу до Інтернету. Це було потрібно для того, щоб вказати будь-якій системі Linux про те, що він повинен маршрутизувати трафік між інтерфейсами так, як це робить мережевий маршрутизатор дуже довго. Це вимкнено за замовчуванням, оскільки більшість ящиків Linux не переадресовує, а пересилання трафіку випадково було б у найгіршому випадку загрозою безпеці або дійсно ускладнить вашу мережу.
Йосія

25

Спробуйте перезапустити службу Docker.

Напр. Для Ubuntu:

$ sudo systemctl restart docker


5
У CentOS7 ця проблема несподівано з’явилася, і просто перезапустити службу докера спрацювало чудово.
steven87vt

1
Це спрацювало, змусило мене нервувати, що я не знаю, чому це спрацювало. Хтось має підказку? Або хоча б кроки, щоб повторити провал?
Йосія

відтворення? Це сталося тут після оновлення Docker та перезавантаження (на Oracle Linux Server 7.8 з ядром: - 3.10.0-1127.el7.x86_64 # 1 SMP ср. 1 квітня 10:20:09 PDT 2020 x86_64 x86_64 x86_64 GNU / Linux - оновлення Docker до: docker-ce-3: 19.03.8-3.el7.x86_64 via yum repo: @ docker-ol7-prod)
JohannesB

Це працює, дякую! Але хто знає, як це зробили?
c0degeas

17

Спробуйте додати --network=hostразом із docker runкомандою, щоб виправити це.

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


2
Корисно для одного контейнера під час руху. Параметр--net=host
Max13,

1
Тепер проблема з таким підходом полягає в тому, що у вас паралельно працює кілька контейнерів, як, наприклад, у Дженкінса, порти поділяються спільно, і ви ризикуєте потрапити на проблеми з тими спільними портами. Для конкретності ми запускаємо тести e2e з Cypress, і ми отримуємо проблеми з Xvfb не в змозі породити новий екземпляр, оскільки порти вже прийняті.
Олексій Рашков

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.