Jaime, miembro de este gran equipo de trabajo, nos hizo el favor de crear este post porque domina a la perfección el tema.
Solución:
Como lo sugiere crack en el número 866 de GitHub para Docker:
pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
docker -d
“Obligará a Docker a recrear el puente y reiniciar todas las reglas de la red”
Hay un problema similar en StackOverflow donde una solución diferente resuelve este problema con Docker 17.09 en Ubuntu 16.04:
Verifique el contenido de resolv.conf
:
$ cat /etc/resolv.conf
Si incluye una línea como nameserver 127.0.1.1
significa que los contenedores obtienen un servidor de nombres incorrecto. Para arreglar esto, edite el NetworkManager.conf
expediente:
$ sudo pico /etc/NetworkManager/NetworkManager.conf
Y comentar la línea con dns=dnsmasq
; el archivo debería verse así:
[main]
plugins=ifupdown,keyfile,ofono
#dns=dnsmasq
[ifupdown]
managed=false
Finalmente, reinicie el administrador de red:
$ sudo systemctl restart network-manager
Pruebe de nuevo el contenedor:
$ docker run ubuntu:16.04 apt-get update
Get:1 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB]
Get:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [102 kB]
Lo primero que hay que comprobar es ejecutar cat /etc/resolv.conf
en el contenedor docker. Si tiene un servidor DNS no válido, como nameserver 127.0.x.x
entonces el contenedor no podrá convertir los nombres de dominio en direcciones IP, por lo que ping google.com
fallará.
Lo segundo que hay que comprobar es ejecutar cat /etc/resolv.conf
sobre el máquina anfitriona. Docker básicamente copia el host /etc/resolv.conf
al contenedor cada vez que se inicia un contenedor. Así que si el anfitrión es /etc/resolv.conf
está mal, entonces también lo estará el contenedor docker.
Si ha encontrado que el anfitrión /etc/resolv.conf
está mal, entonces tienes 2 opciones:
-
Codifique el servidor DNS en daemon.json. Esto es fácil, pero no 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. Codificar el servidor DNS en docker daemon.json
-
Editar
/etc/docker/daemon.json
"dns": ["10.1.2.3", "8.8.8.8"]
-
Reinicie el demonio docker para que esos cambios surtan efecto:
sudo systemctl restart docker
-
Ahora, cuando ejecuta/inicia un contenedor, la ventana acoplable se llenará
/etc/resolv.conf
con los valores dedaemon.json
.
2. Arreglar los anfitriones /etc/resolv.conf
A. Ubuntu 16.04 y anteriores
-
Para Ubuntu 16.04 y anteriores,
/etc/resolv.conf
fue generado dinámicamente por NetworkManager. -
Comente la línea
dns=dnsmasq
(con un#
) en/etc/NetworkManager/NetworkManager.conf
-
Reinicie NetworkManager para regenerar
/etc/resolv.conf
:sudo systemctl restart network-manager
-
Verifique en el host:
cat /etc/resolv.conf
B. Ubuntu 18.04 y posterior
-
Ubuntu 18.04 cambiado para usar
systemd-resolved
para generar/etc/resolv.conf
. Ahora, de forma predeterminada, 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, que puede fallar para las personas detrás de un firewall. -
/etc/resolv.conf
es en realidad un enlace simbólico (ls -l /etc/resolv.conf
) que apunta a/run/systemd/resolve/stub-resolv.conf
(127.0.0.53) por defecto en Ubuntu 18.04. -
Simplemente cambie el enlace simbólico para que apunte a
/run/systemd/resolve/resolv.conf
que enumera los servidores DNS reales:sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
-
Verifique en el host:
cat /etc/resolv.conf
Ahora deberías tener una válida /etc/resolv.conf
en el host para que docker lo copie en los contenedores.
Te mostramos las reseñas y valoraciones de los usuarios
Si guardas alguna suspicacia o disposición de acrecentar nuestro ensayo te proponemos realizar una nota y con mucho placer lo observaremos.