Como se indica en uno de los comentarios, esto funciona para Mac (probablemente también para Windows/Linux):
QUIERO CONECTAR DESDE UN CONTENEDOR A UN SERVICIO EN EL HOST
El host tiene una dirección IP cambiante (o ninguna si no tiene acceso a la red). Le recomendamos que se conecte al nombre DNS especial host.docker.internal
que se resuelve en la dirección IP interna utilizada por el host. Esto es para fines de desarrollo y no funcionará en un entorno de producción fuera de Docker Desktop para Mac.
También puede comunicarse con la puerta de enlace usando gateway.docker.internal
.
Citado de https://docs.docker.com/docker-for-mac/networking/
Esto funcionó para mí sin usar --net=host
.
Una forma simple pero relativamente insegura sería usar el --net=host
opción a docker run
.
Esta opción hace que el contenedor utilice la pila de red del host. Luego puede conectarse a los servicios que se ejecutan en el host simplemente usando "localhost" como nombre de host.
Esto es más fácil de configurar porque no tendrá que configurar el servicio para aceptar conexiones desde la dirección IP de su contenedor docker, y no tendrá que decirle al contenedor docker una dirección IP específica o un nombre de host para conectarse, simplemente un puerto.
Por ejemplo, puede probarlo ejecutando el siguiente comando, que asume que su imagen se llama my_image
, tu imagen incluye el telnet
y el servicio al que desea conectarse está en el puerto 25:
docker run --rm -i -t --net=host my_image telnet localhost 25
Si considera hacerlo de esta manera, consulte la precaución sobre seguridad en esta página:
https://docs.docker.com/articles/networking/
Dice:
--net=host:le dice a Docker que omita colocar el contenedor dentro de una pila de red separada. En esencia, esta opción le dice a Docker que no contenga la red del contenedor. Si bien los procesos de contenedor seguirán estando confinados a su propio sistema de archivos y lista de procesos y límites de recursos, un comando rápido de ip addr le mostrará que, en cuanto a la red, viven "fuera" en el host principal de Docker y tienen acceso completo a sus interfaces de red. . Tenga en cuenta que esto no permite que el contenedor vuelva a configurar la pila de la red del host, lo que requeriría --privileged=true, pero permite que los procesos del contenedor abran puertos con números bajos como cualquier otro proceso raíz. También permite que el contenedor acceda a servicios de red local como D-bus. Esto puede llevar a que los procesos en el contenedor puedan hacer cosas inesperadas como reiniciar su computadora. Debe usar esta opción con precaución.
Su host docker expone un adaptador a todos los contenedores. Suponiendo que está en ubuntu reciente, puede ejecutar
ip addr
Esto le dará una lista de adaptadores de red, uno de los cuales se parecerá 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
Deberá decirle a rabbit/mongo que se vincule a esa IP (172.17.42.1). Después de eso, debería poder abrir conexiones a 172.17.42.1 desde sus contenedores.