Quando lavori con Docker, di solito contenitori i servizi che formano il tuo stack e utilizzi la rete tra container per comunicare tra loro. A volte potresti aver bisogno di un container per parlare con un servizio sul tuo host che non è stato containerizzato. Ecco come accedere localhost
o 127.0.0.1
dall’interno di un container Docker.
L’opzione facile
Supporta Docker Desktop 18.03+ per Windows e Mac host.docker.internal
come alias funzionante per localhost
. Usa questa stringa all’interno dei tuoi contenitori per accedere al tuo computer host.
-
localhost
e127.0.0.1
– Questi si risolvono al contenitore. -
host.docker.internal
– Questo si risolve per l’host esterno.
Se stai eseguendo un server MySQL sul tuo host, i container Docker potrebbero accedervi collegandosi a host.docker.internal:3306
. Questa è la tecnica più semplice quando lavori su un computer Windows o Mac.
Gli utenti di Docker Engine su Linux possono abilitare host.docker.internal
anche tramite il --add-host
bandiera per docker run
. Avvia i tuoi contenitori con questo flag per esporre la stringa host:
docker run -d --add-host host.docker.internal:host-gateway my-container:latest
Il --add-host
flag aggiunge una voce al contenitore /etc/hosts
file. Il valore mostrato sopra le mappe host.docker.internal
al gateway host del contenitore, che corrisponde al reale localhost
valore. Potresti sostituire host.docker.internal
con la tua stringa se preferisci.
Connessione alla rete host
Docker fornisce un host
network che consente ai contenitori di condividere lo stack di rete del tuo host. Questo approccio significa localhost
all’interno di un contenitore si risolve nell’host fisico, anziché nel contenitore stesso.
I container vengono lanciati con la rete host aggiungendo il --network=host
bandiera:
docker run -d --network=host my-container:latest
Ora il tuo contenitore può fare riferimento localhost
o 127.0.0.1
direttamente.
Se stai utilizzando Docker Compose, modifica la definizione del servizio del contenitore per includere il network_mode
campo:
services: my-service: network_mode: host
Ci sono alcuni avvertimenti a questo approccio. È importante considerare tutte le implicazioni prima di utilizzarlo. I container in genere ottengono la propria rete privata separata dallo stack dell’host. Quando specifichi --network=host
, il contenitore per impostazione predefinita eredita le impostazioni di rete condivise dal tuo host.
Eventuali porte esposte dal container saranno esposte sull’host, anche se non sono dichiarati esplicitamente con il -p
bandiera. Il nome host predefinito del contenitore corrisponderà a quello dell’host, sebbene questo possa essere modificato con il tasto --hostname
bandiera.
La rete host può essere un problema di sicurezza che rompe il modello di isolamento dei contenitori Docker. Può comunque essere utile in scenari in cui si è certi che l’esecuzione di contenitori non entrerà in conflitto tra loro o causerà problemi nell’ambiente host. La modalità di rete host è anche più veloce della modalità bridge predefinita in quanto non esiste un livello di virtualizzazione per il passaggio del traffico.
Accesso all’host con la modalità Bridge predefinita
È ancora possibile accedere al tuo host dai contenitori per impostazione predefinita bridge
modalità di rete. Devi solo fare riferimento al suo IP di rete Docker, invece di localhost
o 127.0.0.1
.
La maggior parte delle installazioni di Docker Engine rappresenterà l’host come 172.17.0.1
sull’impostazione predefinita docker0
rete di ponti. Puoi controllare il tuo IP eseguendo questo comando sul tuo host:
ip addr show docker0
L’IP Docker del tuo host verrà mostrato sul inet
linea. Connettiti a questo indirizzo IP dai tuoi container per accedere con successo ai servizi in esecuzione sul tuo host.
Una trappola di questo approccio è che potresti non essere in grado di connetterti a servizi che si legano direttamente a localhost
. Dovrai assicurarti che i tuoi servizi stiano ascoltando le connessioni sul tuo IP bridge Docker, così come localhost
e 127.0.0.1
. Altrimenti vedrai connection refused
o errori simili all’interno del tuo contenitore.
Riepilogo
Hai diverse opzioni quando devi raggiungere la tua macchina dall’esterno di un container Docker localhost
. Se sei su Windows o Mac, è meglio usare il built-in host.docker.internal
alias. Gli utenti Linux possono configurare qualcosa di simile con il --add-host
flag quando si avvia un contenitore.
La modalità di rete host è un’alternativa universale che consente ai contenitori di condividere lo stack di rete dell’host. Puoi fare riferimento localhost
direttamente, ma devono essere consapevoli dei rischi e dei limiti. Non è un’opzione adatta quando è richiesto un forte isolamento della rete.
Attenersi alla modalità bridge può essere l’opzione migliore per i carichi di lavoro che la supportano. Associa i servizi del tuo host al suo IP Docker, quindi usa quell’indirizzo per connetterti dall’interno del tuo container. Ciò ti consente di utilizzare la rete virtualizzata per container di Docker fornendo un percorso al tuo host quando è necessario.