2015-11-14 5 views
5

Per qualche motivo, non posso ottenere Docker per comunicare con Dockerhub; I comandi search e pull non riescono per qualche motivo correlato al DNS. Ad esempio:Docker pull non riesce a cercare index.docker.io su 127.0.1.1:53 (non può unmarshal messaggio DNS)

$ docker pull redis 
Pulling repository redis 
Get https://index.docker.io/v1/repositories/library/redis/images: dial tcp: lookup index.docker.io on 127.0.1.1:53: cannot unmarshal DNS message 

La mia connessione Internet va bene. Posso fare un rumore metallico 127.0.1.1. È un indirizzo localhost? Esiste qualche tipo di servizio DNS specifico Dockerhub in esecuzione che potrebbe essere danneggiato sul mio computer? Nient'altro sembra essere sbagliato con la mia rete.

Ho provato a configurare la mia connessione di rete per utilizzare il DNS di Google (8.8.8.8), ma ciò non ha fatto alcuna differenza.

aggiornamento

Stranamente, non riesco a ping index.docker.io, ma se provo a navigare lì in un browser, vengo reindirizzato a hub.docker.com.

aggiornamento

ora posso confermare che questo avviene solo su un LAN, in un hotel. Non ho idea di cosa stiano facendo, o del perché influisce solo su Docker, e non su Git o Bittorrent o su qualsiasi altro strumento connesso.

+0

Hai un proxy per la tua connessione Internet? – VonC

+0

Stavo usando il DNS di Google a 8.8.8.8, ma ho già provato a disattivarlo. Sono in un grande albergo, non mi sorprenderebbe se facessero cose strane al loro traffico. –

+0

Stai usando l'host Linux direttamente per la sessione docker o una VM Linux con Windows o Mac? – VonC

risposta

3

La domanda è un po 'vecchia, ma dal momento che rimane senza risposta e mi è capitato di inciampare in esso, eccolo.

La rete locale per l'hotel in cui si alloggiava probabilmente aveva il suo indirizzo di rete che si scontrava con la rete virtuale creata da Docker. Ho avuto lo stesso tipo di emesso in una rete aziendale.

La correzione più semplice (ma non molto ben documentata) consiste nel forzare Docker a utilizzare un indirizzo di rete arbitrario per la lan virtuale, utilizzando il parametro "--bip". In Linux questo è solitamente facile da realizzare modificando la configurazione di Docker in/etc, eppure su un Mac (nel caso in cui qualcuno si imbatta in questo) è stato particolarmente difficile trovare il file da modificare. Prendi una buona lettura allo https://github.com/docker/docker/issues/25064 se questo è il tuo caso.

Fondamentalmente, è necessario trovare un segmento di rete che non è in uso sulla rete a cui si è connessi. Docker proverà a farlo di default: userà il primo CIDR privato che non si scontrerà con nessuna delle tue interfacce di rete. Se ci si trova su un segmento di LAN privato che si verifica per instradare attraverso un altro segmento privato, tuttavia, Docker non può vederlo e potrebbe finire per creare una rete locale con un CIDR che interferisce, impedendo il routing dei pacchetti da esso.

Un esempio, per chiarimenti:

Il tuo indirizzo IP potrebbe essere 192.168.10.2 con una maschera di rete di/24. Questa rete potrebbe avere un gateway predefinito su 192.168.10.1/24, ma tale gateway ti indirizza attraverso un altro router con indirizzo 172.17.1.1.

Docker noterà che 192.168.10.0/24 è in uso e crea una rete virtuale con indirizzi su 172.16.0.0/16 - quindi i contenitori tenteranno di instradare localmente tutti gli indirizzi sotto quel CIDR e non arriveranno mai al 172.17.1.1 router esterno. In tal caso, vuoi cambiare il tuo --bip con qualcosa di diverso, ad esempio 10.0.0.1/16. Ciò consentirà il corretto routing dei pacchetti.