Saltar al contenido

Sin conexión a Internet dentro de los contenedores Docker

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.xentonces 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:

  1. Codifique el servidor DNS en daemon.json. Esto es fácil, pero no ideal si espera que cambie el servidor DNS.

  2. 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 de daemon.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.confque 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *