🐳 Cuando integrar redes Docker es engorroso y necesitas una comunicación 'rápida' a través del puerto del host

Normalmente, la forma estándar de comunicar contenedores es creando una red puente compartida y llamándolos por su nombre de servicio (ej: http://app-b:8080). Sin embargo, en la vida real, a veces surgen 'situaciones inevitables' que nos impiden seguir el protocolo.

Usa este método en estas 'situaciones complicadas'

  • Cuando necesitas comunicarte con servicios instalados directamente en el host: Por ejemplo, si tu base de datos o Redis están en el sistema operativo del host y no en un contenedor, imposibilitando la integración de redes.
  • Cuando te da miedo tocar la configuración de red de un contenedor ajeno: Si temes causar problemas al forzar tu contenedor en una configuración de red compleja que no administras.
  • Cuando solo quieres verificar una conexión 'temporalmente' durante el desarrollo local: Si necesitas comprobar rápidamente si las solicitudes llegan a un servicio expuesto en un puerto del host, sin preocuparte por el diseño de la red.

En estos casos, el truco útil es host.docker.internal.

Comunicación entre contenedores usando el host


La solución: host.docker.internal, la "ventana al mundo exterior del contenedor"

Desde dentro de un contenedor, llamar a 127.0.0.1 solo te mostrará a ti mismo (el contenedor). Sin embargo, al usar el dominio especial host.docker.internal, puedes atravesar la barrera del contenedor y encontrar la IP de la máquina anfitriona.

Ejemplo de código Python (DRF):

# Usa 'host.docker.internal' en lugar de 'localhost' para salir al puerto del host.
# Si App-B está vinculado al puerto 8080 del host, se llama de la siguiente manera.
NEXTCLOUD_URL = "http://host.docker.internal:8080"

response = requests.get(NEXTCLOUD_URL)


⚠️ Para usuarios de Linux, la 'configuración manual' es esencial

Mientras que Docker Desktop (Mac/Windows) lo incluye por defecto, en un servidor Linux puro, Docker no configura este dominio automáticamente. Es necesario especificar durante la construcción o ejecución que "este dominio se refiere a la IP del host".

Ejemplo de configuración de Docker Compose:

services:
  drf-app:
    image: my-drf-app-image
    extra_hosts:
      # Declaración para acceder al gateway del host con el nombre host.docker.internal
      - "host.docker.internal:host-gateway"


No siempre es la solución ideal

Reitero, este método es más bien un último recurso.

  1. La mejor opción: Crear una red puente compartida y comunicar los contenedores por su nombre (lo más seguro).
  2. Razones para usarlo: Cuando necesitas acceder a procesos que se ejecutan directamente en el host o en entornos 'aislados' donde la estructura de red es imposible de integrar.

Considera este 'salvavidas' que anoté el año pasado como una carta oculta, solo para cuando los métodos estándar no sean posibles.