HOWTO · Docker

Agregar un modo de red en Docker Compose

Este artículo discutirá cómo podemos definir y configurar nuestra red usando el modo de red en Docker Compose.

En esta página

Define network_mode dentro del servicio correspondiente en el archivo de Compose. Elige esta opción cuando el servicio deba usar un espacio de nombres de red específico. Si omites network_mode y no personalizas networks, Docker Compose conecta el servicio a la red predeterminada del proyecto, donde los servicios pueden comunicarse entre sí por el nombre del servicio. No necesitas un modo de red personalizado solo para permitir la comunicación entre servicios. Consulta la guía de redes de Compose de Docker para conocer el comportamiento predeterminado de la red del proyecto.

Elegir un modo de red de Docker para un servicio de Compose

Elige el modo según el espacio de nombres de red que deba usar el servicio:

  • bridge usa la red bridge predeterminada integrada de Docker. No selecciona una red con nombre ni la red predeterminada del proyecto de Compose. Si el servicio necesita una red de Compose con nombre, configúrala mediante networks.
  • host comparte el espacio de nombres de red del host cuando es compatible, lo que modifica el aislamiento de red del servicio.
  • none deshabilita la conexión de red del servicio.
  • service:<service-name> comparte el espacio de nombres de red de otro servicio de Compose.
  • container:<container-name-or-id> hace referencia a un contenedor de Docker.

Estos modos tienen distintos comportamientos de conectividad y aislamiento. En particular, no configures network_mode y networks en el mismo servicio: Compose los trata como opciones mutuamente excluyentes. La referencia de servicios de Compose documenta network_mode, mientras que la referencia de networks para servicios describe la opción independiente para conectar un servicio a una red. Los ejemplos siguientes muestran sintaxis de configuración; no se han ejecutado contra un motor de Docker.

Configurar network_mode en Docker Compose

Incluye network_mode dentro de la entrada del servicio y usa un modo literal o una de las formas de referencia. Por ejemplo, para representar un servicio llamado app que usa el modo host, las líneas con sangría serían services:, app: y network_mode: host. En un archivo de Compose real, conserva la sangría y añade los demás ajustes necesarios del servicio, como su imagen.

Ejecuta este ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

service = "app"
mode = "host"
print(f"services:\n  {service}:\n    network_mode: {mode}")
services:
  app:
    network_mode: host

Sustituye host por bridge, none, service:<service-name> o container:<container-name-or-id>, según corresponda. Las expresiones entre corchetes angulares son marcadores de posición: después de service:, usa el nombre real del servicio de Compose; después de container:, usa el nombre o el ID de un contenedor. Por ejemplo, service:api hace referencia a un servicio llamado api; el nombre o el ID de una red de Docker no sustituye ninguna de esas referencias.

docker network ls muestra las redes de Docker y sus nombres e ID. No muestra contenedores ni servicios de Compose, así que su salida no permite obtener un valor para service: o container:. Úsalo para inspeccionar las redes disponibles, no para buscar identificadores de servicios o contenedores. Por sí solos, el nombre o el ID de una red no constituyen una referencia network_mode de las formas anteriores.

No añadas un campo version de nivel superior en Compose solo para habilitar network_mode. La referencia actual sobre la versión y el nombre de Compose indica que el campo version de nivel superior está obsoleto; Compose valida el archivo según el formato de Compose que admite.

Tener en cuenta las redes de Docker Swarm

La opción del servicio de Compose anterior y las redes de servicios de Swarm son rutas de configuración distintas. El patrón de Swarm proporcionado conecta un servicio mediante la clave networks y declara como externa una red ya existente. En la sintaxis de Compose, ese patrón incluye una entrada de servicio como app: networks: [host] y una entrada networks de nivel superior que asigna el nombre host y establece external: true. Sustituye host por el nombre real de la red externa. Esto conecta el servicio a una red; no hace que networks sea intercambiable con network_mode ni demuestra que una red sea compatible con todos los modos. La guía de redes de Compose explica cómo conectar servicios a redes de Compose; crea o identifica una red externa mediante la configuración de Swarm de tu despliegue antes de hacer referencia a ella.

Verificar el modo de red seleccionado

Revisa el archivo de Compose y confirma que network_mode esté dentro del servicio previsto, que su valor use la forma de modo correcta y que cualquier servicio o contenedor referenciado exista en el entorno donde se ejecutará el servicio. En Swarm, confirma que la red externa exista y que el servicio indique su nombre exacto bajo networks. docker network ls puede mostrar los nombres e ID de las redes en el host de Docker donde se ejecuta, pero no verifica si un archivo de Compose es válido ni si los servicios pueden comunicarse. Este artículo no afirma que estas configuraciones se hayan probado en una instalación de Docker activa.