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.

Artigos relacionados