A gestão de portas no Docker e no Docker Compose é o segredo pouco revelado para garantir que os serviços containerizados estejam visíveis ao mundo exterior — quer esteja a desenvolver localmente ou em produção. Uma má configuração pode arruinar a segurança, causar conflitos imprevisíveis ou mesmo tornar serviços inacessíveis. Descubra agora como dominar a arte de mapear portas como um verdadeiro especialista DevOps.
Port Mapping: A Arma Secreta para Expor Serviços no Docker
O mapeamento de portas permite que aplicações em containers comuniquem com o exterior. Essencialmente, redireciona uma porta do sistema anfitrião para uma porta do container, tornando o serviço visível fora do ecossistema Docker.
Imagine dois containers a correr serviços distintos, ambos a usar a porta 80. Com o mapeamento adequado — digamos 8080 e 8090 no host — ambos tornam-se acessíveis de forma independente. Uma jogada genial para quem lida com múltiplos serviços.
Como Mapear Portas em Docker: O Comando Que Muda Tudo
Por defeito, um container possui um namespace de rede isolado. Para aceder a serviços externos, é necessário estabelecer uma ponte com o host. Eis o comando fundamental:
docker run -d -p 8080:80 nginx
Este comando mapeia a porta 8080 do host para a porta 80 do container. Simples e letal. Para aceder, basta abrir http://localhost:8080.
Se a imagem usar bem o comando EXPOSE, pode usar:
docker run -d --publish-all hello-world
O Docker irá seleccionar automaticamente uma porta aleatória no host para mapear com as portas expostas no Dockerfile.
Mapeamento com Docker Compose: Configuração Profissional
Docker Compose permite definir tudo num único ficheiro docker-compose.yml
. O truque? A directiva ports
.
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "8080:80"
Porta 80 no container? Exposta no host pela 8080. Impecável.
Expose vs Ports: A Confusão Fatal
Cuidado! expose
NÃO é igual a ports
.
services:
app:
image: myapp
expose:
- "3000"
Neste cenário, a porta 3000 está acessível apenas a outros containers na mesma rede. Para o exterior? Nada feito. Só ports
faz o trabalho completo.
Mapear Várias Portas? Sim, É Possível!
Se o seu container gere múltiplos serviços, mapeie várias portas:
docker run -p 8080:80 -p 443:443 nginx
O Nginx agora responde a HTTP (8080 → 80) e HTTPS (443 → 443).
Especificar o IP do Host: Controle Total
Quer limitar o acesso a uma interface específica?
docker run -p 192.168.1.100:8080:80 nginx
Este comando restringe o acesso à IP 192.168.1.100. Ideal para ambientes com múltiplas interfaces.
Mapeamento de Faixas de Portas: A Solução para Clusters
Precisa de várias portas consecutivas? O Docker trata disso:
docker run -p 5000-5100:5000-5100 nginx
Perfeito para clusters ou aplicações multi-endpoint.
Portas Diferentes no Host e no Container: A Estratégia Anticonflitos
Evite conflitos ou exponha serviços com mais segurança:
docker run -p 8081:80 nginx
Aqui, o container usa a porta 80, mas expõe-na como 8081 no host. Estratégico e eficaz.
UDP no Docker: Para Quem Precisa de Latência Mínima
Docker também permite mapear portas UDP, essenciais para DNS ou jogos online:
docker run -p 53:53/udp ubuntu/bind9
Simples, direto e vital para serviços baseados em UDP.
Verificar o Mapeamento: Confirme Se Está Tudo OK
Use o comando:
docker ps
Veja as colunas de PORTS. Quer detalhes mais profundos?
docker inspect <container_id> | grep "Host"
Revela todas as ligações ativas entre o host e os containers. Transparência total.