web-dev-qa-db-fra.com

Pas de connexion internet à l'intérieur des containers Docker

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 pip et 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.

Upd:

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

18
Sashko Lykhenko

Comme suggéré par , créez le numéro 866 de GitHub pour Docker :

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

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

7
adampski

Il existe un problème similaire chez 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

Si elle inclut une ligne telle que nameserver 127.0.1.1, cela signifie que les conteneurs obtiennent un serveur de noms incorrect. Pour résoudre ce problème, éditez 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]
11
Luís de Sousa

La première chose à vérifier est d’exécuter cat /etc/resolv.conf dans le conteneur de 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. Par conséquent, 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 démarrage d'un conteneur. 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, vous avez 2 options:

  1. Coder 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. Corrigez le /etc/resolv.conf de l'hôte. Ceci est un peu plus compliqué, 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 va renseigner /etc/resolv.conf avec les valeurs de daemon.json.


2. Corrige le /etc/resolv.conf des hôtes

A. Ubuntu 16.04 et versions antérieures

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

  • Mettez en commentaire 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 versions ultérieures

  • 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. Par conséquent, Docker utilise par défaut le serveur DNS 8.8.8.8 de Google, qui risque de tomber en panne pour les utilisateurs derrière un pare-feu.

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

  • Il suffit de changer le lien symbolique pour qu'il pointe vers /run/systemd/resolve/resolv.conf, qui répertorie les serveurs DNS réels:
    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 /etc/resolv.conf valide sur l'hôte pour que le menu fixe puisse être copié dans les conteneurs.

5
wisbucky