Contentores Docker que não se alcançam entre si nem ao servidor: as redes explicadas

Uma aplicação em Docker «não vê» a base de dados, ou dois projectos não conseguem falar um com o outro, ou um contentor não chega a um serviço que corre no próprio servidor. A resposta curta: cada contentor é um «computador» à parte, com a sua rede. Nele, localhost é o próprio contentor, não o servidor nem o vizinho. Para falar com outro contentor usa-se o nome do serviço, numa rede que ambos partilham.

Os três casos, e a ligação certa

Quer ligar… Use este endereço Condição
Dois serviços do mesmo Compose O nome do serviço (db, redis…) e a porta interna. Nada a fazer: o Compose cria uma rede por projecto e põe os serviços nela.
Contentores de projectos Compose diferentes O nome do serviço, na rede partilhada. Uma rede externa a que os dois se juntam (ver abaixo).
Um contentor ao serviço que corre no servidor host.docker.internal Em Linux, acrescente-o ao serviço (ver abaixo) e faça o serviço do servidor ouvir num endereço que o contentor alcance.

Dois projectos numa só rede, passo a passo

1 Crie uma rede que não pertença a nenhum projecto: docker network create partilhada
2 Nos dois ficheiros compose.yaml, ligue o serviço à rede, declarada como externa:services:
  app:
    image: minha-app
    networks:
      - partilhada

networks:
  partilhada:
    external: true
3 Suba os dois projectos e, de um deles, chame o outro pelo nome do serviço. Para confirmar: docker network inspect partilhada lista os contentores ligados.

Chegar a um serviço do próprio servidor

Para um contentor falar com, por exemplo, uma base de dados instalada no servidor, em Linux acrescente ao serviço no Compose:extra_hosts:
  - "host.docker.internal:host-gateway"
e use host.docker.internal como endereço. O serviço do servidor tem de ouvir num endereço que o contentor alcance, e não só em 127.0.0.1, que o contentor nunca vê. Ao fazê-lo, não abra o serviço ao mundo: limite-o pela firewall. Veja portas e firewall num VPS.

O nome do serviço só funciona em redes criadas por si ou pelo Compose. Dois contentores lançados com docker run na rede predefinida não se resolvem pelo nome. Ponha-os numa rede própria (docker network create, --network) ou use o Compose. Quando a ligação à base de dados falha, o primeiro suspeito é o localhost na configuração: uma aplicação com a sua base de dados.
Para diagnosticar, entre no contentor e peça a resolução do nome: docker exec -it app getent hosts db. Se devolve um endereço, a rede está certa e o erro é a porta ou as credenciais. Se não devolve nada, os dois não partilham uma rede: entrar num contentor.

Precisa de um servidor para os seus contentores? Veja os VPS.

Ver os servidores VPS

VEJA TAMBÉM

Docker Compose: uma aplicação com a sua base de dados

Portas e firewall num VPS: porque a aplicação não é alcançável

Nginx como proxy inverso à frente de um contentor

PRODUTO RECOMENDADO

Alojamento de sites com cPanel

Domínio e SSL incluídos, cópias diárias e o painel que já conhece. desde $6.60/mês (plano de 3 anos, com cupão)

Ver planos
  • 0 Utilizadores acharam útil
Esta resposta foi útil?