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.
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
networking
ubuntu
docker
Sashko Lykhenko
la source
la source
apt-get update
en mode interactif avec le docker?Réponses:
Comme suggéré par creack sur le problème # 866 de GitHub pour Docker :
"Cela obligera Docker à recréer le pont et à réinitier toutes les règles du réseau"
la source
-d
drapeau ne sort pas.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
:S'il inclut une ligne comme
nameserver 127.0.1.1
celle-ci, cela signifie que les conteneurs obtiennent un serveur de noms incorrect. Pour résoudre ce problème, modifiez leNetworkManager.conf
fichier:Et commentez la ligne avec
dns=dnsmasq
; le fichier devrait ressembler à ceci:Enfin, redémarrez le gestionnaire de réseau:
Testez à nouveau le conteneur:
la source
La première chose à vérifier est exécutée
cat /etc/resolv.conf
dans le conteneur Docker . S'il possède un serveur DNS non valide, tel quenameserver 127.0.x.x
, le conteneur ne pourra pas résoudre les noms de domaine en adresses IP, ilping google.com
échouera donc.La deuxième chose à vérifier est exécutée
cat /etc/resolv.conf
sur la machine hôte . Docker copie essentiellement l'hôte/etc/resolv.conf
dans le conteneur à chaque démarrage d'un conteneur. Donc, si l'hôte/etc/resolv.conf
est erroné, le conteneur docker le sera également.Si vous avez constaté que l'hôte
/etc/resolv.conf
est incorrect, vous avez 2 options: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.
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
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.conf
les valeurs dedaemon.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-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, qui peut tomber en panne pour les personnes derrière un pare-feu./etc/resolv.conf
est 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.conf
lequel 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.conf
sur l'hôte pour que docker le copie dans les conteneurs.la source