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.
|
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 |