Engades network_mode: service:vpn á aplicación, reinicias a pila e a aplicación morre porque db xa non se resolve. Non se renomeou nada no ficheiro compose, así que os sospeitosos obvios son o DNS e a base de datos. O cambio real é máis pequeno e máis estraño: a aplicación deixou de ser membro da rede de Compose onde existe ese nome. Ata que decidas de que espazo de nomes debe responder a base de datos, cada corrección do nome de host é unha conxectura.

Por que o nome de host db deixou de resolverse

Un servizo que usa network_mode non ten enderezo propio nunha rede de Compose; toma prestado o espazo de nomes do servizo nomeado. Ese espazo de nomes trae as súas propias interfaces, rutas, espazo de portos e resolvedor, e substitúe a conexión da aplicación á rede backend. O nome db nunca foi abstracto: vivía nesa rede e resolvíase mediante o seu DNS integrado. Quita a conexión e o nome non ten onde resolverse.

Confírmao desde dentro dos contedores e non desde o host. Unha consulta que falla na aplicación pero acerta no contedor da base de datos significa que o nome está ben e a pertenza non. Ese resultado tamén sitúa a corrección na topoloxía de compose en lugar de nos axustes do resolvedor da aplicación.

Tres preguntas antes de editar o ficheiro

Respóndeas por orde, porque cada unha estreita a topoloxía. A que debe responder a base de datos: a un nome de host que usan outros contedores, ou só á aplicación en loopback? Debe a aplicación publicar un porto ao host, e que servizo o posuiría? Debe a base de datos ser accesible desde o host ou desde outra máquina, ou só desde dentro do túnel?

Se a base de datos precisa o seu propio nome e a aplicación non publica nada, manténas en conexións separadas. Se a aplicación debe publicar un porto e todo pasa polo túnel, pon a base de datos no espazo de nomes da VPN e usa loopback. Mesturar as dúas cousas produce unha pila que arrinca limpa e falla ao conectar.

Deixa a base de datos onde está

O cambio máis pequeno conecta o propietario do espazo de nomes coa rede que xa contén a base de datos. A aplicación herda esa conexión porque comparte a pila vpn, e db resólvese exactamente como antes.

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

Non engadas networks tamén á aplicación. Compose rexeita esa propiedade xunto con network_mode no mesmo servizo, e o erro apunta ao ficheiro en lugar de á parella. Se o cliente VPN filtra o destino backend dentro do seu espazo de nomes, axusta tamén a súa política de rede local admitida; unha conexión compartida ofrece un camiño pero non anula ese filtro.

Move a base de datos ao espazo de nomes

O cambio maior pon a base de datos no mesmo espazo de nomes e apunta a aplicación a 127.0.0.1 co porto real. Dous procesos non poden ambos enlazar o mesmo enderezo e o mesmo porto só porque se iniciaron en contedores distintos, así que unha base de datos que tamén escoita no enderezo wildcard chocará con calquera outra cousa que o faga. Comproba o oínte antes de movelo.

Os portos publicados pertencen ao servizo propietario do espazo de nomes. Engadir ports á aplicación rexéitase xunto con network_mode, e inventar un enderezo separado para a aplicación describe unha interface que non existe.

Dispoñibilidade, bloqueo e o resolvedor

depends_on ordena o arranque dos contedores; non é proba de que o túnel estea activo e non detén o tráfico cando o túnel cae. Trata a accesibilidade, a dispoñibilidade do túnel e o bloqueo de fallos como tres requisitos separados. Unha pila que só cumpre o primeiro pasa unha proba manual nun bo día e filtra nun día malo. Escribe as tres respostas xunto ao ficheiro compose, onde mirará a seguinte persoa.

Compartir o espazo de nomes tamén significa que a aplicación herda o resolvedor do contedor VPN, o que axuda cando o túnel impón servidores DNS e confunde cando non o fai. Comproba que contén realmente o espazo de nomes en lugar de supor que se aplica o resolvedor do host. A referencia de servizos de Compose documenta network_mode, ports e o comportamento das dependencias nun só lugar, incluído por que un servizo con network_mode non ten enderezo propio.

Artigos relacionados