34 votes

Pas de connexion Internet à l'intérieur des conteneurs Docker

Je ne peux pas exécuter de commande nécessitant une connexion internet à l'intérieur de n'importe quel conteneur Docker.

Fonctionne :

docker run ubuntu /bin/echo 'Bonjour le monde'

Ne fonctionne pas :

docker run ubuntu apt-get update

Err:1 http://archive.ubuntu.com/ubuntu xenial InRelease
  Échec temporaire de résolution de « archive.ubuntu.com »
Err:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease
  Échec temporaire de résolution de « archive.ubuntu.com »
Err:3 http://archive.ubuntu.com/ubuntu xenial-security InRelease
  Échec temporaire de résolution de « archive.ubuntu.com »
Reading package lists...
W: Échec de la récupération de http://archive.ubuntu.com/ubuntu/dists/xenial/InRelease  Échec temporaire de résolution de « archive.ubuntu.com »
W: Échec de la récupération de http://archive.ubuntu.com/ubuntu/dists/xenial-updates/InRelease  Échec temporaire de résolution de « archive.ubuntu.com »
W: Échec de la récupération de http://archive.ubuntu.com/ubuntu/dists/xenial-security/InRelease  Échec temporaire de résolution de « archive.ubuntu.com »

De même avec pip et ping.

Je suis sous Ubuntu 16.04 et n'utilise pas de pare-feu ou de serveur mandataire d'entreprise et j'ai essayé de redémarrer Docker.

Màj :

La mise à jour en mode interactif échoue de la même manière.

docker exec -ti angry_goodall /bin/bash
apt-get update
#échoue
ping google.com
#échec avec le message "hôte inconnu"
ping 8.8.8.8 
# affiche PING 8.8.8.8 (8.8.8.8): 56 octets de données
# et puis reste indéfiniment en attente

sudo apt-get update s'exécute avec succès sur l'hôte, c'est-à-dire sur mon ordinateur en dehors de Docker.

Màj Version de Docker 1.12.1, build 23cf638

24voto

codaamok Points 1303

Comme suggéré par creack sur l'issue GitHub n°866 pour Docker:

pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
docker -d

"Cela forcera docker à recréer le pont et à réinitialiser toutes les règles réseau"

12voto

Luís de Sousa Points 349

Il existe un problème similaire sur StackOverflow où une solution différente résout ce problème avec Docker 17.09 sur Ubuntu 16.04 :

Vérifiez le contenu de resolv.conf :

$ cat /etc/resolv.conf

S'il contient une ligne comme nameserver 127.0.1.1, cela signifie que les conteneurs obtiennent un serveur de noms incorrect. Pour corriger cela, modifiez le fichier NetworkManager.conf :

$ sudo pico /etc/NetworkManager/NetworkManager.conf

Et commentez la ligne avec dns=dnsmasq ; le fichier devrait ressembler à ceci :

[main]
plugins=ifupdown,keyfile,ofono
#dns=dnsmasq

[ifupdown]
managed=false

Enfin, redémarrez le gestionnaire de réseau :

$ sudo systemctl restart network-manager

Testez à nouveau le conteneur :

$ docker run ubuntu:16.04 apt-get update
Get:1 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB]
Get:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [102 kB]

8voto

wisbucky Points 2298

J'ai déjà répondu ici : https://stackoverflow.com/a/45644890/

Je copie la réponse ci-dessous :

La première chose à vérifier est d'exécuter cat /etc/resolv.conf dans le conteneur Docker. Si celui-ci possède un serveur DNS invalide, tel que nameserver 127.0.x.x, alors le conteneur ne pourra pas résoudre les noms de domaine en adresses IP, donc ping google.com échouera.

La deuxième chose à vérifier est d'exécuter cat /etc/resolv.conf sur la machine hôte. Docker copie essentiellement le /etc/resolv.conf de l'hôte dans le conteneur à chaque fois qu'un conteneur est démarré. Donc, si le /etc/resolv.conf de l'hôte est incorrect, le conteneur Docker le sera également.

Si vous avez constaté que le /etc/resolv.conf de l'hôte est incorrect, alors vous avez 2 options :

  1. Fixez le serveur DNS en dur dans daemon.json. C'est facile, mais pas idéal si vous prévoyez que le serveur DNS va changer.

  2. Corrigez le /etc/resolv.conf de l'hôte. C'est un peu plus compliqué, mais il est généré dynamiquement, et vous ne fixez pas en dur le serveur DNS.


1. Fixez le serveur DNS en dur dans daemon.json de Docker

  • Modifiez /etc/docker/daemon.json

     {
         "dns": ["10.1.2.3", "8.8.8.8"]
     }  * Redémarrez le démon Docker pour que ces changements prennent effet :      `sudo systemctl restart docker`
  • Maintenant, lorsque vous exécutez/démarrez un conteneur, Docker peuplera le /etc/resolv.conf avec les valeurs de daemon.json.


2. Corrigez le /etc/resolv.conf de l'hôte

A. Ubuntu 16.04 et antérieur

  • Pour Ubuntu 16.04 et antérieur, /etc/resolv.conf était généré dynamiquement par NetworkManager.

  • Commentez la ligne dns=dnsmasq (avec un #) dans /etc/NetworkManager/NetworkManager.conf

  • Redémarrez NetworkManager pour régénérer /etc/resolv.conf : sudo systemctl restart network-manager

  • Vérifiez sur l'hôte : cat /etc/resolv.conf

B. Ubuntu 18.04 et ultérieur

  • Ubuntu 18.04 a changé pour utiliser systemd-resolved pour générer /etc/resolv.conf. Maintenant, par défaut, il utilise un cache DNS local 127.0.0.53. Cela ne fonctionnera pas à l'intérieur d'un conteneur, donc Docker utilisera par défaut le serveur DNS 8.8.8.8 de Google, ce qui peut poser problème pour les personnes derrière un pare-feu.

  • /etc/resolv.conf est en réalité un lien symbolique (ls -l /etc/resolv.conf) qui pointe vers /run/systemd/resolve/stub-resolv.conf (127.0.0.53) par défaut dans Ubuntu 18.04.

  • Modifiez simplement le lien symbolique pour qu'il pointe vers /run/systemd/resolve/resolv.conf, qui liste les vrais serveurs DNS : sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

  • Vérifiez sur l'hôte : cat /etc/resolv.conf

Vous devriez maintenant avoir un /etc/resolv.conf valide sur l'hôte pour que Docker puisse le copier dans les conteneurs.

8voto

tosh Points 256

Lorsque vous créez un conteneur en utilisant docker run sans spécifier explicitement son réseau (--network foo), Docker le connecte au réseau par défaut bridge.

Le réseau bridge par défaut a été déprécié (je ne peux pas trouver d'informations sur la version de Docker Engine à partir de laquelle), il doit être considéré comme un détail d'implémentation et ne doit pas être utilisé.

Mais, plus important encore, tout conteneur connecté au réseau bridge par défaut est interdit de se connecter au monde extérieur - voir "Différences entre les ponts définis par l'utilisateur et le pont par défaut".

Vous pouvez activer une telle connexion au monde extérieur, mais je vous recommande de ne pas le faire. Cela nécessite de conserver les modifications de configuration hôte suggérées, ce qui peut ne pas être ce que vous voulez.

La solution est simple: créez simplement votre propre réseau de pont (défini par l'utilisateur), nommez-le, par exemple, common, et utilisez-le explicitement avec chaque conteneur ponctuel créé avec docker run:

$ docker network create --driver bridge common
$ docker run -it --network common ubuntu:latest bash

1voto

Andy Barnes Points 91

Pour moi, cela semblait fonctionner :

systemctl stop docker

systemctl start docker

(probablement systemctl restart docker aurait également fonctionné)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X