Est-ce que quelqu'un peut m'aider à travailler avec apt-get dans mon conteneur de docker? Chaque fois que j'essaie d'exécuter une commande apt-get dans mon conteneur de menu fixe, la commande échoue. J'exécute Docker version 1.1.1, compiler bd609d2 sur Ubuntu 12.04.
Quand je fais
$ Sudo docker run -i -t ubuntu:14.04 /bin/bash
# apt-get update
Je reçois des erreurs en disant
Impossible de résoudre "archive.ubuntu.com"
J'ai essayé de décommenter la ligne ci-dessous dans/etc/default/docker
DOCKER_OPTS = "- dns 8.8.8.8 - dns 8.8.4.4"
mais je ne peux toujours pas cingler google.com
ping: hôte inconnu
J'ai confirmé que le conteneur utilise les serveurs DNS 8.8.8.8 et 8.8.4.4
root @ 0baa87fc6322:/# cat /etc/resolv.conf
serveur de noms 8.8.8.8
serveur de noms 8.8.4.4
et je suis capable de faire un ping sur les deux serveurs, donc je suis à peu près sûr qu'un pare-feu ne fait pas que laisser tomber mes paquets.
Toute aide à ce sujet serait appréciée!
Merci!
Merci pour votre aide! J'ai découvert que c'était un problème de DNS et que c'était à cause d'un pare-feu. Après avoir cherché plus, j'ai trouvé cette question que je ne pouvais pas trouver en cherchant 'docker apt-get fail'
Docker - Les appels réseau échouent lors de la génération d'images sur le réseau d'entreprise
Son problème était semblable au mien et la solution m'a aidé à le faire fonctionner ... J'ai copié sa solution pour quiconque trouve cette question dans le futur.
Ces serveurs Google n'étaient pas accessibles derrière notre pare-feu, ce qui explique pourquoi nous n'avons pu résoudre aucune URL.
La solution consiste à indiquer à Docker les serveurs DNS à utiliser. Ce correctif dépend de la façon dont vous avez installé Docker: Forfait Ubuntu
Si vous avez installé le paquet Ubuntu, éditez/etc/default/docker et ajoutez la ligne suivante:
DOCKER_OPTS = "- dns <votre_serveur_dns_1>> --dns <votre_serveur_dns_2>"
Vous pouvez ajouter autant de serveurs DNS que vous le souhaitez à cette configuration. Une fois que vous avez modifié ce fichier, vous voudrez redémarrer votre service Docker:
Redémarrage du docker de service Sudo
Les binaires
Si vous avez installé Docker via la méthode des fichiers binaires (c'est-à-dire, aucun package), vous définissez les serveurs DNS au démarrage du démon Docker:
Sudo docker -d -D --dns --dns &
Si vous voyez une erreur comme Could not resolve ...
, il s’agit probablement d’une configuration DNS.
La première chose à vérifier est d’exécuter cat /etc/resolv.conf
dans 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. 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 de menu fixe le sera également.
Si vous avez trouvé 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. C'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 à code fixe dans le menu fixe 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
de l'hôte
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 ultérieur
Ubuntu 18.04 a changé pour utiliser systemd-resolved
AFIN DE G&EACUTE;N&EACUTE;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.
Commencez par vérifier si vous avez une connexion. Envoyez un ping directement à ip 91.189.92.201
sur lequel archive.ubuntu.com
est pointé:
ping 91.189.92.201
Si vous ne parvenez toujours pas à joindre l'hôte, ce n'est pas un problème de DNS.
Aussi, si vous avez une connexion Internet, vous pouvez faire un hack. Il suffit de mettre une ligne dans le fichier /etc/hosts
et le problème résolu:
91.189.92.201 archive.ubuntu.com
Je rencontre le problème dans deux cas différents et la résolution était différente ...
Premier avec Win7 + virtualbox (Xubuntu 16.04) Ce commentaire a fait le job: https://stackoverflow.com/a/29659783/2260796
Je modifie le fichier/etc/default/docker:
DOCKER-OPTS = "- ip-masq = true --dns mon_ip_dns_win --dns 8.8.8.8 --dns 8.8.4.4" Et courir Redémarrage du docker de service Sudo
Deuxième sur un système d'exploitation Xubuntu (ubuntu 16.04) La résolution précédente ne suffisait pas . Ce commentaire a fait le job: https://github.com/docker/ docker/issues/1809 Je devais commenter une ligne du fichier /etc/NetworkManager/NetworkManager.conf:
dns = dnsmasq
Puis courir
Sudo redémarre le gestionnaire de réseau
J'utilise la version de Mint et après avoir installé Docker et essayé de créer une image d'Ubuntu, la commande apt-get update ne reconnaît pas, pour remédier au problème, j'ai démissionné
docker run -it -p 8080:80 ubuntu /bin/bash
echo "91.189.92.201 archive.ubuntu.com" >> /etc/hosts
cat /etc/hosts
apt-get update