No hay conexión a internet dentro de los contenedores Docker

24

No puedo ejecutar ningún comando que requiera conexión a Internet dentro de ningún contenedor Docker.

Trabajos:

docker run ubuntu /bin/echo 'Hello world'

No funciona:

docker run ubuntu apt-get update

Err:1 http://archive.ubuntu.com/ubuntu xenial InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Err:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Err:3 http://archive.ubuntu.com/ubuntu xenial-security InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Reading package lists...
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial-updates/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial-security/InRelease  Temporary failure resolving 'archive.ubuntu.com'

Similar con pipy ping.

Estoy en Ubuntu 16.04 y no estoy usando firewall o servidor proxy corporativo y he intentado reiniciar Docker.

Upd:

La actualización en modo interactivo falla de la misma manera.

docker exec -ti angry_goodall /bin/bash
apt-get update
#fails
ping google.com
#fails with "unknown host" message
ping 8.8.8.8 
# shows PING 8.8.8.8 (8.8.8.8): 56 data bytes
# and than hangs indefinetly

sudo apt-get update se ejecuta con éxito en el host, es decir, en mi computadora fuera de la ventana acoplable.

Upd Docker versión 1.12.1, compilación 23cf638

Sashko Lykhenko
fuente
¿Se puede hacer ping a un dominio desde el host? ¿Se puede ejecutar apt-get updateen modo interactivo con la ventana acoplable?
adampski
el resultado muestra el error: Error temporal al resolver 'archive.ubuntu.com' ... intente ... haga ping a www.google.com ... vea si obtiene la misma respuesta ... luego intente ... haga ping a 8.8.8.8 ... . si IP funciona y el nombre de host no funciona, entonces su DNS está roto (más /etc/resolv.conf para ver qué servidor DNS se está utilizando)
TG2
@adampski, actualicé la pregunta según tus sugerencias.
Sashko Lykhenko el
@ TG2, también actualicé la pregunta en función de sus sugerencias.
Sashko Lykhenko el
¿Qué versión de Docker Engine estás ejecutando?
adampski

Respuestas:

13

Según lo sugerido por creack en el problema GitHub # 866 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 red"

adampski
fuente
1
Lo intenté, y esto mata la red en toda mi computadora.
petersohn
Esto es útil y resolvió el problema para mí. Gracias.
Rao
10
La -dbandera no sale.
Luís de Sousa
2
Hola @ LuísdeSousa, es una pena que hayas votado en contra, pero considera la posibilidad de que tal vez algunos interruptores se eliminen o se modifiquen en versiones más recientes. Sobre todo porque esto fue hace más de un año.
adampski
3
en lugar de solo copiar / pegar el comando, podrías explicar lo que significan :)
Adelin
12

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.1esta, significa que los contenedores están obteniendo un servidor de nombres incorrecto. Para arreglar esto, edite el NetworkManager.confarchivo:

$ 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 nuevamente 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]
Luís de Sousa
fuente
Mi instalación coincidió con la descripción y el enfoque anterior resolvió el problema por mí.
krcools
respuesta actualizada para Ubuntu 18.04: superuser.com/a/1335054
wisbucky
7

Lo primero que debe verificar es ejecutar cat /etc/resolv.confen el contenedor acoplable . Si tiene un servidor DNS no válido, como nameserver 127.0.x.x, entonces el contenedor no podrá resolver los nombres de dominio en direcciones IP, por ping google.comlo que fallará.

La segunda cosa a verificar se ejecuta cat /etc/resolv.confen la máquina host . Docker básicamente copia el host /etc/resolv.confal contenedor cada vez que se inicia un contenedor. Entonces, si el host /etc/resolv.confestá equivocado, también lo hará el contenedor docker.

Si descubrió que el host /etc/resolv.confestá equivocado, entonces tiene 2 opciones:

  1. Codifique el servidor DNS en daemon.json. Esto es fácil, pero no es 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. Hardcode servidor DNS en docker daemon.json

  • Editar /etc/docker/daemon.json

    {
        "dns": ["10.1.2.3", "8.8.8.8"]
    }
    
  • 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.confcon los valores de daemon.json.


2. Arreglar los hosts /etc/resolv.conf

A. Ubuntu 16.04 y anterior

  • Para Ubuntu 16.04 y versiones anteriores, /etc/resolv.conffue 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-resolvedpara 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 que se encuentran detrás de un firewall.

  • /etc/resolv.confen 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.confen el host para que Docker lo copie en los contenedores.

wisbucky
fuente