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
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"
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]
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:
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.
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.