web-dev-qa-db-fra.com

Les appels réseau échouent lors de la création d'image sur le réseau d'entreprise

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?

69
dsw88

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:

Forfait Ubuntu

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

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 lorsque vous démarrez le démon Docker:

Sudo docker -d -D --dns <your_dns_server_1> --dns <your_dns_server_2> &
85
dsw88

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

54
l.augustyniak

Les étapes suivantes fonctionnent pour moi (pour docker build et docker run command). Ma version Linux est Ubuntu 14.04.

  • Identifiez le DNS en utilisant la commande suivante.
    nm-tool | grep DNS

Ce résultat DNS: 192.168.1.1 dans mon cas

  • Créez une entrée dans /etc/default/docker.io. Mon entrée actuelle ressemble à ceci
DOCKER_OPTS = "- dns 8.8.8.8 - dns 8.8.4.4 - dns 192.168.1.1"
  • Redémarrer le service Docker
 Sudo service docker.io redémarrer 
18
Balkrishna

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://
10
Marcello de Sales

Docker (au moins> = 1.13, probablement plus tôt) sur Mac et Windows vous permet de configurer le DNS dans Préférences -> Démon -> Avancé:

La configuration suivante définit deux serveurs DNS d'entreprise (utilisez vos propres valeurs ici) avec un repli sur les serveurs DNS publics de Google.

Docker Daemon Adv Config

6
Jason

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/

4
alsora

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:

  • Cela n'affecte aucune autre ligne du fichier Dockerfile. Par conséquent, vous devez préfixer chaque ligne avec le correctif, si cela dépend de la résolution DNS
2
Murmel