La compilación de Docker "No se pudo resolver 'archive.ubuntu.com'" apt-get no instala nada

101

He intentado ejecutar la compilación de Docker en varios archivos que antes funcionaban, que ahora ya no funcionan.

Tan pronto como el archivo Docker incluyera cualquier línea que fuera a instalar software, fallaría con un mensaje que decía que no se encontró el paquete.

RUN apt-get -y install supervisor nodejs npm

El mensaje común que apareció en los registros fue

Could not resolve 'archive.ubuntu.com'

¿Alguna idea de por qué no se instala ningún software?

Matt Carrier
fuente
esto sucederá cuando la máquina se desconecte de la red ... He visto que eso sucede en una computadora portátil Linux con una nueva instalación de Docker si solo emito en newgrp dockerlugar de hacer un cierre de sesión completo y luego inicie sesión después de darme sudo usermod -aG docker myuserid... es un caso de borde para seguro, sin embargo, sucede
Scott Stensland

Respuestas:

250

Dejar DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"de comentar /etc/default/dockercomo Matt Carrier sugirió NO funcionó para mí. Tampoco poner los servidores DNS de mi empresa en ese archivo. Pero, hay otra forma (sigue leyendo).

Primero, verifiquemos el problema:

$ docker run --rm busybox nslookup google.com   # takes a long time
nslookup: can't resolve 'google.com'   # <--- appears after a long time
Server:    8.8.8.8
Address 1: 8.8.8.8

Si el comando parece bloquearse, pero finalmente escupe el error "no se puede resolver 'google.com'", entonces tienes el mismo problema que yo.

El nslookupcomando consulta el servidor DNS 8.8.8.8 para convertir la dirección de texto de 'google.com' en una dirección IP. Irónicamente, 8.8.8.8 es el servidor DNS público de Google . Si nslookupfalla, los servidores DNS públicos como 8.8.8.8 podrían ser bloqueados por su empresa (lo que supongo que es por razones de seguridad).

Se podría pensar que la adición de servidores DNS de su empresa a DOCKER_OPTSen /etc/default/dockerdebe hacer el truco, pero por alguna razón, no funcionó para mí. A continuación, describo lo que funcionó para mí.

SOLUCION :

En el host (estoy usando Ubuntu 16.04), averigüe las direcciones del servidor DNS primario y secundario:

$ nmcli dev show | grep 'IP4.DNS'
IP4.DNS[1]:              10.0.0.2
IP4.DNS[2]:              10.0.0.3

Con estas direcciones, cree un archivo /etc/docker/daemon.json:

$ sudo su root
# cd /etc/docker
# touch daemon.json

Pon esto en /etc/docker/daemon.json:

{                                                                          
    "dns": ["10.0.0.2", "10.0.0.3"]                                                                           
}     

Salir de la raíz:

# exit

Ahora reinicie la ventana acoplable:

$ sudo service docker restart

VERIFICACION :

Ahora verifique que agregar el /etc/docker/daemon.jsonarchivo le permite resolver 'google.com' en una dirección IP:

$ docker run --rm busybox nslookup google.com
Server:    10.0.0.2
Address 1: 10.0.0.2
Name:      google.com
Address 1: 2a00:1450:4009:811::200e lhr26s02-in-x200e.1e100.net
Address 2: 216.58.198.174 lhr25s10-in-f14.1e100.net

REFERENCIAS :

Basé mi solución en un artículo de Robin Winslow, quien merece todo el crédito por la solución. ¡Gracias, Robin!

"Corrige la configuración de DNS de red de Docker". Robin Winslow. Consultado el 9 de noviembre de 2016. https://robinwinslow.uk/2016/06/23/fix-docker-networking-dns/

Matthew Kraus
fuente
3
Recibí un error, que el servicio no se puede iniciar después de los cambios. Esto se debió a que modifiqué DOCKER_OPTS en / etc / default / docker y /etc/init.d/docker. La reversión de los cambios resolvió el problema de inicio del servicio
Docker
7
Esto funcionó para mí (en la red de una empresa), mientras que la solución aceptada no lo hizo.
David Ebbo
1
Esto también funcionó para mí, mientras que la solución aceptada no lo hizo. Usé nslookup para obtener la IP de mi servidor DNS, aunque no nmcli.
Necro
2
¡daemon.json también funciona para mí! Y puede verificar si su empresa ha bloqueado 8.8.8.8 con este comando.En nslookup google.com 8.8.8.8mi caso, es así que recibí este errorconnection timed out; no servers could be reached
ROTOGG
3
Creo que la razón por la /etc/default/dockerque no funcionó para algunas personas es (citando un comentario del archivo)# THIS FILE DOES NOT APPLY TO SYSTEMD
Jakub Bochenski
88

Después de mucho dolor de cabeza encontré la respuesta. Could not resolve 'archive.ubuntu.com'se puede solucionar realizando los siguientes cambios:

  1. Descomente la siguiente línea en /etc/default/docker
    DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"

  2. Reinicie el servicio Docker sudo service docker restart

  3. Elimine cualquier imagen que haya almacenado en caché la configuración de DNS no válida.

  4. Vuelva a construir y el problema debería resolverse.

El crédito es para Andrew SB

Matt Carrier
fuente
7
también puede agregar --no-cache = true si prefiere no hacer el # 3 anterior
jschorr
8
Esto no me funciona y no tengo ni idea de por qué. He estado luchando contra esto de forma intermitente durante semanas.
Corey Ogburn
2
Estoy ejecutando Linux Mint, por lo que no hay boot2docker. Se crea / etc / default / docker y tiene el indicador DOCKER_OPTS arriba. Reinicié el servicio, borré todas las imágenes y contenedores, pero todavía nada.
Corey Ogburn
2
@CoreyOgburn También probaría --no-cache = true como lo mencionó jschorr anteriormente. por ejemplo:docker build --no-cache=true ...
Matt Carrier
6
Corrí, docker build --no-cache=true -t docker-whale .pero nada diferente parece haber sucedido.
Corey Ogburn
46

Me encuentro con el mismo problema, pero tampoco descomentar las entradas de / etc / default / docker dns ni editar /etc/resolv.conf en el contenedor de compilación o /etc/docker/daemon.json me ayuda.

Pero después de compilar con la opción --network = host, la resolución estuvo bien nuevamente.

docker build --network=host -t my-own-ubuntu-like-image .

Quizás esto ayude a alguien de nuevo.

Gerald Hansen
fuente
He estado recibiendo un error diferente durante mucho tiempo "No se pudo conectar a archive.ubuntu.com:80 (xxxx). - conectar (111: Conexión rechazada)" y descubrí que el uso de --network = host ahora se ha solucionado mi problema
Eric Arseneau
Después de toneladas de resolución de problemas, esto es lo único que funcionó para mí.
math0ne
15

Creo que la respuesta de Matt Carrier es la solución correcta para este problema. Sin embargo, después de su aplicación, lo que aún se observa el mismo comportamiento: could not resolve 'archive.ubuntu.com'.

Esto me llevó a descubrir finalmente que la red a la que estaba conectado estaba bloqueando el DNS público. La solución a este problema fue configurar mi contenedor Docker para usar el mismo servidor de nombres que mi host (la máquina desde la que estaba ejecutando Docker) estaba usando.

Cómo clasifiqué:

  1. Como estaba trabajando en la documentación de Docker, ya tenía una imagen de ejemplo instalada en mi máquina. Pude iniciar un nuevo contenedor para ejecutar esa imagen y crear una nueva sesión de bash en ese contenedor:docker run -it docker/whalesay bash
  2. ¿El contenedor tiene conexión a Internet ?: ping 172.217.4.238(google.com)
  3. ¿Puede el contenedor resolver nombres de host? ping google.com

En mi caso, el primero pingresultó en respuestas, el segundo no.

Cómo lo arreglé:

Una vez que descubrí que el DNS no funcionaba dentro del contenedor, verifiqué que podía duplicar el mismo comportamiento en el host. nslookup google.comresuelto muy bien en el anfitrión. Pero, nslookup google.com 8.8.8.8o se nsloookup google.com 8.8.4.4agotó el tiempo.

A continuación, encontré el (los) servidor (es) de nombres que mi host estaba usando al ejecutar nm-tool(en Ubuntu 14.04). En la línea de retroalimentación rápida, empecé la imagen de ejemplo de nuevo, y añadí la dirección IP del servidor de nombres de archivo resolv.conf del contenedor: sudo vi /etc/resolv.conf. Una vez guardado, intenté hacer ping nuevamente ( ping google.com) y esta vez funcionó.

Tenga en cuenta que los cambios realizados en el archivo resolv.conf del contenedor no son persistentes y se perderán al reiniciar el contenedor. En mi caso, la solución más apropiada fue agregar la dirección IP del servidor de nombres de mi red al /etc/default/dockerarchivo del host .

TMcManemy
fuente
2
Comandos concretos para obtener las direcciones de los servidores de nombres: nmcli device show <interfacename> | grep IP4.DNS(Ubuntu> = 15) y nmcli dev list iface <interfacename> | grep IP4(Ubuntu <15). Crédito: Marty Fried .
r0estir0bbe
Esta es una respuesta más extensa. Siempre tengo problemas cuando cambio a la red de mi oficina o cuando hay cambios en la red. Agregar el servidor DNS de su empresa soluciona el problema de búsqueda.
gvd
1
¡Muy instructivo! Es raro encontrar respuestas que le muestren cómo verificar el problema y luego proporcionar una solución (y verificar que la solución funcione). ¡Excelente solución de problemas!
Matthew Kraus
Oye, ¿puedes ayudarme? Tengo el mismo problema, pero mi host es una máquina con Windows en la que estoy tratando de ejecutar mi contenedor Docker e intento configurar la imagen de Ubuntu allí. Cuando habla de servidor de nombres aquí, ¿significa la dirección del servidor DNS de mi máquina con Windows? Y en eso también, ¿será el primario o el secundario?
CodeHunter
Este es el problema exacto que enfrenté cuando mi organización bloqueó el DNS público y la configuración del DNS de la organización en / etc / default / docker en DOCKER_OPTS funcionó y el problema se resolvió. Todos
saludan
7

Después de agregar la ip dns local al archivo de Docker predeterminado, comenzó a funcionar para mí ... Por favor, encuentre los pasos a continuación ...

$ nm-tool # (will give you the dns IP)

DNS: 172.168.7.2

$ vim /etc/default/docker # (uncomment the DOCKER_OPTS and add DNS IP)
DOCKER_OPTS="--dns 172.168.7.2 --dns 8.8.8.8 --dns 8.8.4.4"

$ rm `docker ps --no-trunc -aq` # (remove all the containers to avoid DNS cache)

$ docker rmi $(docker images -q) # (remove all the images)

$ service docker restart #(restart the docker to pick up dns setting)

Ahora adelante y construye la ventana acoplable ... :)

Prakash ND
fuente
7

Para cualquiera que también tenga este problema, resolví mi problema editando el /etc/default/dockerarchivo, como lo sugieren otras respuestas y preguntas. Sin embargo, no tenía idea de qué IP usar como DNS.

Fue solo después de un tiempo que descubrí que tenía que ejecutar ifconfig dockeren el host para mostrar la IP de la interfaz de red de la ventana acoplable.

docker0   Link encap:Ethernet  Endereço de HW 02:42:69:ba:b4:07  
          inet end.: 172.17.0.1  Bcast:0.0.0.0  Masc:255.255.0.0
          endereço inet6: fe80::42:69ff:feba:b407/64 Escopo:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Métrica:1
          pacotes RX:8433 erros:0 descartados:0 excesso:0 quadro:0
          Pacotes TX:9876 erros:0 descartados:0 excesso:0 portadora:0
          colisões:0 txqueuelen:0 
          RX bytes:484195 (484.1 KB) TX bytes:24564528 (24.5 MB)

Fue 172.17.0.1en mi caso. Espero que esto ayude a cualquiera que también tenga este problema.

Vini.g.fer
fuente
7
Sería útil si especificara la forma en que editó su archivo docker
physincubus
1
En Ubuntu 18.04:ifconfig docker0
automórfico
6

Encontré esta respuesta después de buscar en Google. Estoy usando Windows, por lo que algunas de las respuestas anteriores no se aplicaron a mi sistema de archivos.

Básicamente ejecutar:

docker-machine ssh default
echo "nameserver 8.8.8.8" > /etc/resolv.conf

Lo que simplemente sobrescribe el servidor de nombres existente utilizado con 8.8.8.8, creo. ¡Funcionó para mí!

Según algunos comentarios, es posible que deba ser root. Para hacer eso, emita sudo -i.

Ingeniero
fuente
Esto no funcionó para mí en Windows 10, ¿porque sshno existe?
Seanny123
@ Seanny123 ha pasado un tiempo desde que hice algo con esto, pero también estaba en Windows 10. ¿Es posible que haya estado usando Docker Toolbox más antiguo en ese momento? De lo contrario, es posible que deba habilitar el cliente SSH de Windows . Probablemente empezaría con eso.
Engineero
1
esto funcionó para mí después de convertirme en root, para hacer eso, problema sudo -iuna vez que estés en
MediaVince
5

Solo quería agregar una respuesta tardía para cualquiera que se encuentre con este problema en los motores de búsqueda.

NO hagas esto: Solía ​​tener una opción en / etc / default / docker para configurar iptables=false. Esto se debió a que ufw no funcionó (todo se abrió a pesar de que solo se permitieron 3 puertos), así que seguí ciegamente la respuesta a esta pregunta: Uncomplicated Firewall (UFW) no bloquea nada cuando se usa Docker y esto, que estaba vinculado en el comentarios

Tengo una comprensión muy baja de las reglas de iptables / nat / enrutamiento en general, por lo que podría haber hecho algo irracional.

Resulta que probablemente lo configuré mal y eliminé la resolución de DNS dentro de mis contenedores. Cuando ejecuté una terminal de contenedores interactiva:docker run -i -t ubuntu:14.04 /bin/bash

Tuve estos resultados:

root@6b0d832700db:/# ping google.com
ping: unknown host google.com

root@6b0d832700db:/# cat /etc/resolv.conf
search online.net
nameserver 8.8.8.8
nameserver 8.8.4.4

root@6b0d832700db:/# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=56 time=1.76 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=56 time=1.72 ms

Revertir toda mi configuración de ufw (before.rules), deshabilitar ufw y eliminar iptables = false de / etc / default / docker restauró la funcionalidad de resolución de DNS de los contenedores.

Ahora espero volver a habilitar la funcionalidad de ufw siguiendo estas instrucciones .

Heno
fuente
3

Tengo el mismo problema y probé los pasos mencionados, pero parece que ninguno funciona hasta que actualice la configuración de red.

Los pasos:

  1. Como se mencionó, agregue DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --ip-masq=true"a /etc/default/docker.
  2. Vacíe manualmente el contenido de la tabla PREROUTING utilizando iptables -t nat -F POSTROUTING. Después de ejecutar esto, reinicie la ventana acoplable y se inicializará la tabla nat con el nuevo rango de IP.
JQian
fuente
3

El mismo problema para mí (en Ubuntu Xenial).

  • docker run --dns ... para contenedores trabajados.
  • La actualización de las opciones del demonio de docker para docker build(docker-compose, etc.) no funcionó.

Después de analizar los registros de la ventana acoplable ( journalctl -u docker.service) si se encuentra alguna advertencia sobre la aplicación incorrecta de resolvconf.

Después de eso, descubrí que nuestros servidores de nombres corporativos se agregaron a las interfaces de red, pero no en resolvconf.

Apliqué esta solución ¿Cómo configuro mi DNS estático en las interfaces? (askubuntu) , es decir, agregar servidores de nombres a/etc/resolvconf/resolv.conf.d/tail

Después de actualizar resolvconf (o reiniciar).

bash docker run --rm busybox nslookup google.com

funcionó al instante.

Todas mis compilaciones de docker-compose están funcionando ahora.

mkoertgen
fuente
2

Tengo el mismo problema hoy, acabo de agregar la línea a continuación a / etc / default / docker

DOCKER_OPTS="--dns 172.18.20.13 --dns 172.20.100.29 --dns 8.8.8.8"

y luego reinicié mi computadora portátil.

En mi caso, reiniciar el demonio de la ventana acoplable no es suficiente para mí, tengo que reiniciar mi computadora portátil para que funcione.

Yusuf Ibrahim
fuente
2

Antes de dedicar demasiado tiempo a cualquiera de las otras soluciones, simplemente reinicie Docker y vuelva a intentarlo.

Resolvió el problema para mí, usando Docker Desktop para Windows en Windows 10.

CGFoX
fuente
Reiniciarlo con derechos de administrador resolvió el problema en mi caso.
vein
1

También he luchado durante algún tiempo con esto, pero aquí está lo que me resolvió Ubuntu 16.04 x64. Espero que también le ahorre tiempo a alguien.

  1. En /etc/NetworkManager/NetworkManager.conf: comentar #dns=dnsmasq

  2. Crear (o modificar) /etc/docker/daemon.json:

{
    "dns": ["8.8.8.8"]
}
  1. Reinicie la ventana acoplable con: sudo service docker restart
palamunder
fuente
Parece ser la misma solución que stackoverflow.com/a/40516974/2308683
OneCricketeer
En realidad no. La solución en NetworkManager.conf marcó la diferencia en mi caso.
Palamunder
Dudo mucho que deshabilitar dnsmasq en todo el sistema sea la mejor solución específicamente para Docker
OneCricketeer
Estoy compartiendo lo que funcionó para mí después de luchar 2 días con este problema.
Palamunder
Esto no funcionó para mí
desmond13
0

En mi sistema ( macOS High Sierra 10.13.6conDocker 2.1.0.1 ) esto se debió a un proxy corporativo.

Resolví esto en dos pasos:

  1. Configure manualmente la configuración del proxy en Preferences>Proxies
  2. Agregue la misma configuración a su config.json dentro ~/.docker/config.json como:

     "proxies":
    {
      "default":
      {
        "httpProxy": "MYPROXY",
        "httpsProxy": "MYPROXY",
        "noProxy": "MYPROXYWHITELIST"
      }
    }
    
gustavz
fuente