docker.io DNS non funziona, sta cercando di utilizzare 8.8.8.8


33

Ho una nuova installazione di Ubuntu 14.04 e voglio usare Docker per eseguire le mie vecchie cose che richiedono 12.04. Il DNS all'interno di Docker non funziona.

Resolv.conf del mio laptop assomiglia a:

nameserver 127.0.0.1

Che a quanto pare non funziona con Docker. Quindi tenta di impostare i nameserver su 8.8.8.8 e 8.8.4.4; quando io faccio

$ sudo docker run -i -t ubuntu /bin/bash

Dice:

WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it. Using default external servers : [8.8.8.8 8.8.4.4]

E abbastanza sicuro, all'interno dell'istanza Docker, resolv.conf assomiglia a:

nameserver 8.8.8.8
nameserver 8.8.4.4

Posso eseguire il ping entrambi con successo dall'istanza Docker. Tuttavia, non esiste un DNS (ad es. ping google.comErrore).

Uscita ifconfig all'interno di Docker:

eth0      Link encap:Ethernet  HWaddr aa:e9:9f:83:9d:92  
          inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::a8e9:9fff:fe83:9d92/64 Scope:Link
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:648 (648.0 B)  TX bytes:738 (738.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

E adesso?

Risposte:


23

Quando il pacchetto Ubuntu Docker è stato aggiornato all'utilizzo di systemd, ha eliminato il supporto per il /etc/default/dockerfile di configurazione, quindi la soluzione iniziale suggerita da rocketman10404 non funzionerà più (la disabilitazione dnsmasqfunzionerebbe comunque, ma ha il rovescio della medaglia di impedire ad Ubuntu di aggiornare automaticamente il server DNS) .

Correzione nel nuovo daemon.jsonfile di configurazione

Trova il server DNS della tua rete:

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

Apri o crea, se non esiste, /etc/docker/daemon.jsone aggiungi le impostazioni DNS alla ExecStartlinea:

# /etc/docker/daemon.json
{
    "dns": ["10.0.0.2", "8.8.8.8"]
}

Riavvia il daemon docker:

$ sudo service docker restart

Ho scritto un post sul blog approfondito e ho anche segnalato un bug su questo problema se desideri maggiori dettagli.

(Inizialmente l'ho risolto aprendo /lib/systemd/system/docker.service e aggiungendo le impostazioni DNS alla linea ExecStart , ma non va bene, non dovremmo modificare direttamente i file systemd .)


Grazie per la tua soluzione - è stato utile sulla strada che ho intrapreso per la mia soluzione - che penso sia una combinazione leggermente più elegante per le mie circostanze e le peculiarità di eseguire Docker su Ubuntu (o altre distribuzioni desktop che utilizzano NetworkManager + dnsmasq).
Adrian,

16

Non uso la finestra mobile, quindi normalmente non inserisco qui una domanda sulla finestra mobile, ma mi è capitato di leggere qualcosa e sono incappato in alcuni documenti sulla finestra mobile che sembrano risolvere questo problema esatto . Per riassumere...

La documentazione suggerisce alcune soluzioni alternative. Il primo è specificare il server DNS che deve essere utilizzato dal demone docker per i contenitori aggiungendo la seguente riga a /etc/default/docker:

docker_OPTS="--dns 8.8.8.8"

dove il DNS fornito potrebbe essere un server DNS locale, come 192.168.1.1 (gateway). Quindi, riavvia con

sudo restart docker

Una soluzione alternativa prevede la disabilitazione di dnsmasq in NetworkManager commentando la configurazione in questo /etc/NetworkManager/NetworkManager.confmodo:

#dns=dnsmasq

quindi riavviare entrambi

sudo restart network-manager
sudo restart docker

3
disabilitando dnsmasq ha funzionato per me.
bennyl,

2
Quest'ultimo approccio ovviamente significa che il gestore della rete non può controllare dnsmasq, ad esempio che non può cambiare il server DNS quando si cambia rete, incluso il passaggio a una VPN. Il primo approccio mi sembra migliore, ma mi piacerebbe avere anche dnsmasq in ascolto sull'IP docker (172.17.0.1) in modo da poter indirizzare gli host docker a quello.
MC0e

1
Poiché Ubuntu è passato alla configurazione di Docker con sytemd, /etc/default/dockernon ha più alcun effetto. Vedi la mia soluzione su come risolverlo in un mondo post-init.d / upstart.
Robin Winslow,

/etc/NetworkManager/NetworkManager.confnon esiste su Ubuntu 18.04 LTS. : /
XtraSimplicity

Nota che con alcune configurazioni di Ubuntu 18.04 (ad esempio l'immagine minima su Amazon) systemd-resolvedagisce come un server DNS di cache per impostazione predefinita e provocherà il WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it.problema (le configurazioni di Ubuntu 16.04 non sembrano abilitarlo per impostazione predefinita). La soluzione alternativa è disabilitare systemd-resolvedo utilizzare l' --dnsopzione all'avvio del contenitore come indicato nella risposta principale.
Anon,

9

Mi sono imbattuto in questo nella mia situazione che è specificamente

  • Esecuzione di contenitori Docker sulla mia macchina di sviluppo locale
  • Che è connesso a una VPN
  • Alcuni dei nostri script per la creazione di container eseguono operazioni come l'esecuzione npm installda un repository personalizzato sulla VPN , all'interno del container.
    • Funziona da una pipeline CI ma non dalle nostre macchine sviluppatore, perché npmnon è possibile eseguire una ricerca DNS di successo
    • Abbiamo anche avuto problemi con i container che devono effettuare ricerche per chiamare API REST esterne

Ubuntu per impostazione predefinita utilizza l' dnsmasqavvio avviato da NetworkManager per memorizzare nella cache le richieste DNS e configura /etc/resolv.confper puntare a questa istanza su127.0.1.1

  • Il client VPN che stiamo utilizzando non è compatibile con NetworkManager e forza il proprio /etc/resolv.confche sovrascrive la configurazione di NetworkManager
  • Ciò configura i server DNS per la VPN
  • Docker ti ombreggia /etc/resolv.confsul container per impostazione predefinita
    • Di solito su Ubuntu, passa i server DNS di Google al contenitore (perché conosce la dnsmasqsituazione.
    • Ma è felice di passare la configurazione del server DNS VPN al contenitore
    • Non esiste alcun percorso dal contenitore sul docker0bridge di rete ai server DNS tramite l' tap0adattatore VPN .
  • Ergo, tutte le ricerche DNS nel contenitore falliscono perché non riescono a raggiungere gli unici server DNS forniti
  • Inoltre, alcune reti bloccano le richieste ai server DNS di Google perché vogliono essere in grado di ficcare tutte le ricerche DNS

La soluzione :

Sembrerebbe più elegante usare NetworkManager ed è dnsmasqun'istanza prigioniera nel modo in cui è stata progettata.

  1. Di 'a Docker di usare la tua dnsmasqistanza per DNS

    • Aggiungi o modifica il file /etc/docker/daemon.jsonper indicare alla finestra mobile di utilizzare l' docker0adattatore bridge per DNS

      {
        "dns": ["172.17.0.1"]
      }
      
  2. Configurare l' dnsmasqistanza NM per ascoltare anche i bridge Docker, perché per impostazione predefinita ascolta solo 127.0.1.1 - crea file/etc/NetworkManager/dnsmasq.d/docker-bridge.conf

    # Default Docker bridge
    interface=docker0
    # Other Docker bridges
    interface=br-*
    
  3. Non mi piace il comportamento scortese di quel client VPN e preferirei utilizzare il DNS solo all'estremità VPN per le ricerche VPN (se hai un client VPN educato che utilizza NetworkManager configurato correttamente, non dovrai farlo )

    • Disattiva la funzione DNS nel client VPN (interrompe la sovrascrittura resolv.confalla connessione e ora tutto il DNS passa di dnsmasqnuovo)
    • Aggiungi un file di configurazione per dire dnsmasqdi indirizzare correttamente le richieste DNS per il tuo dominio - aggiungi il file `/etc/NetworkManager/dnsmasq.d/vpn-dns.conf

      server=/myprivatedomain.net/10.0.0.1  
      # or whatever your private DNS server is
      
    • Facoltativamente, aggiungi un dominio di ricerca per il tuo dominio in modo da poter utilizzare nomi brevi

      • Ho appena aggiunto il nostro dominio locale all'elenco di ricerca nella mia connessione di rete predefinita
  4. Riavviare NetworkManager e Docker

    sudo service network-manager restart
    sudo service docker restart
    

A questo punto i container Docker dovrebbero essere in grado di fare a nslookupmeno dei problemi quando si è su VPN, per domini sia all'interno che all'esterno della VPN.


1
Una piccola modifica che non prevede la codifica hardware dell'IP bridgeer0 docker0 consiste nell'utilizzare l'interfaccia anziché la direttiva address-address: interfaccia = docker0
siwyd

Spiegazioni e istruzioni fantastiche. Un +1 meritato.
Il

Saluti @simonwydooghe - ho incorporato il tuo suggerimento - puoi anche usare i caratteri jolly in quel campo, quindi ho aggiunto un modello per tutti i nomi di bridge usati da reti non predefinite (almeno, come usato da docker-compose).
Adrian,

1
Sembra che il valore DNS in daemon.json debba essere un array, altrimenti visualizzo un errore: cannot unmarshal string into Go value of type []stringal riavvio del servizio docker.
Slaven Rezic,

Aggiornamento per Bionic: 18.04 non utilizza più un'istanza captive di dnsmasq gestita da NetworkManager per DNS e utilizza invece systemd-risolto; che porta i suoi problemi, perché non può essere configurato per ascoltare il bridge docker0. Ho fatto ricorso alla disabilitazione, alla reinstallazione di NetworkManager dnsmasq e alla configurazione corretta.
Adrian,

2

Ecco come ho impostato la finestra mobile sul mio server Ubuntu 14.04 senza testa.

Sto eseguendo Ubuntu server 14.04 con la seguente versione docker installata.

#docker version
Client version: 0.9.1
Go version (client): go1.2.1
Git commit (client): 3600720
Server version: 0.9.1
Git commit (server): 3600720
Go version (server): go1.2.1

Il file /etc/init/docker.io.conf e lo script contengono la seguente riga:

# modify these in /etc/default/$UPSTART_JOB (/etc/default/docker)
    DOCKER=/usr/bin/$UPSTART_JOB
    DOCKER_OPTS=

La risposta sopra mi ha aiutato a trovare il file sopra.

Ho decommentato quanto segue in /etc/default/docker.io e ho aggiunto il mio server DNS locale:

# Use DOCKER_OPTS to modify the daemon startup options.  
DOCKER_OPTS="--dns 192.168.X.X"

Riavviato il servizio con:

sudo service docker.io restart

Corse docker run <image> /bin/bash

Nessun messaggio DNS all'avvio del contenitore.

Avviato un nuovo contenitore, installato dnsutils.

Ho eseguito lo scavo e il messaggio del server è il server DNS locale corretto.


0

Ho avuto un problema simile, lo ho segnalato a StackOverflow . Sembra che non sia stato possibile interrogare il 8.8.8.8nameserver specificato nell'installazione Ubuntu predefinita di Docker; tuttavia, potrei eseguire il ping. In questo caso, utilizzare un server DNS su cui è possibile eseguire una query. Prova con

nslookup - dns.server.name

e avviare il contenitore tramite

docker run --dns=ip.addr.of.dns

Devo ancora trovare un modo per https://askubuntu.com/q/607172/30266 per ottenere una soluzione automagica.


La mia risposta potrebbe essere abbastanza automagica per te ...
Adrian,

0

È possibile utilizzare il resolver DNS locale dell'host (ad es. dnsmasq) Dai contenitori Docker se si trovano su una rete definita dall'utente . In tal caso, un container /etc/resolv.confavrà il nameserver 127.0.0.11(ovvero il server DNS incorporato del Docker ), che può inoltrare correttamente le richieste DNS all'indirizzo di loopback dell'host.

$ cat /etc/resolv.conf
nameserver 127.0.0.1
$ docker run --rm alpine cat /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
$ docker network create demo
557079c79ddf6be7d6def935fa0c1c3c8290a0db4649c4679b84f6363e3dd9a0
$ docker run --rm --net demo alpine cat /etc/resolv.conf
nameserver 127.0.0.11
options ndots:0    

Se lo usi docker-compose, imposterà automaticamente una rete personalizzata per i tuoi contenitori (con un formato file v2 + ). Si noti, tuttavia, che mentre docker-composeesegue i contenitori in una rete definita dall'utente, li crea comunque nella rete predefinita . Per utilizzare una rete personalizzata per build è possibile specificare il networkparametro nella configurazione build (richiede il formato file v3.4 + ).

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.