Añades network_mode: service:vpn a la aplicación, reinicias la pila y la aplicación muere porque db ya no se resuelve. No se ha renombrado nada en el archivo compose, así que los sospechosos obvios son el DNS y la base de datos. El cambio real es más pequeño y más extraño: la aplicación ha dejado de ser miembro de la red de Compose donde existe ese nombre. Hasta que decidas de qué espacio de nombres debe responder la base de datos, cada corrección del nombre de host es una conjetura.

Por qué el nombre de host db dejó de resolverse

Un servicio que usa network_mode no tiene dirección propia en una red de Compose; toma prestado el espacio de nombres del servicio nombrado. Ese espacio de nombres trae sus propias interfaces, rutas, espacio de puertos y resolutor, y sustituye la conexión de la aplicación a la red backend. El nombre db nunca fue abstracto: vivía en esa red y se resolvía mediante su DNS integrado. Quita la conexión y el nombre no tiene dónde resolverse.

Confírmalo desde dentro de los contenedores y no desde el host. Una consulta que falla en la aplicación pero acierta en el contenedor de la base de datos significa que el nombre está bien y la pertenencia no. Ese resultado también sitúa la corrección en la topología de compose en lugar de en los ajustes del resolutor de la aplicación.

Tres preguntas antes de editar el archivo

Respóndelas en orden, porque cada una estrecha la topología. ¿A qué debe responder la base de datos: a un nombre de host que usan otros contenedores, o solo a la aplicación en loopback? ¿Debe la aplicación publicar un puerto al host, y qué servicio lo poseería? ¿Debe la base de datos ser accesible desde el host o desde otra máquina, o solo desde dentro del túnel?

Si la base de datos necesita su propio nombre y la aplicación no publica nada, mantenlas en conexiones separadas. Si la aplicación debe publicar un puerto y todo pasa por el túnel, pon la base de datos en el espacio de nombres de la VPN y usa loopback. Mezclar las dos cosas produce una pila que arranca limpia y falla al conectar.

Deja la base de datos donde está

El cambio más pequeño conecta al propietario del espacio de nombres con la red que ya contiene la base de datos. La aplicación hereda esa conexión porque comparte la pila vpn, y db se resuelve exactamente como antes.

services:
  vpn:
    networks:
      - backend
  app:
    network_mode: service:vpn
  db:
    networks:
      - backend
networks:
  backend:

No añadas networks también a la aplicación. Compose rechaza esa propiedad junto con network_mode en el mismo servicio, y el error apunta al archivo en lugar de al par. Si el cliente VPN filtra el destino backend dentro de su espacio de nombres, ajusta también su política de red local admitida; una conexión compartida ofrece un camino pero no anula ese filtro.

Mueve la base de datos al espacio de nombres

El cambio mayor pone la base de datos en el mismo espacio de nombres y apunta la aplicación a 127.0.0.1 con el puerto real. Dos procesos no pueden ambos enlazar la misma dirección y el mismo puerto solo porque se iniciaron en contenedores distintos, así que una base de datos que también escucha en la dirección wildcard chocará con cualquier otra cosa que lo haga. Comprueba el oyente antes de moverlo.

Los puertos publicados pertenecen al servicio propietario del espacio de nombres. Añadir ports a la aplicación se rechaza junto con network_mode, e inventar una dirección separada para la aplicación describe una interfaz que no existe.

Disponibilidad, bloqueo y el resolutor

depends_on ordena el arranque de los contenedores; no es prueba de que el túnel esté activo y no detiene el tráfico cuando el túnel cae. Trata la accesibilidad, la disponibilidad del túnel y el bloqueo de fallos como tres requisitos separados. Una pila que solo cumple el primero pasa una prueba manual un buen día y filtra uno malo. Escribe las tres respuestas junto al archivo compose, donde mirará la siguiente persona.

Compartir el espacio de nombres también significa que la aplicación hereda el resolutor del contenedor VPN, lo que ayuda cuando el túnel impone servidores DNS y confunde cuando no lo hace. Comprueba qué contiene realmente el espacio de nombres en lugar de suponer que se aplica el resolutor del host. La referencia de servicios de Compose documenta network_mode, ports y el comportamiento de las dependencias en un solo lugar, incluido por qué un servicio con network_mode no tiene dirección propia.

Artículos relacionados