Cuando trabaja con Docker, generalmente coloca en contenedores los servicios que forman su pila y utiliza redes entre contenedores para comunicarse entre ellos. A veces, es posible que necesite un contenedor para hablar con un servicio en su host que no se ha incluido en un contenedor. Aquí se explica cómo acceder a localhost
o 127.0.0.1
desde dentro de un contenedor Docker.
La opción fácil
Docker Desktop 18.03+ para Windows y Mac es compatible con host.docker.internal
como un alias funcional para localhost
. Use esta cadena dentro de sus contenedores para acceder a su máquina host.
localhost
y127.0.0.1
– Estos se resuelven en el contenedor .host.docker.internal
– Esto se resuelve en el host externo.
Si está ejecutando un servidor MySQL en su host, los contenedores de Docker podrían acceder a él conectándose a host.docker.internal:3306
. Esta es la técnica más simple cuando trabaja en una máquina con Windows o Mac.
Los usuarios de Docker Engine en Linux pueden habilitar host.docker.internal
también a través de --add-host
bandera para docker run
. Inicie sus contenedores con esta bandera para exponer la cadena de host:
docker run -d --add-host host.docker.internal:host-gateway my-container:latest
El --add-host
flag agrega una entrada al contenedor /etc/hosts
expediente. El valor que se muestra arriba asigna host.docker.internal
a la puerta de enlace del host del contenedor, que coincide con el localhost
real valor. Podrías reemplazar host.docker.internal
con tu propia cuerda si lo prefieres.
Conexión a la red host
Docker proporciona un host
red que permite que los contenedores compartan la pila de red de su host. Este enfoque significa localhost
dentro de un contenedor se resuelve en el host físico, en lugar del contenedor en sí.
Los contenedores se lanzan con la red host agregando --network=host
bandera:
docker run -d --network=host my-container:latest
Ahora su contenedor puede hacer referencia a localhost
o 127.0.0.1
directamente.
Si usa Docker Compose, modifique la definición de servicio de su contenedor para incluir el network_mode
campo:
services: my-service: network_mode: host
Hay algunas advertencias a este enfoque. Es importante considerar todas las implicaciones antes de usarlo. Los contenedores normalmente obtienen su propia red privada que está separada de la pila del host. Cuando especifica --network=host
, el contenedor hereda de forma predeterminada la configuración de redes compartidas de su host.
Todos los puertos expuestos por el contenedor estarán expuestos en el host , incluso si no se declaran explícitamente con -p
bandera. El nombre de host predeterminado del contenedor coincidirá con el del host, aunque esto se puede cambiar con --hostname
bandera.
La red host puede ser un problema de seguridad que rompe el modelo de aislamiento de los contenedores Docker. Todavía puede ser útil en escenarios en los que está seguro de que los contenedores en ejecución no entrarán en conflicto entre sí ni causarán problemas en su entorno de host. El modo de red del host también es más rápido que el modo de puente predeterminado, ya que no hay una capa de virtualización por la que pueda pasar el tráfico.
Acceder al host con el modo puente predeterminado
Todavía se puede acceder a su host desde contenedores en el bridge
predeterminado modo de red. Solo necesita hacer referencia a él por su IP de red Docker, en lugar de localhost
o 127.0.0.1
.
La mayoría de las instalaciones de Docker Engine representarán el host como 172.17.0.1
en el docker0
predeterminado red de puentes Puede verificar su propia IP ejecutando este comando en su host:
ip addr show docker0
La IP de Docker de su host se mostrará en inet
línea. Conéctese a esta dirección IP desde sus contenedores para acceder con éxito a los servicios que se ejecutan en su host.
Una trampa de este enfoque es que es posible que no pueda conectarse a servicios que se vinculan directamente a localhost
. Deberá asegurarse de que sus servicios estén escuchando conexiones en su IP de puente Docker, así como localhost
y 127.0.0.1
. De lo contrario, verá connection refused
o errores similares dentro de su contenedor.
Resumen
Tiene varias opciones cuando necesita llegar fuera de un contenedor Docker al localhost
de su máquina . Si está en Windows o Mac, es mejor usar el host.docker.internal
integrado. alias. Los usuarios de Linux pueden configurar algo similar con --add-host
bandera al iniciar un contenedor.
El modo de red de host es una alternativa universal que permite que los contenedores compartan la pila de redes de su host. Puede hacer referencia a localhost
directamente, pero deben ser conscientes de los riesgos y las limitaciones. No es una opción adecuada cuando se requiere un fuerte aislamiento de red.
Seguir con el modo puente puede ser la mejor opción para las cargas de trabajo que lo admiten. Vincule los servicios de su host a su Docker IP, luego use esa dirección para conectarse desde dentro de su contenedor. Esto le permite usar la red virtualizada por contenedor de Docker mientras proporciona una ruta a su host cuando es necesario.