Docker Networking Disabled: ADVERTENCIA: El reenvío de IPv4 está deshabilitado. El trabajo en red no funcionará

106

Los contenedores de un host pierden "repentinamente" la conexión con los contenedores del mundo exterior. Sin embargo, algunos hosts se actualizaron y de repente tuvimos la siguiente situación:

  1. El anfitrión puede comunicarse con otros anfitriones.
  2. Los contenedores que se ejecutan en el host no se pueden comunicar con otros hosts.

He aquí un ejemplo:

[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

Ahora, desde el propio contenedor, no podemos hacer ping al mismo host:

[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

La primera vez que vi esta advertencia fue en las versiones iniciales de Docker ... Teniendo Docker 1.9.1 y 1.10.3, ¿Cómo solucionar este problema?

Marcello de Sales
fuente

Respuestas:

177

Revisé http://chrisgilmerproj.github.io/ubuntu/network/docker/2013/09/05/ipv4-forwarding-and-docker.html y me ayudó a resolver el problema en el host.

Agregué lo siguiente a /etc/sysctl.conf :

net.ipv4.ip_forward=1

Luego reinicié el servicio de red y validé la configuración:

[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

¡Todos los contenedores ahora pueden comunicarse con contenedores del mundo exterior!

Marcello de Sales
fuente
15
En Ubuntu necesitaba sudo sysctl -pvolver a cargar la configuración (no se encontró systemctl).
Nacho Coloma
2
Esta solución era necesaria en Centos 7 cuando simplemente se intentaba acceder al contenedor desde el host (para realizar pruebas).
Dave C
Tengo similares en contenedores que se ejecutan en un host de Windows (en Hyper-V). ¿Hay alguna configuración similar para Windows?
Anthony Mastrean
4
pero ¿POR QUÉ se necesita? la red funciona perfectamente sin reenvío, por lo tanto
ventana
2
@ user3338098, porque la red interna subyacente reenvía tráfico entre interfaces para obtener acceso a Internet. Esto ha sido necesario para indicar a cualquier sistema Linux que debe enrutar el tráfico entre interfaces de la forma en que lo hace un enrutador de red durante mucho tiempo. Esto está desactivado de forma predeterminada porque la mayoría de las cajas de Linux no reenvían y reenviar el tráfico accidentalmente sería una amenaza para la seguridad en el peor de los casos o complicaría su red en el mejor de los casos.
Josiah
25

Intente reiniciar el servicio Docker.

Por ejemplo, para Ubuntu:

$ sudo systemctl restart docker

DmitrySandalov
fuente
5
En CentOS7, este problema apareció de repente y simplemente reiniciar el servicio de la ventana acoplable funcionó perfectamente.
steven87vt
1
Esto funcionó, me pone nervioso que no sepa por qué funcionó. ¿Alguien tiene una pista? ¿O al menos pasos para repetir el fracaso?
Josiah
¿reproducción? Sucedió aquí después de actualizar Docker y reiniciar (en Oracle Linux Server versión 7.8 con kernel: - 3.10.0-1127.el7.x86_64 # 1 SMP Mié 1 de abril 10:20:09 PDT 2020 x86_64 x86_64 x86_64 GNU / Linux - actualizar Docker to: docker-ce-3: 19.03.8-3.el7.x86_64 a través de yum repo: @ docker-ol7-prod)
JohannesB
¡Funciona, gracias! ¿Pero alguien sabe cómo hizo el trabajo?
c0degeas
17

Intente agregar --network=hostjunto condocker run comando para solucionar este problema.

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

Ganesh Chandrasekaran
fuente
2
Útil para un solo recipiente en funcionamiento. El parámetro es--net=host
Max13
1
Ahora, el problema con este enfoque es que si tiene varios contenedores ejecutándose en paralelo, como en Jenkins, los puertos se comparten y corre el riesgo de tener problemas en esos puertos compartidos. Para ser específicos, estamos ejecutando pruebas de e2e con Cypress y tenemos problemas con Xvfb que no pueden generar una nueva instancia porque los puertos ya están tomados.
Alex Rashkov
1

Resolvió mi problema al reiniciar la red.

systemctl restart network
Cristiano Kubiaki
fuente