Come affermato in uno dei commenti, funziona per Mac (probabilmente anche per Windows/Linux):
VOGLIO COLLEGARMI DA UN CONTENITORE A UN SERVIZIO SULL'HOST
L'host ha un indirizzo IP variabile (o nessuno se non si dispone dell'accesso alla rete). Ti consigliamo di connetterti al nome DNS speciale
host.docker.internal
che si risolve nell'indirizzo IP interno utilizzato dall'host. Questo è a scopo di sviluppo e non funzionerà in un ambiente di produzione al di fuori di Docker Desktop per Mac.Puoi anche raggiungere il gateway usando
gateway.docker.internal
.
Citato da https://docs.docker.com/docker-for-mac/networking/
Questo ha funzionato per me senza usare --net=host
.
Un modo semplice ma relativamente insicuro sarebbe usare il --net=host
opzione a docker run
.
Questa opzione fa in modo che il contenitore utilizzi lo stack di rete dell'host. Quindi puoi connetterti ai servizi in esecuzione sull'host semplicemente utilizzando "localhost" come nome host.
Questo è più facile da configurare perché non dovrai configurare il servizio per accettare connessioni dall'indirizzo IP del tuo contenitore docker e non dovrai dire al contenitore docker uno specifico indirizzo IP o nome host a cui connettersi, basta una porta.
Ad esempio, puoi provarlo eseguendo il seguente comando, che presuppone che la tua immagine si chiami my_image
, la tua immagine include il telnet
utility e il servizio a cui vuoi connetterti è sulla porta 25:
docker run --rm -i -t --net=host my_image telnet localhost 25
Se pensi di procedere in questo modo, consulta le avvertenze sulla sicurezza in questa pagina:
https://docs.docker.com/articles/networking/
Dice:
--net=host -- Indica a Docker di saltare il posizionamento del contenitore all'interno di uno stack di rete separato. In sostanza, questa scelta dice a Docker di non containerizzare la rete del contenitore! Mentre i processi del contenitore saranno ancora confinati al proprio file system e all'elenco dei processi e ai limiti delle risorse, un rapido comando ip addr mostrerà che, dal punto di vista della rete, vivono "all'esterno" nell'host Docker principale e hanno pieno accesso alle sue interfacce di rete . Si noti che ciò non consente al contenitore di riconfigurare lo stack di rete dell'host, il che richiederebbe --privileged=true, ma consente ai processi del contenitore di aprire porte con un numero basso come qualsiasi altro processo root. Consente inoltre al contenitore di accedere ai servizi di rete locale come D-bus. Ciò può comportare che i processi nel contenitore siano in grado di eseguire operazioni impreviste come il riavvio del computer. Dovresti usare questa opzione con cautela.
Il tuo host docker espone un adattatore a tutti i contenitori. Supponendo che tu sia su Ubuntu recente, puoi eseguire
ip addr
Questo ti darà un elenco di adattatori di rete, uno dei quali avrà un aspetto simile a
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 22:23:6b:28:6b:e0 brd ff:ff:ff:ff:ff:ff
inet 172.17.42.1/16 scope global docker0
inet6 fe80::a402:65ff:fe86:bba6/64 scope link
valid_lft forever preferred_lft forever
Dovrai dire a rabbit/mongo di collegarsi a quell'IP (172.17.42.1). Successivamente, dovresti essere in grado di aprire connessioni a 172.17.42.1 dai tuoi container.