network_mode: service:vpn e o nome de host db ausente
Compartilhar o espaço de nomes da VPN é uma escolha de topologia. Ou o db mantém o próprio endereço e a vpn entra nessa rede, ou tudo responde em loopback.
Você adiciona network_mode: service:vpn ao aplicativo, reinicia a pilha, e o aplicativo morre porque db não é mais resolvido. Nada foi renomeado no arquivo compose, então os suspeitos óbvios são o DNS e o banco de dados. A mudança real é menor e mais estranha: o aplicativo deixou de ser membro da rede Compose onde esse nome existe. Até você decidir de qual espaço de nomes o banco de dados deve responder, toda correção do nome de host é um palpite.
Por que o nome de host db deixou de ser resolvido
Um serviço que usa network_mode não tem endereço próprio numa rede Compose; ele toma emprestado o espaço de nomes do serviço nomeado. Esse espaço de nomes traz suas próprias interfaces, rotas, espaço de portas e resolvedor, e substitui a ligação do aplicativo à rede backend. O nome db nunca foi abstrato: ele vivia nessa rede e era resolvido pelo DNS embutido dela. Remova a ligação e o nome não tem onde ser resolvido.
Confirme isso de dentro dos contêineres e não do host. Uma consulta que falha no aplicativo mas funciona no contêiner do banco de dados significa que o nome está certo e o vínculo não. Esse resultado também coloca a correção na topologia compose em vez das configurações do resolvedor do aplicativo.
Três perguntas antes de editar o arquivo
Responda na ordem, porque cada uma estreita a topologia. A que o banco de dados deve responder: a um nome de host que outros contêineres usam, ou apenas ao aplicativo em loopback? O aplicativo deve publicar uma porta para o host, e qual serviço a possuiria? O banco de dados deve ser alcançável a partir do host ou de outra máquina, ou apenas de dentro do túnel?
Se o banco de dados precisa do próprio nome e o aplicativo não publica nada, mantenha-os em ligações separadas. Se o aplicativo precisa publicar uma porta e tudo passa pelo túnel, coloque o banco de dados no espaço de nomes da VPN e use loopback. Misturar as duas coisas produz uma pilha que inicia limpa e falha na conexão.
Deixe o banco de dados onde está
A mudança menor liga o proprietário do espaço de nomes à rede que já contém o banco de dados. O aplicativo herda essa ligação porque compartilha a pilha vpn, e db é resolvido exatamente como antes.
services:
vpn:
networks:
- backend
app:
network_mode: service:vpn
db:
networks:
- backend
networks:
backend:Não adicione networks também ao aplicativo. O Compose rejeita essa propriedade junto com network_mode no mesmo serviço, e o erro aponta para o arquivo em vez do par. Se o cliente VPN filtra o destino backend dentro do seu espaço de nomes, ajuste também sua política de rede local suportada; uma ligação compartilhada oferece um caminho mas não anula esse filtro.
Mova o banco de dados para o espaço de nomes
A mudança maior coloca o banco de dados no mesmo espaço de nomes e aponta o aplicativo para 127.0.0.1 com a porta real. Dois processos não podem ambos vincular o mesmo endereço e a mesma porta só porque iniciaram em contêineres diferentes, então um banco de dados que também escuta no endereço wildcard colidirá com qualquer outra coisa que o faça. Verifique o ouvinte antes de movê-lo.
As portas publicadas pertencem ao serviço proprietário do espaço de nomes. Adicionar ports ao aplicativo é rejeitado junto com network_mode, e inventar um endereço separado para o aplicativo descreve uma interface que não existe.
Disponibilidade, bloqueio e o resolvedor
depends_on ordena a inicialização dos contêineres; não é prova de que o túnel esteja ativo e não para o tráfego quando o túnel cai. Trate a alcançabilidade, a disponibilidade do túnel e o bloqueio de falhas como três requisitos separados. Uma pilha que satisfaz apenas o primeiro passa num teste manual num dia bom e vaza num dia mau. Escreva as três respostas ao lado do arquivo compose, onde a próxima pessoa vai olhar.
Compartilhar o espaço de nomes também significa que o aplicativo herda o resolvedor do contêiner VPN, o que ajuda quando o túnel impõe servidores DNS e confunde quando não o faz. Verifique o que o espaço de nomes contém de fato em vez de presumir que o resolvedor do host se aplica. A referência de serviços do Compose documenta network_mode, ports e o comportamento das dependências num só lugar, incluindo por que um serviço network_mode não tem endereço próprio.