Je ne parviens pas à créer des images Docker sur mon réseau d'entreprise. Je commence tout juste à utiliser Docker. J'ai donc le fichier Docker suivant pour une application de type hello-world:
# DOCKER-VERSION 0.3.4
FROM centos:6.4
# Enable EPEL for Node.js
RUN rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
# Install Node.js and npm
RUN yum install -y npm
# Bundle app source
ADD . /src
# Install app dependencies
RUN cd /src; npm install
EXPOSE 8080
CMD ["node", "/src/index.js"]
Cela fonctionne bien lorsque je le construis sur mon ordinateur portable à la maison, sur mon propre réseau sans fil. Il supprime les dépendances requises et construit l'image correctement.
Cependant, lorsque je suis sur mon réseau d'entreprise au travail, cette même génération de docker échoue lorsque vous essayez d'extraire le RPM de download.fedoraproject.org, avec le message d'erreur suivant:
Étape 2: Lancez rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm ---> Exécution en e0c26afe9ed5 curl: (5) Impossible de résoudre le proxy, erreur 'some.proxy.address': skipping http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8. noarch.rpm - le transfert a échoué
Sur mon réseau d'entreprise, je peux très bien accéder à cette URL depuis mon ordinateur portable. Mais une fois que Docker tente de construire le conteneur, tout d’un coup, il ne peut plus se résoudre. Ce comportement est le même pour une variété de ressources externes (apt-get, etc.): elles peuvent toutes résoudre correctement sur mon ordinateur portable du réseau d'entreprise, mais Docker ne peut pas les résoudre.
Je n'ai pas le savoir-faire du réseau pour comprendre ce qui se passe ici. Est-ce que quelqu'un sait pourquoi ce comportement étrange se produirait lors de la construction de conteneurs Docker?
J'ai pu comprendre le problème. Sur Ubuntu, Docker définit les serveurs DNS du conteneur sur les serveurs de Google à 8.8.8.x. Si j'ai bien compris, il s'agit d'une solution de contournement sur Ubuntu, car Ubuntu définit /etc/resolv.conf sur 127.0.0.1.
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 manière dont vous avez installé Docker:
Si vous avez installé le paquet Ubuntu, éditez/etc/default/docker et ajoutez la ligne suivante:
DOCKER_OPTS="--dns <your_dns_server_1> --dns <your_dns_server_2>"
Vous pouvez ajouter autant de serveurs DNS que vous le souhaitez à cette configuration. Une fois que vous avez édité ce fichier, vous voudrez redémarrer votre service Docker:
Sudo service docker restart
Si vous avez installé Docker via la méthode des fichiers binaires (c'est-à-dire, aucun package), vous définissez les serveurs DNS lorsque vous démarrez le démon Docker:
Sudo docker -d -D --dns <your_dns_server_1> --dns <your_dns_server_2> &
Je conseille de changer les paramètres DNS du démon Docker. Vous pouvez définir les options par défaut pour le démon docker en créant un fichier de configuration de démon à l'adresse /etc/docker/daemon.json . Configurez le serveur DNS en fonction de votre ordinateur hôte, par exemple. mon serveur DNS est 10.0.0.2:
{"dns": ["10.0.0.2", "8.8.8.8"] }
Ensuite, il vous suffit de redémarrer le service Docker:
Sudo service docker restart
Des explications détaillées sont disponibles ici configuration DNS du réseau de Docker
Les étapes suivantes fonctionnent pour moi (pour docker build et docker run command). Ma version Linux est Ubuntu 14.04.
nm-tool | grep DNS
Ce résultat DNS: 192.168.1.1 dans mon cas
DOCKER_OPTS = "- dns 8.8.8.8 - dns 8.8.4.4 - dns 192.168.1.1"
Sudo service docker.io redémarrer
Pour toute distribution Linux fonctionnant avec SystemD (Ubuntu 16, RHEL 7 ...), le chemin sera affiché avec la commande suivante:
$ systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2016-06-29 08:10:33 PDT; 2min 34s ago
Docs: https://docs.docker.com
Main PID: 1169 (dockerd)
Tasks: 19
Memory: 85.0M
CPU: 1.779s
CGroup: /system.slice/docker.service
├─1169 /usr/bin/dockerd --dns 172.18.20.11 --dns 172.20.100.15 --dns 8.8.8.8 --dns 8.8.4.4 -H fd://
└─1232 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shim docker-containerd-shim --met
Le chemin serait /lib/systemd/system/docker.service
. Ajouter le DOCKER_OPTS
valeurs, qui peuvent avoir n'importe lequel des --dns
, dans la ligne où le démon est démarré.
cat /lib/systemd/system/docker.service | grep dns
ExecStart=/usr/bin/dockerd --dns 172.18.20.11 --dns 172.20.100.15 --dns 8.8.8.8 --dns 8.8.4.4 -H fd://
Spécifiez votre DNS au démon Docker.
Tout d'abord obtenir votre adresse DNS
$ nmcli dev show | grep 'IP4.DNS'
IP4.DNS[1]: 10.0.0.2
Testez si le problème est vraiment avec le DNS en lançant un conteneur de menu fixe forçant ce nouveau DNS
$ docker run --dns 10.0.0.2 <image_name> <command_name>
Si cela résout le problème, vous pouvez appliquer ce correctif pour tous les démons docker de la manière suivante
Editez ou créez un fichier /etc/docker/daemon.json
Ajouter la ligne suivante à ce fichier
{
"dns": ["10.0.0.2", "8.8.8.8"]
}
Redémarrer le menu fixe
$ Sudo service docker restart
Un très bon guide pour faire TOUT ce processus peut être trouvé ici.
https://development.robinwinslow.uk/2016/06/23/fix-docker-networking-dns/
Solution sans redémarrer le service Docker
Il est possible de modifier les paramètres DNS pour une seule image Docker sans affecter les autres docker build
appelle (et sans redémarrer le service Docker) en remplaçant le resolv.conf
au moment de la construction:
FROM ubuntu:18.04
RUN echo "nameserver 123.123.123.123" > /etc/resolv.conf && apt update
Remplacer l'IP 123.123.123.123
avec celui qui est utilisé dans votre réseau d’entreprise (utilisez nmcli dev show | grep 'IP4.DNS'
pour obtenir le serveur DNS actuellement utilisé).
Inconvénients: