Saltar al contenido

Los contenedores Docker no pueden resolver DNS en Ubuntu 14.04 Desktop Host

Solución:

Solución 1:

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. La instalación de bridge-utils y la ejecución de lo siguiente hicieron que mi Docker funcionara correctamente:

apt-get install bridge-utils
pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
service docker restart

Solucion 2:

Si 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 docker. 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 lo que ping google.com fallará.

La segunda cosa a verificar 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. Entonces, si el anfitrión /etc/resolv.conf está mal, entonces también lo hará el contenedor de la ventana acoplable.

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. Arregle los hosts /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 de la ventana acoplable para que esos cambios surtan efecto:
    sudo systemctl restart docker

  • Ahora, cuando ejecute / inicie un contenedor, la ventana acoplable se completará /etc/resolv.conf con los valores de daemon.json.


2. Arregle los hosts /etc/resolv.conf

A. Ubuntu 16.04 y versiones anteriores

  • Para Ubuntu 16.04 y versiones anteriores, /etc/resolv.conf fue generado dinámicamente por NetworkManager.

  • Comenta la línea dns=dnsmasq (con un #) en /etc/NetworkManager/NetworkManager.conf

  • Reinicie 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, de forma predeterminada, utiliza una 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ólicols -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 para apuntar a /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ías tener un /etc/resolv.conf en el host para que Docker lo copie en los contenedores.


Solución 3:

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 /etc/resolv.conf originalmente parecía;

#Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.1.1
search companyDomain.co.za

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 del host local al crear el resolv.conf del contenedor y las reemplazará con las direcciones IP de DNS de Google. Lo que en mi caso hizo que los nombres de dominio estuvieran prohibidos.

Tuve que:

  • Restablecer mi /etc/default/docker por defecto para que los contenedores usen el contenido resolv.conf de mi host en su lugar.
  • Editar /etc/NetworkManager/NetworManager.conf y comenta la línea dns=dnsmasq. Esto es para que NM pueda especificar las direcciones IP de DNS reales en lugar de 127.0.0.1.
  • Reinicie NM con sudo service network-manager restart.
  • Reinicie el servicio de Docker con sudo service docker restart.

Ejecutar un contenedor le permitiría hacer apt-get update/upgrade, por ejemplo.


Solución 4:

Tu error está aquí:

 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]

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 se realiza correctamente. (El archivo / espejo de ubuntu está disponible tanto en IPv6 como en IPv4. Tuviste la mala suerte de acceder a uno de IPv6 porque tu sistema cree que debería funcionar).

Debe 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.


Solución 5:

El documento oficial de Docker brinda instrumentos para configurar un servidor DNS para que lo use Docker

  1. Abre el /etc/default/docker archivo para editar:

    sudo nano /etc/default/docker
    
  2. Agregue una configuración para Docker:

    DOCKER_OPTS="--dns 8.8.8.8"
    
  3. Reemplazar 8.8.8.8 con un servidor DNS local como 192.168.1.1. También puede especificar varios servidores DNS. Separarlos con espacios, por ejemplo:

    --dns 8.8.8.8 --dns 192.168.1.1
    

    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 utilizar para comprobar el servidor DNS del host local

  4. Guarde y cierre el archivo.

  5. Reinicie el demonio de Docker.

    sudo service docker restart
    
¡Haz clic para puntuar esta entrada!
(Votos: 1 Promedio: 5)



Utiliza Nuestro Buscador

Deja una respuesta

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