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 pip
y 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
networking
ubuntu
docker
Sashko Lykhenko
fuente
fuente
apt-get update
en modo interactivo con la ventana acoplable?Respuestas:
Según lo sugerido por creack en el problema GitHub # 866 para Docker :
"Obligará a Docker a recrear el puente y reiniciar todas las reglas de red"
fuente
-d
bandera no sale.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
:Si incluye una línea como
nameserver 127.0.1.1
esta, significa que los contenedores están obteniendo un servidor de nombres incorrecto. Para arreglar esto, edite elNetworkManager.conf
archivo:Y comentar la línea con
dns=dnsmasq
; el archivo debería verse así:Finalmente, reinicie el administrador de red:
Pruebe nuevamente el contenedor:
fuente
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 el host/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 que se encuentran 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