network_mode: service:vpn e o nome de host db desaparecido
Compartir o espazo de nomes da VPN é unha decisión de topoloxía. Ou a db conserva o seu propio enderezo e a vpn únese a esa rede, ou todo responde en loopback.
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.