Quando si lavora con Docker, di solito si containerizza i servizi che formano lo stack e si utilizza la rete tra container per comunicare tra di loro. A volte potresti aver bisogno di un container per parlare con un servizio sul tuo host che non è stato containerizzato. Ecco come accedere a localhost
o 127.0.0.1
da un container Docker.
L'opzione facile
Docker Desktop 18.03+ per Windows e Mac supporta 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 nel contenitore .host.docker.internal
– Questo si risolve all'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 Docker Engine su Linux possono abilitare host.docker.internal
anche tramite il --add-host
flag per docker run
. Inizia 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 /etc/hosts
del contenitore file. Il valore mostrato sopra mappa host.docker.internal
al gateway host del contenitore, che corrisponde al localhost
reale valore. Potresti sostituire host.docker.internal
con la tua stringa se preferisci.
Connessione alla rete host
Docker fornisce un host
rete 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 container può fare riferimento a localhost
o 127.0.0.1
direttamente.
Se utilizzi Docker Compose, modifica la definizione del servizio del tuo container per includere la 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 normalmente ottengono la propria rete privata separata dallo stack dell'host. Quando specifichi --network=host
, il contenitore eredita per impostazione predefinita le impostazioni di rete condivise dal tuo host.
Tutte le porte esposte dal container verranno esposte sull'host , anche se non sono esplicitamente dichiarati con -p
bandiera. Il nome host predefinito del contenitore corrisponderà a quello dell'host, sebbene questo possa essere modificato con --hostname
bandiera.
La rete host può essere un problema di sicurezza che rompe il modello di isolamento dei container Docker. Può comunque essere utile in scenari in cui sei sicuro che i contenitori in esecuzione non entreranno in conflitto tra loro o causeranno 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 nel bridge
predefinito 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
sulla docker0
predefinita 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 su inet
linea. Collegati 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, oltre a 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 al di fuori di un container Docker il localhost
della tua macchina . Se utilizzi Windows o Mac, è meglio utilizzare il host.docker.internal
integrato alias. Gli utenti Linux possono configurare qualcosa di simile con --add-host
flag quando si avvia un container.
La modalità di rete host è un'alternativa universale che consente ai contenitori di condividere lo stack di rete dell'host. Puoi fare riferimento a localhost
direttamente, ma è necessario essere consapevoli dei rischi e dei limiti. Non è un'opzione adatta quando è richiesto un forte isolamento della rete.
Rimanere con la 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 utilizza 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.