Solución:
Para todas las plataformas
Docker v 20.10 y superior (desde el 14 de diciembre de 2020)
En Linux, agregue --add-host=host.docker.internal:host-gateway
a su comando de Docker para habilitar esta función. (Consulte a continuación la configuración de Docker Compose).
Utilice su dirección IP interna o conéctese al nombre DNS especial host.docker.internal
que se resolverá en la dirección IP interna utilizada por el host.
Para habilitar esto en Docker Compose en Linux, agregue las siguientes líneas a la definición del contenedor:
extra_hosts: - "host.docker.internal:host-gateway"
Para macOS y Windows
Docker v 18.03 y superior (desde el 21 de marzo de 2018)
Utilice su dirección IP interna o conéctese al nombre DNS especial host.docker.internal
que se resolverá en la dirección IP interna utilizada por el host.
Soporte de Linux pendiente https://github.com/docker/for-linux/issues/264
MacOS con versiones anteriores de Docker
Docker para Mac v 17.12 a v 18.02
Igual que el anterior pero use docker.for.mac.host.internal
en lugar de.
Docker para Mac v 17.06 a v 17.11
Igual que el anterior pero use docker.for.mac.localhost
en lugar de.
Docker para Mac 17.05 y versiones anteriores
Para acceder a la máquina host desde el contenedor de la ventana acoplable, debe adjuntar un alias de IP a su interfaz de red. Puede vincular la IP que desee, solo asegúrese de no usarla para nada más.
sudo ifconfig lo0 alias 123.123.123.123/24
Luego, asegúrese de que su servidor esté escuchando la IP mencionada anteriormente o 0.0.0.0
. Si está escuchando en localhost 127.0.0.1
no aceptará la conexión.
Luego, simplemente apunte su contenedor docker a esta IP y podrá acceder a la máquina host.
Para probar, puede ejecutar algo como curl -X GET 123.123.123.123:3000
dentro del contenedor.
El alias se restablecerá en cada reinicio, así que cree un script de inicio si es necesario.
Solución y más documentación aquí: https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds
Al ejecutar Docker de forma nativa en Linux, puede acceder a los servicios de host utilizando la dirección IP del docker0
interfaz. Desde el interior del contenedor, esta será su ruta predeterminada.
Por ejemplo, en mi sistema:
$ ip addr show docker0
7: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::f4d2:49ff:fedd:28a0/64 scope link
valid_lft forever preferred_lft forever
Y dentro de un contenedor:
# ip route show
default via 172.17.0.1 dev eth0
172.17.0.0/16 dev eth0 src 172.17.0.4
Es bastante fácil extraer esta dirección IP usando un simple script de shell:
#!/bin/sh
hostip=$(ip route show | awk '/default/ {print $3}')
echo $hostip
Es posible que deba modificar el iptables
reglas en su host para permitir conexiones desde contenedores Docker. Algo como esto hará el truco:
# iptables -A INPUT -i docker0 -j ACCEPT
Esto permitiría el acceso a cualquier puerto del host desde los contenedores de Docker. Tenga en cuenta que:
-
Las reglas de iptables están ordenadas, y esta regla puede o no hacer lo correcto dependiendo de qué otras reglas vengan antes.
-
solo podrá acceder a los servicios de host que estén (a) escuchando
INADDR_ANY
(también conocido como 0.0.0.0) o que están escuchando explícitamente en eldocker0
interfaz.
Si está utilizando Docker en MacOS o Windows 18.03+, puede conectarse al nombre de host mágico host.docker.internal
.
Por último, en Linux puede ejecutar su contenedor en el espacio de nombres de la red del host configurando --net=host
; en este caso localhost
en tu anfitrión es lo mismo que localhost
dentro del contenedor, por lo que el servicio contenedorizado actuará como servicios no contenedorizados y será accesible sin ninguna configuración adicional.
Usar --net="host"
en tus docker run
comando, entonces localhost
en su contenedor de la ventana acoplable apuntará a su host de la ventana acoplable.