J'essayais d'exécuter Docker à partir de divers fichiers qui fonctionnaient auparavant et qui ne fonctionnent plus.
Dès que le fichier Docker incluait une ligne destinée à installer un logiciel, un message indiquant que le package était introuvable échouait.
RUN apt-get -y install supervisor nodejs npm
Le message commun apparaissant dans les journaux était
Could not resolve 'archive.ubuntu.com'
Une idée pourquoi aucun logiciel ne sera pas installé?
Après beaucoup de maux de tête, j'ai trouvé la réponse. Could not resolve 'archive.ubuntu.com'
peut être corrigé en apportant les modifications suivantes:
Décommentez la ligne suivante dans /etc/default/docker
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
Redémarrez le service Docker Sudo service docker restart
Supprimez toutes les images ayant mis en cache les paramètres DNS non valides.
Le crédit va à Andrew SB
Décommenter DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
Dans /etc/default/docker
En tant que Matt Carrier suggéré [~ # ~] pas [~ # ~] travaille pour moi. Pas plus que mettre les serveurs DNS de ma société dans ce fichier. Mais, il y a un autre moyen (lisez la suite).
Tout d'abord, vérifions le problème:
$ docker run --rm busybox nslookup google.com # takes a long time
nslookup: can't resolve 'google.com' # <--- appears after a long time
Server: 8.8.8.8
Address 1: 8.8.8.8
Si la commande semble se bloquer, mais finalement, l'erreur "ne peut pas résoudre" google.com "", vous avez le même problème que moi.
La commande nslookup
interroge le serveur DNS 8.8.8.8 afin de transformer l'adresse de texte de "google.com" en adresse IP. Ironiquement, 8.8.8.8 est serveur DNS public de Google . Si nslookup
échoue, des serveurs DNS publics tels que 8.8.8.8 pourraient être bloqués par votre société ( que je suppose est pour des raisons de sécurité).
On pourrait penser que l'ajout du serveur DNS de votre entreprise à DOCKER_OPTS
Dans /etc/default/docker
Devrait suffire, mais pour une raison quelconque, cela ne m'a pas fonctionné. Je décris ce qui a fonctionné pour moi ci-dessous.
[~ # ~] solution [~ # ~] :
Sur l'hôte (j'utilise Ubuntu 16.04), recherchez les adresses de serveur DNS principal et secondaire:
$ nmcli dev show | grep 'IP4.DNS'
IP4.DNS[1]: 10.0.0.2
IP4.DNS[2]: 10.0.0.3
En utilisant ces adresses, créez un fichier /etc/docker/daemon.json
:
$ Sudo su root
# cd /etc/docker
# touch daemon.json
Mettez ceci dans /etc/docker/daemon.json
:
{
"dns": ["10.0.0.2", "10.0.0.3"]
}
Sortir de la racine:
# exit
Maintenant, redémarrez docker:
$ Sudo service docker restart
[~ # ~] vérification [~ # ~] :
Maintenant, vérifiez que l'ajout du fichier /etc/docker/daemon.json
Vous permet de résoudre "google.com" en une adresse IP:
$ docker run --rm busybox nslookup google.com
Server: 10.0.0.2
Address 1: 10.0.0.2
Name: google.com
Address 1: 2a00:1450:4009:811::200e lhr26s02-in-x200e.1e100.net
Address 2: 216.58.198.174 lhr25s10-in-f14.1e100.net
[~ # ~] fait référence à [~ # ~] :
J'ai fondé ma solution sur un article de Robin Winslow, qui mérite tout le crédit de la solution. Merci Robin!
"Fixe la configuration DNS du réseau de Docker." Robin Winslow. Récupéré le 09/11/2016. https://robinwinslow.uk/2016/06/23/fix-docker-networking-dns/
Je rencontre le même problème, mais neiter aucun commentaire / etc/default/docker entrées dns ni la modification de / etc/resolv.conf dans le conteneur de construction ou le /etc/docker/daemon.json m'aide.
Mais après avoir construit avec l'option --network = Host, la résolution était à nouveau satisfaisante.
docker build --network=Host -t my-own-ubuntu-like-image .
Peut-être que cela aidera quelqu'un à nouveau.
Je crois que réponse de Matt Carrier est la solution correcte à ce problème. Cependant, après l'avoir implémenté, j'ai quand même observé le même comportement: could not resolve 'archive.ubuntu.com'
.
Cela m'a finalement amené à constater que le réseau auquel j'étais connecté bloquait le DNS public. La solution à ce problème consistait à configurer mon conteneur Docker pour utiliser le même serveur de noms que mon hôte (la machine à partir de laquelle j'exécutais Docker) utilisait.
Comment j'ai trié:
docker run -it docker/whalesay bash
ping 172.217.4.238
(Google.com)ping google.com
Dans mon cas, le premier ping
a donné lieu à des réponses, pas le second.
Comment j'ai corrigé:
Une fois que j'ai découvert que DNS ne fonctionnait pas dans le conteneur, j'ai vérifié que je pouvais dupliquer le même comportement sur l'hôte. nslookup google.com
Résolu parfaitement sur l'hôte. Mais, nslookup google.com 8.8.8.8
Ou nsloookup google.com 8.8.4.4
A expiré.
Ensuite, j'ai trouvé le ou les serveurs de noms utilisés par mon hôte en exécutant nm-tool
(Sur Ubuntu 14.04). Dans la foulée des retours rapides, j'ai redémarré l'exemple d'image et ajouté l'adresse IP du serveur de noms au fichier resolv.conf du conteneur: Sudo vi /etc/resolv.conf
. Une fois sauvegardé, j’ai tenté à nouveau le ping (ping google.com
) Et cette fois, cela a fonctionné!
Veuillez noter que les modifications apportées au fichier resolv.conf du conteneur ne sont pas persistantes et seront perdues lors du redémarrage du conteneur. Dans mon cas, la solution la plus appropriée consistait à ajouter l'adresse IP du serveur de noms de mon réseau au fichier /etc/default/docker
De l'hôte.
Pour ceux qui ont aussi ce problème, j'ai résolu mon problème en éditant la /etc/default/docker
fichier, comme suggéré par d’autres réponses et questions. Cependant, je ne savais pas quelle adresse IP utiliser comme DNS.
Ce n'est qu'après un certain temps que j'ai compris que je devais courir ifconfig docker
sur l'hôte pour afficher l'adresse IP de l'interface réseau du menu fixe.
docker0 Link encap:Ethernet Endereço de HW 02:42:69:ba:b4:07
inet end.: 172.17.0.1 Bcast:0.0.0.0 Masc:255.255.0.0
endereço inet6: fe80::42:69ff:feba:b407/64 Escopo:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1
pacotes RX:8433 erros:0 descartados:0 excesso:0 quadro:0
Pacotes TX:9876 erros:0 descartados:0 excesso:0 portadora:0
colisões:0 txqueuelen:0
RX bytes:484195 (484.1 KB) TX bytes:24564528 (24.5 MB)
C'était 172.17.0.1
dans mon cas. J'espère que cela aidera tous ceux qui ont également ce problème.
Après avoir ajouté l'ip local du DNS au fichier docker par défaut, il a commencé à fonctionner pour moi ... veuillez trouver les étapes ci-dessous ...
$ nm-tool # (will give you the dns IP)
DNS: 172.168.7.2
$ vim /etc/default/docker # (uncomment the DOCKER_OPTS and add DNS IP)
DOCKER_OPTS="--dns 172.168.7.2 --dns 8.8.8.8 --dns 8.8.4.4"
$ rm `docker ps --no-trunc -aq` # (remove all the containers to avoid DNS cache)
$ docker rmi $(docker images -q) # (remove all the images)
$ service docker restart #(restart the docker to pick up dns setting)
Maintenant, allez-y et construisez le docker ... :)
Je voulais juste ajouter une réponse tardive à toute personne rencontrant ce problème à partir des moteurs de recherche.
NE PAS faire ceci: J'avais l'habitude d'avoir une option dans/etc/default/docker pour définir iptables=false
. Ceci était dû au fait que ufw ne fonctionnait pas (tout était ouvert alors que 3 ports seulement étaient autorisés). J'ai donc suivi aveuglément la réponse à cette question: Un pare-feu compliqué (UFW) ne bloque pas l'utilisation de Docker = et ceci, qui était lié dans les commentaires
J'ai une très faible compréhension des règles iptables/nat/routage en général, ce qui explique pourquoi j'aurais pu faire quelque chose d'irrationnel.
Il se trouve que je l’ai probablement mal configurée et que j’ai tué la résolution DNS dans mes conteneurs. Lorsque j'ai exécuté un terminal conteneur interactif: docker run -i -t ubuntu:14.04 /bin/bash
J'ai eu ces résultats:
root@6b0d832700db:/# ping google.com
ping: unknown Host google.com
root@6b0d832700db:/# cat /etc/resolv.conf
search online.net
nameserver 8.8.8.8
nameserver 8.8.4.4
root@6b0d832700db:/# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=56 time=1.76 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=56 time=1.72 ms
La restauration de toute ma configuration ufw (before.rules), la désactivation de ufw et la suppression de iptables = false dans/etc/default/docker ont restauré la fonctionnalité de résolution DNS des conteneurs.
Je suis maintenant impatient de réactiver la fonctionnalité ufw en suivant ces instructions .
J'ai trouvé cette réponse après un peu de Google. J'utilise Windows. Certaines des réponses ci-dessus ne s'appliquaient donc pas à mon système de fichiers.
Fondamentalement dirigé:
docker-machine ssh default
echo "nameserver 8.8.8.8" > /etc/resolv.conf
Ce qui remplace simplement le serveur de noms existant utilisé avec 8.8.8.8
Je crois. Cela a fonctionné pour moi!
J'ai le même problème et j'ai essayé les étapes mentionnées, mais aucune ne semble fonctionner jusqu'à ce que les paramètres réseau soient actualisés.
Les marches:
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --ip-masq=true"
à /etc/default/docker
.iptables -t nat -F POSTROUTING
. Après avoir exécuté ceci, redémarrez le menu fixe et il initialisera la table nat avec la nouvelle plage IP.Même problème pour moi (sur Ubuntu Xenial).
docker run --dns ...
pour les conteneurs travaillés.docker build
(docker-compose, etc.) n'a pas fonctionné.Après avoir analysé les journaux du menu fixe (journalctl -u docker.service
) si un avertissement relatif à une mauvaise résolution a été appliqué.
Suite à cela, j'ai constaté que nos serveurs de noms d'entreprise ont été ajoutés aux interfaces réseau, mais pas dans resolvconf.
Applied this solution Comment configurer mon DNS statique dans des interfaces? (Askubuntu) , c’est-à-dire en ajoutant des serveurs de noms à /etc/resolvconf/resolv.conf.d/tail
Après la mise à jour de resolvconf (ou le redémarrage).
bash docker run --rm busybox nslookup google.com
travaillé instantanément.
Toutes mes versions composées par docker fonctionnent maintenant.
J'ai le même problème aujourd'hui, je viens d'ajouter la ligne ci-dessous dans/etc/default/docker
DOCKER_OPTS="--dns 172.18.20.13 --dns 172.20.100.29 --dns 8.8.8.8"
et puis j'ai redémarré mon ordinateur portable.
Dans mon cas, le redémarrage du démon docker ne me suffit pas, je dois redémarrer mon ordinateur portable pour le faire fonctionner.
Avant de consacrer trop de temps aux autres solutions, redémarrez simplement Docker et réessayez.
Résolu le problème en utilisant Docker Desktop pour Windows sous Windows 10.
Sur mon système (macOS High Sierra 10.13.6
avec Docker 2.1.0.1
) cela était dû à un proxy d'entreprise.
J'ai résolu ceci en deux étapes:
Preferences>Proxies
Ajoutez les mêmes paramètres à votre config.json dans ~/.docker/config.json
comme:
"proxies":
{
"default":
{
"httpProxy": "MYPROXY",
"httpsProxy": "MYPROXY",
"noProxy": "MYPROXYWHITELIST"
}
}