Come connettersi a Localhost all'interno di un container Docker

0
24

Quando lavori con Docker, di solito contenitori i servizi che formano il tuo stack e utilizzare 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 a localhost o 127.0.0.1 da un container Docker.

L'opzione facile

Docker Desktop 18.03+ per Windows e Mac supportano host.docker.internal come alias funzionante per localhost. Usa questa stringa all'interno dei tuoi contenitori per accedere al tuo computer host.

  • localhost e 127.0.0.1 – Questi vengono risolti nel 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 una macchina Windows o Mac.

Gli utenti di Docker Engine su Linux possono abilitare anche host.docker.internal tramite il flag –add-host per l'esecuzione di docker . Avvia i tuoi contenitori con questo flag per esporre la stringa host:

docker run -d –add-host host.docker.internal:host-gateway mio-contenitore:latest

Il flag –add-host aggiunge una voce al file /etc/hosts del contenitore. Il valore mostrato sopra mappa host.docker.internal al gateway host del contenitore, che corrisponde al valore localhost reale. Se preferisci, puoi sostituire host.docker.internal con la tua stringa personale.

Connessione alla rete host

Docker fornisce una rete host che consente ai contenitori di condividere lo stack di rete del tuo host. Questo approccio significa che localhost all'interno di un contenitore si risolve nell'host fisico, anziché nel contenitore stesso.

Pubblicità

I container vengono lanciati con la rete host aggiungendo il flag –network=host:

docker run -d –network=host my-container:latest

Ora il tuo container può fare riferimento localhost o direttamente 127.0.0.1.

Se stai utilizzando Docker Compose, modifica la definizione del servizio del tuo contenitore per includere il campo network_mode:

services: my-service: network_mode : ospite

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.

Tutte le porte esposte dal contenitore saranno esposte sull'host, anche se non lo sono esplicitamente dichiarato con il flag -p. Il nome host predefinito del contenitore corrisponderà a quello dell'host, anche se questo può essere modificato con il flag –hostname.

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 sei sicuro che i contenitori in esecuzione non entreranno in conflitto tra loro o causino problemi nell'ambiente host. La modalità di rete dell'host è anche più veloce della modalità bridge predefinita poiché non esiste alcun livello di virtualizzazione per il passaggio del traffico.

Accesso all'host con la modalità bridge predefinita

È ancora possibile accedere all'host dai container nella modalità di rete bridge predefinita. Devi solo fare riferimento al suo IP di rete Docker, invece di localhost o 127.0.0.1.

Annuncio

La maggior parte delle installazioni di Docker Engine rappresenterà l'host come 172.17.0.1 sulla rete bridge docker0 predefinita. Puoi controllare il tuo IP eseguendo questo comando sul tuo host:

ip addr show docker0

L'IP Docker del tuo host verrà mostrato sulla riga inet. 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 la connessione rifiutata o errori simili all'interno del tuo contenitore.

Riepilogo

Hai diverse opzioni quando devi raggiungere l'esterno un contenitore Docker al localhost della tua macchina. Se utilizzi Windows o Mac, è meglio utilizzare l'alias host.docker.internal integrato. Gli utenti Linux possono impostare qualcosa di simile con il flag –add-host all'avvio di un container.

La modalità di rete host è un'alternativa universale che consente ai container di condividere lo stack di rete dell'host. Puoi fare riferimento direttamente a localhost ma devi essere consapevole dei rischi e delle limitazioni. Non è un'opzione adatta quando è richiesto un forte isolamento della rete.

Pubblicità

Il mantenimento della 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.