Nessuna connessione Internet all'interno dei contenitori Docker


24

Non riesco a eseguire alcun comando che richieda una connessione Internet all'interno di qualsiasi contenitore Docker.

Lavori:

docker run ubuntu /bin/echo 'Hello world'

Non funziona:

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'

Simile con pipe ping.

Sono su Ubuntu 16.04 e non utilizzo firewall o server proxy aziendale e ho provato a riavviare Docker.

UPD:

L'aggiornamento in modalità interattiva non riesce allo stesso modo.

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 funziona correttamente sull'host, cioè sul mio computer al di fuori della finestra mobile.

Aggiorna Docker versione 1.12.1, build 23cf638


Puoi eseguire il ping di un dominio dall'host? Puoi correre apt-get updatementre sei in modalità interattiva con la finestra mobile?
adampski,

l'output mostra l'errore: errore temporaneo nella risoluzione di 'archive.ubuntu.com' ... prova .. ping www.google.com .. vedi se ottieni la stessa risposta .. quindi prova ... ping 8.8.8.8 .. se l'IP funziona e il nome host non funziona, allora il tuo DNS è rotto (più /etc/resolv.conf per vedere quale server DNS viene utilizzato)
TG2

@adampski, ho aggiornato la domanda in base ai tuoi suggerimenti.
Sashko Lykhenko,

@ TG2, ho aggiornato anche la domanda in base ai tuoi suggerimenti.
Sashko Lykhenko,

Quale versione del motore docker stai utilizzando?
adampski,

Risposte:


13

Come suggerito da Creack sul numero # 866 di GitHub per Docker :

pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
docker -d

"Costringerà la finestra mobile a ricreare il bridge e a reintegrare tutte le regole di rete"


1
L'ho provato e questo uccide la rete su tutto il mio computer.
petersohn,

Questo è utile e ha risolto il problema per me. Grazie.
Rao

10
La -dbandiera non esce.
Luís de Sousa il

2
Ciao @ LuísdeSousa è un peccato che tu abbia votato in questo senso, ma considera la possibilità che alcuni switch vengano rimossi o modificati nelle versioni più recenti. Soprattutto da quando è stato più di un anno fa.
adampski,

3
invece di copiare / incollare solo il comando potresti spiegare cosa significano :)
Adelin,

12

Esiste un problema simile in StackOverflow in cui una diversa soluzione risolve questo problema con Docker 17.09 su Ubuntu 16.04:

Controlla i contenuti di resolv.conf:

$ cat /etc/resolv.conf

Se include una riga simile nameserver 127.0.1.1, significa che i contenitori stanno ottenendo un server dei nomi errato. Per risolvere questo problema, modifica il NetworkManager.conffile:

$ sudo pico /etc/NetworkManager/NetworkManager.conf

E commenta la linea con dns=dnsmasq; il file dovrebbe apparire così:

[main]
plugins=ifupdown,keyfile,ofono
#dns=dnsmasq

[ifupdown]
managed=false

Infine, riavvia il gestore di rete:

$ sudo systemctl restart network-manager

Prova di nuovo il contenitore:

$ 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]

La mia installazione corrisponde alla descrizione e l'approccio sopra ha risolto il problema per me.
krcools,

risposta aggiornata per Ubuntu 18.04: superuser.com/a/1335054
wisbucky,

7

La prima cosa da controllare viene eseguita cat /etc/resolv.confnel contenitore della finestra mobile . Se ha un server DNS non valido, ad esempio nameserver 127.0.x.x, il contenitore non sarà in grado di risolvere i nomi di dominio in indirizzi IP, quindi ping google.comfallirà.

La seconda cosa da verificare viene eseguita cat /etc/resolv.confsul computer host . Docker fondamentalmente copia l'host /etc/resolv.confnel contenitore ogni volta che viene avviato un contenitore. Quindi, se l'host /etc/resolv.confè sbagliato, lo sarà anche il contenitore della finestra mobile.

Se hai scoperto che l'host /etc/resolv.confè sbagliato, hai 2 opzioni:

  1. Hardcode del server DNS in daemon.json. Questo è facile, ma non ideale se si prevede che il server DNS cambi.

  2. Correggi gli host /etc/resolv.conf. Questo è un po 'più complicato, ma viene generato dinamicamente e non stai codificando il server DNS.


1. Server DNS hardcode in docker daemon.json

  • modificare /etc/docker/daemon.json

    {
        "dns": ["10.1.2.3", "8.8.8.8"]
    }
    
  • Riavvia il daemon docker per rendere effettive le modifiche:
    sudo systemctl restart docker

  • Ora quando si esegue / avvia un contenitore, la finestra mobile verrà popolata /etc/resolv.confcon i valori da daemon.json.


2. Correggi gli host /etc/resolv.conf

A. Ubuntu 16.04 e precedenti

  • Per Ubuntu 16.04 e precedenti, è /etc/resolv.confstato generato dinamicamente da NetworkManager.

  • Commenta la riga dns=dnsmasq(con a #) in /etc/NetworkManager/NetworkManager.conf

  • Riavvia NetworkManager per rigenerare /etc/resolv.conf:
    sudo systemctl restart network-manager

  • Verifica sull'host: cat /etc/resolv.conf

B. Ubuntu 18.04 e versioni successive

  • Ubuntu 18.04 è stato modificato per utilizzare systemd-resolvedper generare/etc/resolv.conf . Ora, per impostazione predefinita, utilizza una cache DNS locale 127.0.0.53. Ciò non funzionerà all'interno di un container, quindi Docker passerà automaticamente al server DNS 8.8.8.8 di Google, che potrebbe rompersi per le persone dietro un firewall.

  • /etc/resolv.confè in realtà un symlink ( ls -l /etc/resolv.conf) che punta a /run/systemd/resolve/stub-resolv.conf(127.0.0.53) per impostazione predefinita in Ubuntu 18.04.

  • Basta cambiare il collegamento simbolico a cui puntare /run/systemd/resolve/resolv.conf, che elenca i server DNS reali:
    sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

  • Verifica sull'host: cat /etc/resolv.conf

Ora dovresti avere un valido /etc/resolv.confsull'host per la finestra mobile da copiare nei contenitori.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.