Réseau Docker désactivé: AVERTISSEMENT: le transfert IPv4 est désactivé. La mise en réseau ne fonctionnera pas

106

Les conteneurs d'un hôte perd «soudainement» la connexion aux conteneurs du monde extérieur. Cependant, certains hôtes ont été rafraîchis et nous avons soudainement eu la situation suivante:

  1. L'hôte peut communiquer avec d'autres hôtes.
  2. Les conteneurs exécutés sur l'hôte ne peuvent pas communiquer avec d'autres hôtes.

Voici un exemple:

[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

Maintenant, à partir du conteneur lui-même, nous ne pouvons pas cingler le même hôte:

[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 première fois que j'ai vu cet avertissement, c'était dans les versions initiales de Docker ... Ayant Docker 1.9.1 et 1.10.3, comment résoudre ce problème?

Marcello de Sales
la source

Réponses:

180

J'ai examiné http://chrisgilmerproj.github.io/ubuntu/network/docker/2013/09/05/ipv4-forwarding-and-docker.html et cela m'a aidé à résoudre le problème sur l'hôte.

J'ai ajouté ce qui suit à /etc/sysctl.conf :

net.ipv4.ip_forward=1

J'ai ensuite redémarré le service réseau et validé le paramétrage:

[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

Tous les conteneurs peuvent désormais communiquer avec les conteneurs du monde extérieur!

Marcello de Sales
la source
15
Sur Ubuntu, j'avais besoin sudo sysctl -pde recharger les paramètres (systemctl n'a pas été trouvé).
Nacho Coloma
2
Cette solution était nécessaire sur Centos 7 en essayant simplement d'accéder au conteneur à partir de l'hôte (pour le test).
Dave C
J'ai des conteneurs similaires sur un hôte Windows (sur Hyper-V). Existe-t-il un paramètre similaire quelque part pour Windows?
Anthony Mastrean
4
mais POURQUOI est-il nécessaire? le réseau fonctionne parfaitement sans transfert, donc docker ne devrait pas l'exiger non plus ...
user3338098
2
@ user3338098, car le réseau interne sous-jacent transfère le trafic entre les interfaces pour accéder à Internet. Cela a été nécessaire pour indiquer à tout système Linux qu'il doit acheminer le trafic entre les interfaces de la même manière qu'un routeur réseau le fait pendant très longtemps. Ceci est désactivé par défaut car la plupart des boîtiers Linux ne font pas de transfert et transférer accidentellement le trafic serait au pire une menace pour la sécurité ou compliquerait vraiment votre réseau au mieux.
Josiah
28

Essayez de redémarrer le service Docker.

Par exemple pour Ubuntu:

$ sudo systemctl restart docker

DmitrySandalov
la source
5
Sur CentOS7, ce problème est apparu soudainement et le simple redémarrage du service docker fonctionnait parfaitement.
steven87vt
1
Cela a fonctionné, me rend nerveux que je ne sais pas pourquoi cela a fonctionné. Quelqu'un a-t-il une idée? Ou au moins des étapes pour répéter l'échec?
Josiah
la reproduction? Cela s'est produit ici après la mise à niveau de Docker et le redémarrage (sur Oracle Linux Server version 7.8 avec noyau: - 3.10.0-1127.el7.x86_64 # 1 SMP Wed Apr 1 10:20:09 PDT 2020 x86_64 x86_64 x86_64 GNU / Linux - Upgrade Docker à: docker-ce-3: 19.03.8-3.el7.x86_64 via yum repo: @ docker-ol7-prod)
JohannesB
1
Cela fonctionne, merci! Mais quelqu'un sait comment cela a fonctionné?
c0degeas
17

Essayez d'ajouter --network=hostavec la docker runcommande pour résoudre ce problème.

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

Ganesh Chandrasekaran
la source
2
Utile pour un seul conteneur en cours d'exécution. Le paramètre est--net=host
Max13
1
Maintenant, le problème avec cette approche est que si vous avez plusieurs conteneurs exécutés en parallèle, comme sur Jenkins, les ports sont partagés et vous risquez de rencontrer des problèmes sur ces ports partagés. Pour être précis, nous exécutons des tests e2e avec Cypress et nous rencontrons des problèmes avec Xvfb incapable de générer une nouvelle instance car les ports sont déjà pris.
Alex Rashkov
1

Résolution de mon problème de redémarrage du réseau.

systemctl restart network
Cristiano Kubiaki
la source