Pas de connexion Internet dans les conteneurs Docker

24

Je ne peux exécuter aucune commande nécessitant une connexion Internet dans un conteneur Docker.

Travaux:

docker run ubuntu /bin/echo 'Hello world'

Ne marche pas:

docker run ubuntu apt-get update

Err:1 http://archive.ubuntu.com/ubuntu xenial InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Err:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Err:3 http://archive.ubuntu.com/ubuntu xenial-security InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Reading package lists...
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial-updates/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial-security/InRelease  Temporary failure resolving 'archive.ubuntu.com'

Similaire avec pipet ping.

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

Mise à jour:

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

docker exec -ti angry_goodall /bin/bash
apt-get update
#fails
ping google.com
#fails with "unknown host" message
ping 8.8.8.8 
# shows PING 8.8.8.8 (8.8.8.8): 56 data bytes
# and than hangs indefinetly

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

Upd Docker version 1.12.1, build 23cf638

Sashko Lykhenko
la source
Pouvez-vous cingler un domaine à partir de l'hôte? Pouvez-vous exécuter apt-get updateen mode interactif avec le docker?
adampski
la sortie affiche l'erreur: Échec temporaire de la résolution de 'archive.ubuntu.com' ... essayez .. ping www.google.com .. voyez si vous obtenez la même réponse .. puis essayez ... ping 8.8.8.8 .. .si IP fonctionne et que le nom d'hôte ne fonctionne pas, votre DNS est cassé (plus /etc/resolv.conf pour voir quel serveur DNS est utilisé)
TG2
@adampski, j'ai mis à jour la question en fonction de vos suggestions.
Sashko Lykhenko
@ TG2, j'ai également mis à jour la question en fonction de vos suggestions.
Sashko Lykhenko
Quelle version du moteur docker utilisez-vous?
adampski

Réponses:

13

Comme suggéré par creack sur le problème # 866 de GitHub pour Docker :

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

"Cela obligera Docker à recréer le pont et à réinitier toutes les règles du réseau"

adampski
la source
1
Je l'ai essayé, et cela tue le réseau sur tout mon ordinateur.
petersohn
Ceci est utile et a résolu le problème pour moi. Je vous remercie.
Rao
10
Le -ddrapeau ne sort pas.
Luís de Sousa
2
Salut @ LuísdeSousa, c'est dommage que vous ayez voté contre, mais envisagez la possibilité que certains commutateurs soient supprimés ou modifiés dans les versions plus récentes. D'autant plus que c'était il y a plus d'un an.
adampski
3
au lieu de copier / coller uniquement la commande, vous pouvez expliquer ce que cela signifie :)
Adelin
12

Il y a un problème similaire à 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 inclut une ligne comme nameserver 127.0.1.1celle-ci, cela signifie que les conteneurs obtiennent un serveur de noms incorrect. Pour résoudre ce problème, modifiez le NetworkManager.conffichier:

$ 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]
Luís de Sousa
la source
Mon installation correspond à la description et l'approche ci-dessus a résolu le problème pour moi.
krcools
mise à jour de la réponse pour Ubuntu 18.04: superuser.com/a/1335054
wisbucky
7

La première chose à vérifier est exécutée cat /etc/resolv.confdans le conteneur Docker . S'il possède un serveur DNS non valide, tel que nameserver 127.0.x.x, le conteneur ne pourra pas résoudre les noms de domaine en adresses IP, il ping google.coméchouera donc.

La deuxième chose à vérifier est exécutée cat /etc/resolv.confsur la machine hôte . Docker copie essentiellement l'hôte /etc/resolv.confdans le conteneur à chaque démarrage d'un conteneur. Donc, si l'hôte /etc/resolv.confest erroné, le conteneur docker le sera également.

Si vous avez constaté que l'hôte /etc/resolv.confest incorrect, vous avez 2 options:

  1. Codez en dur le serveur DNS dans daemon.json. C'est facile, mais pas idéal si vous vous attendez à ce que le serveur DNS change.

  2. Réparez les hôtes /etc/resolv.conf. C'est un peu plus délicat, mais il est généré dynamiquement et vous ne codez pas en dur le serveur DNS.


1. Serveur DNS Hardcode dans docker daemon.json

  • Éditer /etc/docker/daemon.json

    {
        "dns": ["10.1.2.3", "8.8.8.8"]
    }
    
  • Redémarrez le démon docker pour que ces modifications prennent effet:
    sudo systemctl restart docker

  • Maintenant, lorsque vous exécutez / démarrez un conteneur, docker remplira /etc/resolv.confles valeurs de daemon.json.


2. Réparez les hôtes /etc/resolv.conf

A. Ubuntu 16.04 et versions antérieures

  • Pour Ubuntu 16.04 et versions antérieures, a /etc/resolv.confété généré dynamiquement par NetworkManager.

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

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

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

Ubuntu 18.04 et versions ultérieures

  • Ubuntu 18.04 a changé pour utiliser systemd-resolvedpour 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, qui peut tomber en panne pour les personnes derrière un pare-feu.

  • /etc/resolv.confest en fait 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 vers /run/systemd/resolve/resolv.conflequel pointer , qui répertorie 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 devez maintenant avoir un valide /etc/resolv.confsur l'hôte pour que docker le copie dans les conteneurs.

wisbucky
la source