GNU/Linux >> Tutoriales Linux >  >> Panels >> Docker

Cómo conectarse a Localhost dentro de un contenedor Docker

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 y 127.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.


Docker
  1. Cómo usar SSH en un contenedor Docker

  2. Cómo montar un directorio de host en un contenedor Docker

  3. Cómo asignar una IP estática a un contenedor Docker

  4. Cómo listar contenedores Docker

  5. Cómo salir de un contenedor Docker

Cómo usar Docker Cp para copiar archivos entre el host y los contenedores

Cómo ejecutar PHPMyAdmin en un contenedor Docker

Cómo ejecutar Grafana en un contenedor Docker

Cómo configurar un contenedor Apache Docker

Cómo copiar archivos entre el host y el contenedor Docker

Cómo ejecutar contenedores Docker