Las llamadas de red fallan durante la creación de imágenes en la red corporativa

81

Tengo problemas para crear imágenes de Docker en mi red corporativa. Recién estoy comenzando con Docker, así que tengo el siguiente Dockerfile para una aplicación de 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. Elimina las dependencias necesarias y crea la imagen correctamente.

Sin embargo, cuando estoy en mi red corporativa en el trabajo, esta misma compilación de la ventana acoplable falla al intentar bajar el RPM de download.fedoraproject.org, con este mensaje de error:

Paso 2: EJECUTAR rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm ---> Ejecutando en e0c26afe9ed5 curl: (5) Couldn ' t resolver el error de proxy 'some.proxy.address': omitiendo http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm - la transferencia falló

En mi red corporativa, puedo acceder a esa URL sin problemas desde mi computadora portátil. Pero una vez que Docker intenta construir el contenedor, de repente no se puede resolver en absoluto. Este comportamiento es el mismo para una variedad de recursos externos (apt-get, etc.): todos pueden resolverse bien en mi computadora portátil en la red corporativa, pero Docker no puede resolverlos.

No tengo el conocimiento de la red para averiguar qué está pasando aquí. ¿Alguien sabe por qué se produciría este comportamiento extraño al construir contenedores Docker?

dsw88
fuente
eche un vistazo a stackoverflow.com/questions/19210563/… también podría resolver su problema
Thomasleveil
se me ocurrió el mismo problema. Me había olvidado de correr apt-get update.
matthiasbe
Estos pueden ser síntomas de "Docker no recoge información de DNS de Cisco AnyConnect" forums.docker.com/t/…
Jason

Respuestas:

92

Pude resolver 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 alternativa en Ubuntu debido al hecho de que Ubuntu establece /etc/resolv.conf en 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 debe usar. Esta solución depende de cómo instaló Docker:

Paquete de Ubuntu

Si tiene instalado el paquete de 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 ha instalado Docker a través del método de binarios (es decir, sin paquete), entonces configura los servidores DNS cuando inicia el demonio de Docker:

sudo docker -d -D --dns <your_dns_server_1> --dns <your_dns_server_2> &
dsw88
fuente
4
¿Qué pasa con el uso del comando 'docker build' con Dockfiles ... no parece que funcione en esas circunstancias: docker --dns = 209.18.47.61 build. 2> & 1 | tee ./output.txt
Quasaur
2
sí, esto debería funcionar con la compilación de Docker. docker build no tiene un indicador --dns en el comando en sí, pero si lo configura en el demonio de esta manera, se aplicará al usar docker build
dsw88
Gracias por esta solución A mi lado, el problema era que aparentemente esa ventana acoplable necesita que IPv4 esté disponible y habilitado. WTF? Aprenda: IPv4 está muerto. El software que es solo IPv4 está seriamente dañado.
Tino
1
Ya había realizado este paso y comencé a recibir los errores nuevamente. Reiniciar el servicio lo solucionó de nuevo.
Andrew Grothe
Tengo este problema con Docker 1.7, aunque he intentado ejecutarlo con la --dnsopción o poniendo la configuración en/etc/default/docker
Patryk
64

Aconsejo cambiar la configuración de DNS del demonio de Docker. Puede establecer las opciones predeterminadas para el demonio de la ventana acoplable creando un archivo de configuración de demonio en /etc/docker/daemon.json . Configure 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 necesita reiniciar el servicio Docker:

sudo service docker restart

La explicación paso a paso está disponible aquí. Arregle la configuración de DNS de red de Docker.

l.augustyniak
fuente
19

Los siguientes pasos funcionan para mí (tanto para el comando docker build como para el comando docker run). Mi versión de Linux es Ubuntu 14.04.

  • Identifique DNS usando el siguiente comando.
    nm-herramienta | grep DNS

Este resultado DNS: 192.168.1.1 en mi caso

  • Cree una 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"
  • Reiniciar el servicio de Docker
 reiniciar sudo service docker.io 
Balkrishna
fuente
1
El equivalente de CentOS es el /etc/sysconfig/dockerarchivo, al que pude agregar la DOCKER_OPTS="--dns 8.8.8.8"línea y resolver mi problema.
MarkHu
11

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

El camino sería /lib/systemd/system/docker.service. Agregue los DOCKER_OPTSvalores, que pueden tener cualquiera de los --dns, en la línea donde se inicia el demonio.

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://
Marcello de Sales
fuente
1
¡Gracias! Después de editar docker.servicetuve que detener el servicio de Docker con sudo service docker stopy luego systemctl daemon-reloady finalmentesudo service docker start
Kaveh Ghahremani
1
Es mejor agregar un archivo de unidad /etc/systemd/system/docker.service.dcon la configuración modificada (que systemd combina / anula la configuración del sistema de manera útil) en lugar de cambiar la versión del sistema. Este último se perderá con las actualizaciones.
Raman
6

Docker (al menos> = 1.13, probablemente antes) en Mac y Windows le permite configurar el DNS en Preferencias -> Daemon -> Avanzado:

La siguiente configuración establece dos servidores DNS corporativos (use sus propios valores aquí) con respaldo a los servidores DNS públicos de Google.

Configuración avanzada de Docker Daemon

Jason
fuente
5

Especifique su DNS para el demonio de Docker.

En primer lugar, obtenga su dirección DNS

$ nmcli dev show | grep 'IP4.DNS'
IP4.DNS[1]:                             10.0.0.2

Pruebe si el problema es realmente con el DNS lanzando un contenedor docker forzando este nuevo DNS

$ docker run --dns 10.0.0.2 <image_name> <command_name>

Si esto resuelve el problema, puede aplicar esta solución para todos los demonios de la ventana acoplable de la siguiente manera

Edite o cree un archivo /etc/docker/daemon.json

Agregue la siguiente línea a este archivo

{
"dns": ["10.0.0.2", "8.8.8.8"]
}

Reiniciar Docker

$ sudo service docker restart

Puede encontrar una guía muy buena para hacer TODO este proceso aquí.

https://development.robinwinslow.uk/2016/06/23/fix-docker-networking-dns/

alsora
fuente
Esta es una respuesta límite de solo enlace . Debe ampliar su respuesta para incluir la mayor cantidad de información aquí y usar el enlace solo como referencia.
Adiós StackExchange
si lo instaló por snap daemon.jsonestará en/var/snap/docker/<id>/config/daemon.json
sjt003
3

Solución sin reiniciar el servicio Docker

Es posible modificar la configuración de DNS para una sola imagen de Docker sin afectar otras docker buildllamadas (y sin reiniciar el servicio de Docker) anulando el resolv.confen tiempo de compilación:

FROM ubuntu:18.04

RUN echo "nameserver 123.123.123.123" > /etc/resolv.conf && apt update

Reemplace la IP 123.123.123.123con la que se utiliza dentro de su red corporativa (utilícela nmcli dev show | grep 'IP4.DNS'para obtener el servidor DNS utilizado actualmente).

Desventajas:

  • Esto no afecta a ninguna otra línea del Dockerfile. Por lo tanto, debe prefijar cada línea con la solución, si depende de la resolución de DNS
Murmel
fuente
1

En mi máquina Ubuntu 16.04, a veces, el DNS de Google no funciona para crear imágenes de Docker.

cat /etc/docker/daemon.json
{"dns": [""8.8.8.8"] }

Tengo que encontrar manualmente el DNS de mi proveedor de servicios usando el siguiente comando

nmcli device show <interfacename> | grep IP4.DNS

125.22.47.102

y agréguelo a mi daemon.jsoncomo se muestra a continuación

cat /etc/docker/daemon.json 

{"dns": ["125.22.47.102","8.8.8.8"] }

 restart docker

sudo service docker restart

(La herramienta PS nm está obsoleta en Ubuntu 15.04)

Thomas Lee Sebastián
fuente