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?
apt-get update
.Respuestas:
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:
Puede agregar tantos servidores DNS como desee a esta configuración. Una vez que haya editado este archivo, querrá reiniciar su servicio Docker:
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:
fuente
--dns
opción o poniendo la configuración en/etc/default/docker
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:
Entonces solo necesita reiniciar el servicio Docker:
La explicación paso a paso está disponible aquí. Arregle la configuración de DNS de red de Docker.
fuente
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.
Este resultado DNS: 192.168.1.1 en mi caso
fuente
/etc/sysconfig/docker
archivo, al que pude agregar laDOCKER_OPTS="--dns 8.8.8.8"
línea y resolver mi problema.Para cualquier distribución de Linux que funcione con SystemD (Ubuntu 16, RHEL 7 ...), la ruta se mostrará con el siguiente comando:
El camino sería
/lib/systemd/system/docker.service
. Agregue losDOCKER_OPTS
valores, que pueden tener cualquiera de los--dns
, en la línea donde se inicia el demonio.fuente
docker.service
tuve que detener el servicio de Docker consudo service docker stop
y luegosystemctl daemon-reload
y finalmentesudo service docker start
/etc/systemd/system/docker.service.d
con 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.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.
fuente
Especifique su DNS para el demonio de Docker.
En primer lugar, obtenga su dirección DNS
Pruebe si el problema es realmente con el DNS lanzando un contenedor docker forzando este nuevo DNS
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
Reiniciar Docker
Puede encontrar una guía muy buena para hacer TODO este proceso aquí.
https://development.robinwinslow.uk/2016/06/23/fix-docker-networking-dns/
fuente
daemon.json
estará en/var/snap/docker/<id>/config/daemon.json
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 build
llamadas (y sin reiniciar el servicio de Docker) anulando elresolv.conf
en tiempo de compilación:Reemplace la IP
123.123.123.123
con la que se utiliza dentro de su red corporativa (utilícelanmcli dev show | grep 'IP4.DNS'
para obtener el servidor DNS utilizado actualmente).Desventajas:
fuente
En mi máquina Ubuntu 16.04, a veces, el DNS de Google no funciona para crear imágenes de Docker.
Tengo que encontrar manualmente el DNS de mi proveedor de servicios usando el siguiente comando
y agréguelo a mi
daemon.json
como se muestra a continuación(La herramienta PS nm está obsoleta en Ubuntu 15.04)
fuente