Me encuentro con un problema con mis contenedores Docker en Ubuntu 14.04 LTS. Docker funcionó bien durante dos días, y de repente perdí toda la conectividad de red dentro de mis contenedores. La salida de error a continuación inicialmente me llevó a creer que era porque apt-get está tratando de resolver el DNS a través de IPv6.
Inhabilité IPv6 en mi máquina host y aún así, eliminé todas las imágenes, extraje ubuntu base y aún me encontré con el problema.
Cambié mis servidores de nombres /etc/resolve.conf de mi servidor DNS local a los servidores DNS públicos de Google (8.8.8.8 y 8.8.4.4) y todavía no tengo suerte. También configuré el DNS en Google en DOCKER_OPTS de / etc / default / docker y reinicié docker.
También intenté extraer coreos, y yum tampoco pudo resolver DNS.
Es extraño porque si bien el DNS no funciona, sigo recibiendo una respuesta cuando hago ping en los mismos servidores de actualización que apt-get no puede resolver.
No estoy detrás de un proxy, estoy en una red local muy estándar, y esta versión de Ubuntu está actualizada y actualizada (la instalé hace dos días para estar más cerca de Docker).
He investigado a fondo esto a través de otras publicaciones sobre problemas de stackoverflow y github, pero no he encontrado ninguna resolución. No tengo ideas sobre cómo resolver este problema, ¿alguien puede ayudarme?
Mensaje de error
➜ arthouse git:(docker) ✗ docker build --no-cache .
Sending build context to Docker daemon 51.03 MB
Sending build context to Docker daemon
Step 0 : FROM ubuntu:14.04
---> 5506de2b643b
Step 1 : RUN apt-get update
---> Running in 845ae6abd1e0
Err http://archive.ubuntu.com trusty InRelease
Err http://archive.ubuntu.com trusty-updates InRelease
Err http://archive.ubuntu.com trusty-security InRelease
Err http://archive.ubuntu.com trusty-proposed InRelease
Err http://archive.ubuntu.com trusty Release.gpg
Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Err http://archive.ubuntu.com trusty-updates Release.gpg
Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Err http://archive.ubuntu.com trusty-security Release.gpg
Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Err http://archive.ubuntu.com trusty-proposed Release.gpg
Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Reading package lists...
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/InRelease
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-updates/InRelease
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-security/InRelease
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-proposed/InRelease
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/Release.gpg Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-updates/Release.gpg Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-security/Release.gpg Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-proposed/Release.gpg Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Some index files failed to download. They have been ignored, or old ones used instead.
Contenedor IFCONFIG / PING
➜ code docker run -it ubuntu /bin/bash
root@7bc182bf87bb:/# ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:04
inet addr:172.17.0.4 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:acff:fe11:4/64 Scope:Link
UP BROADCAST RUNNING MTU:1500 Metric:1
RX packets:7 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:738 (738.0 B) TX bytes:648 (648.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
root@7bc182bf87bb:/# ping google.com
PING google.com (74.125.226.0) 56(84) bytes of data.
64 bytes from lga15s42-in-f0.1e100.net (74.125.226.0): icmp_seq=1 ttl=56 time=12.3 ms
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 12.367/12.367/12.367/0.000 ms
root@7bc182bf87bb:/# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=44 time=21.8 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=44 time=21.7 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=44 time=21.7 ms
Además, la actualización de apt-get falla cuando forzo IPv4:
root@6d925cdf84ad:/# sudo apt-get update -o Acquire::ForceIPv4=true
Err http://archive.ubuntu.com trusty InRelease
Err http://archive.ubuntu.com trusty-updates InRelease
Err http://archive.ubuntu.com trusty-security InRelease
Err http://archive.ubuntu.com trusty-proposed InRelease
Err http://archive.ubuntu.com trusty Release.gpg
Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Err http://archive.ubuntu.com trusty-updates Release.gpg
Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Err http://archive.ubuntu.com trusty-security Release.gpg
Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Err http://archive.ubuntu.com trusty-proposed Release.gpg
Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Reading package lists... Done
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/InRelease
fuente
Respuestas:
Woo, encontré una publicación en github que resolvió mi problema.
Después de que Steve K. señaló que en realidad no era un problema de DNS y era un problema de conectividad, pude encontrar una publicación en github que describía cómo solucionar este problema.
Aparentemente, el puente de red docker0 estaba colgado. Instalar bridge-utils y ejecutar lo siguiente hizo que mi Docker funcionara correctamente:
fuente
ip link set down docker0
lugar deifconfig docker0 down
y ensystemctl restart docker
lugar deservice docker start
. Para eliminar todas las imágenes, lo hicedocker rmi $(docker images -q)
/etc/init.d/docker restart
y volvió a funcionarSi se trata de un problema de resolución de DNS, aquí está la solución:
Lo primero que debe verificar es ejecutar
cat /etc/resolv.conf
en el contenedor acoplable . Si tiene un servidor DNS no válido, comonameserver 127.0.x.x
, entonces el contenedor no podrá resolver los nombres de dominio en direcciones IP, porping google.com
lo que fallará.La segunda cosa a verificar se ejecuta
cat /etc/resolv.conf
en la máquina host . Docker básicamente copia los hosts/etc/resolv.conf
al contenedor cada vez que se inicia un contenedor. Entonces, si el host/etc/resolv.conf
está equivocado, también lo hará el contenedor docker.Si descubrió que el host
/etc/resolv.conf
está equivocado, entonces tiene 2 opciones:Codifique el servidor DNS en daemon.json. Esto es fácil, pero no es ideal si espera que cambie el servidor DNS.
Arreglar los anfitriones
/etc/resolv.conf
. Esto es un poco más complicado, pero se genera dinámicamente y no está codificando el servidor DNS.1. Hardcode servidor DNS en docker daemon.json
Editar
/etc/docker/daemon.json
Reinicie el Docker Daemon para que esos cambios surtan efecto:
sudo systemctl restart docker
Ahora, cuando ejecuta / inicia un contenedor, Docker se completará
/etc/resolv.conf
con los valores dedaemon.json
.2. Arreglar los hosts
/etc/resolv.conf
A. Ubuntu 16.04 y anterior
Para Ubuntu 16.04 y versiones anteriores,
/etc/resolv.conf
fue generado dinámicamente por NetworkManager.Comente la línea
dns=dnsmasq
(con a#
) en/etc/NetworkManager/NetworkManager.conf
Reinicie el NetworkManager para regenerar
/etc/resolv.conf
:sudo systemctl restart network-manager
Verificar en el host:
cat /etc/resolv.conf
B. Ubuntu 18.04 y posterior
Ubuntu 18.04 cambió para usar
systemd-resolved
para generar/etc/resolv.conf
. Ahora, por defecto, utiliza un caché de DNS local 127.0.0.53. Eso no funcionará dentro de un contenedor, por lo que Docker usará de forma predeterminada el servidor DNS 8.8.8.8 de Google, lo que puede dañar a las personas detrás de un firewall./etc/resolv.conf
en realidad es un enlace simbólico (ls -l /etc/resolv.conf
) que apunta a/run/systemd/resolve/stub-resolv.conf
(127.0.0.53) de forma predeterminada en Ubuntu 18.04.Simplemente cambie el enlace simbólico al que apunta
/run/systemd/resolve/resolv.conf
, que enumera los servidores DNS reales:sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
Verificar en el host:
cat /etc/resolv.conf
Ahora debería tener un válido
/etc/resolv.conf
en el host para que Docker lo copie en los contenedores.fuente
systemd
paquete ...En un intento de agregar valor adicional a un problema que también experimenté; con una respuesta alternativa:
Mi red estaba relacionada con la oficina y la configuración de DNS de Google estaba bloqueada para que el contenedor pudiera hacer ping a las direcciones IP pero no a los nombres de dominio.
Mi anfitrión se
/etc/resolv.conf
parecía originalmente;Esto se debe a que Network Manager realiza algún tipo de enmascaramiento de los detalles del servidor DNS.
Desafortunadamente, de acuerdo con los manuales de la ventana acoplable, la ventana acoplable filtrará las direcciones IP de host local al crear la resolv.conf del contenedor y las reemplazará con las IP DNS de Google. Lo que en mi caso hizo que los nombres de dominio estuvieran fuera de los límites.
Tuve que:
/etc/default/docker
valor predeterminado para que los contenedores usen el contenido resolv.conf de mi host./etc/NetworkManager/NetworManager.conf
y comente la líneadns=dnsmasq
. Esto es para que NM pueda especificar las direcciones IP DNS reales en lugar de 127.0.0.1.sudo service network-manager restart
.sudo service docker restart
.Ejecutar un contenedor le permitiría hacerlo
apt-get update/upgrade
, por ejemplo.fuente
Tu error está aquí:
Esto no es un error con DNS, sino que su sistema está intentando conectarse a hosts IPv6 y falla. Presumiblemente porque no tiene acceso IPv6 en su host. La búsqueda real de la dirección IPv6 tiene éxito. (El espejo / archivo ubuntu está disponible tanto en IPv6 como en IPv4. Tuviste la mala suerte de golpear uno IPv6 porque tu sistema cree que debería funcionar).
Debería solucionarlo instalando miredo o volver a intentarlo hasta que llegue a un espejo IPv4.
Una vez más, lo importante a tener en cuenta aquí es que el DNS no tiene la culpa, como puede ver en sus propias pruebas de ping.
fuente
El documento oficial de Docker proporciona instrumentos para configurar un servidor DNS para que Docker lo use
Abra el
/etc/default/docker
archivo para editar:Agregue una configuración para Docker:
Reemplace
8.8.8.8
con un servidor DNS local como192.168.1.1
. También puede especificar múltiples servidores DNS. Los separó con espacios, por ejemplo:Advertencia: si está haciendo esto en una computadora portátil que se conecta a varias redes, asegúrese de elegir un servidor DNS público.
PD:
nm-tool
se puede usar para verificar el servidor DNS del host localGuarde y cierre el archivo.
Reinicia el demonio Docker.
fuente
/etc/docker/daemon.json
configuración de Docker Daemon como dns.Para otros lectores que vienen aquí mientras usan boot2docker, así es como lo solucioné. De hecho, la respuesta anterior me indicó la dirección correcta.
Básicamente, por alguna razón, los contenedores dentro de boot2docker no pudieron resolver los nombres de host.
Así que simplemente reinicié boot2docker y comencé los contenedores. Ahora los nombres de host pueden resolverse correctamente nuevamente.
Supongo que el problema fue iniciar boot2docker mientras se conectaba la red en el host, lo que provocó que boot2docker se iniciara y entrara en un estado que no funciona.
fuente
Tuve el mismo problema en Windows. Este comando me funcionó:
docker-machine restart
fuente
Reinicie el demonio Docker en Debian9
service docker restart
y las conexiones y redes funcionan bien
fuente
Tuve un problema similar, pero también la resolución de nombres entre contenedores dentro de una red definida por el usuario parecía un poco escasa. Algunos no pudieron resolver nada como tú.
El problema fue un / var / lib / docker movido. Por razones de espacio, se montó a través de nfs. Agregar un sistema de archivos local y mover los archivos allí resuelve el problema.
fuente