dns - hub - Docker: las llamadas de red fallan durante la creación de la imagen en la red corporativa
imagen docker ubuntu (5)
Tengo problemas para crear imágenes de Docker en mi red corporativa. Estoy empezando con Docker, así que tengo el siguiente Dockerfile para una aplicación tipo 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"]
Esto funciona bien cuando lo construyo en mi computadora portátil en casa, en mi propia red inalámbrica. Reduce las dependencias requeridas y construye la imagen correctamente.
Sin embargo, cuando estoy en mi red corporativa en el trabajo, esta misma compilación Docker falla al intentar bajar el RPM de download.fedoraproject.org, con este mensaje de error:
Paso 2: RUN rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm ---> Ejecutando en e0c26afe9ed5 curl: (5) Couldn '' t resuelve el error proxy ''some.proxy.address'': omitiendo http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm - error de transferencia
En mi red corporativa, puedo acceder a esa URL desde mi computadora portátil. Pero una vez que Docker intenta construir el contenedor, de repente no puede resolverlo en absoluto. Este comportamiento es el mismo para una variedad de recursos externos (apt-get, etc.): todos se pueden resolver perfectamente en mi computadora portátil en la red corporativa, pero Docker no puede resolverlos.
No tengo el conocimiento de la red para descubrir qué está pasando aquí. ¿Alguien sabe por qué estaría ocurriendo este extraño comportamiento al construir contenedores Docker?
Aconsejo cambiar la configuración de DNS del daemon Docker. Puede establecer las opciones predeterminadas para el daemon docker creando un archivo de configuración de daemon en /etc/docker/daemon.json . Establezca el servidor DNS de acuerdo con su máquina host, por ejemplo, mi servidor DNS es 10.0.0.2:
{"dns": ["10.0.0.2", "8.8.8.8"] }
Entonces solo necesitas reiniciar el servicio del acoplador:
sudo service docker restart
La explicación paso a paso está disponible aquí. Fix Docker''s network DNS config
Los siguientes pasos me funcionan (tanto para el docker build como para el docker run command). Mi versión de Linux es Ubuntu 14.04.
- Identificar DNS usando el siguiente comando.
nm-tool | grep DNS
Este resultado DNS: 192.168.1.1 en mi caso
- Crear entrada en /etc/default/docker.io. Mi entrada actual se ve así
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --dns 192.168.1.1"
- Reinicie el servicio del acoplador
sudo service docker.io restart
Para cualquier distribución de Linux que funcione con SystemD (Ubuntu 16, RHEL 7 ...), la ruta se mostrará con el siguiente comando:
$ 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
La ruta sería /lib/systemd/system/docker.service
. Agregue los valores DOCKER_OPTS
, que pueden tener cualquiera de los --dns
, en la línea donde se inicia el daemon.
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://
Pude descubrir el problema. En Ubuntu, Docker establece los servidores DNS para el contenedor en los servidores de Google en 8.8.8.x. Según tengo entendido, esta es una solución en Ubuntu debido al hecho de que Ubuntu establece /etc/resolv.conf para ser 127.0.0.1.
Esos servidores de Google no eran accesibles desde detrás de nuestro firewall, por lo que no pudimos resolver ninguna URL.
La solución es decirle a Docker qué servidores DNS usar. Esta solución depende de cómo instaló Docker:
Paquete de Ubuntu
Si tiene instalado el paquete Ubuntu, edite / etc / default / docker y agregue la siguiente línea:
DOCKER_OPTS="--dns <your_dns_server_1> --dns <your_dns_server_2>"
Puede agregar tantos servidores DNS como desee a esta configuración. Una vez que haya editado este archivo, querrá reiniciar su servicio Docker:
sudo service docker restart
Binarios
Si instaló Docker mediante el método binario (es decir, sin paquete), configurará los servidores DNS cuando inicie el daemon Docker:
sudo docker -d -D --dns <your_dns_server_1> --dns <your_dns_server_2> &