Docker Networking Disabled: ATTENZIONE: l'inoltro IPv4 è disabilitato. La rete non funzionerà


106

I contenitori in un host perdono "improvvisamente" la connessione ai contenitori esterni. Tuttavia, alcuni host sono stati aggiornati e improvvisamente abbiamo avuto la seguente situazione:

  1. L'host può comunicare con altri host.
  2. I contenitori in esecuzione nell'host non possono comunicare con altri host.

Ecco un esempio:

[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

Ora, dal contenitore stesso, non possiamo eseguire il ping dello stesso 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 prima volta che ho visto questo avviso era nelle versioni iniziali di Docker ... Avendo Docker 1.9.1 e 1.10.3, come risolvere questo problema?

Risposte:


177

Ho esaminato http://chrisgilmerproj.github.io/ubuntu/network/docker/2013/09/05/ipv4-forwarding-and-docker.html e mi ha aiutato a risolvere il problema sull'host.

Ho aggiunto quanto segue a /etc/sysctl.conf :

net.ipv4.ip_forward=1

Ho quindi riavviato il servizio di rete e convalidato l'impostazione:

[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

Tutti i container ora possono comunicare con i container del mondo esterno!


15
Su Ubuntu avevo bisogno sudo sysctl -pdi ricaricare le impostazioni (systemctl non è stato trovato).
Nacho Coloma

2
Questa soluzione era necessaria su Centos 7 quando si cercava semplicemente di accedere al container dall'host (per il test).
Dave C

Sto avendo simili in contenitori in esecuzione su un host Windows (su Hyper-V). Esiste un'impostazione simile da qualche parte per Windows?
Anthony Mastrean

4
ma PERCHÉ è necessario? la rete funziona perfettamente senza inoltro, quindi docker non dovrebbe richiederlo neanche ...
user3338098

2
@ user3338098, perché la rete interna sottostante inoltra il traffico tra le interfacce per ottenere l'accesso a Internet. Ciò è stato necessario per indicare a qualsiasi sistema Linux che deve instradare il traffico tra le interfacce nel modo in cui fa un router di rete per un tempo molto lungo. Questo è disattivato per impostazione predefinita perché la maggior parte delle macchine Linux non esegue l'inoltro e inoltrare accidentalmente il traffico sarebbe una minaccia alla sicurezza nel peggiore dei casi o complicherebbe davvero la rete nel migliore dei casi.
Josiah

25

Prova a riavviare il servizio Docker.

Ad esempio per Ubuntu:

$ sudo systemctl restart docker


5
Su CentOS7 questo problema è apparso all'improvviso e il semplice riavvio del servizio Docker ha funzionato perfettamente.
steven87vt

1
Questo ha funzionato, mi rende nervoso perché non so perché ha funzionato. Qualcuno ha un'idea? O almeno passi per ripetere il fallimento?
Josiah il

riproduzione? È successo qui dopo l'aggiornamento di Docker e il riavvio (su Oracle Linux Server versione 7.8 con kernel: - 3.10.0-1127.el7.x86_64 # 1 SMP mercoledì 1 aprile 10:20:09 PDT 2020 x86_64 x86_64 x86_64 GNU / Linux - aggiornamento Docker a: docker-ce-3: 19.03.8-3.el7.x86_64 tramite yum repo: @ docker-ol7-prod)
JohannesB

Funziona, grazie! Ma qualcuno sa come ha fatto il lavoro?
c0degeas

17

Prova ad aggiungere --network=hostinsieme al docker runcomando per risolvere questo problema.

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


2
Utile per un singolo container in esecuzione. Il parametro è--net=host
Max13

1
Ora il problema con questo approccio è che se hai più container in esecuzione in parallelo, come su Jenkins, le porte sono condivise e rischi di incontrare problemi su quelle porte condivise. Per essere precisi, stiamo eseguendo test e2e con Cypress e stiamo riscontrando problemi con Xvfb che non è in grado di generare una nuova istanza poiché le porte sono già prese.
Alex Rashkov

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.