Docker: Redes no Docker — Conceitos Básicos
Última atualização: 2026-08-26
Redes de contêineres são o aspecto mais confuso do Docker — até você entender que "cada contêiner tem seu próprio localhost."
1. O Que Você Vai Aprender
- Diferenças Entre os Quatro Modos de Rede
- Personalizar a rede bridge e o DNS
- Mecanismos para Comunicação Entre Contêineres
- Política de Isolamento de Rede
- Como Funciona o Encaminhamento de Portas
2. Uma História Real de uma Pessoa Desenvolvedora
(1) Problema: Não é possível conectar ao localhost entre contêineres
A aplicação web e o banco de dados de Alice estão em execução em dois contêineres separados, e o contêiner web, usando localhost:5432, não consegue se conectar ao banco de dados. Ela ficou confusa por duas horas: "O banco de dados está claramente escutando na porta 5432, então por que não consigo conectar?"
(2) Soluções para Isolamento de Rede de Contêineres
Bob disse: "Cada contêiner tem seu próprio localhost. O localhost do contêiner web é a própria aplicação web, não o banco de dados. Você precisa usar o nome do contêiner ou uma comunicação de rede personalizada."
# Criar uma rede personalizada para comunicação entre contêineres
docker network create app-net
# Iniciar contêineres na mesma rede
docker run -d --name db --network app-net -e POSTGRES_PASSWORD=secret postgres:15
docker run -d --name web --network app-net -p 8080:5000 myapp
# O web se conecta a db:5432 (não localhost:5432)
(3) Benefício: Problema de rede resolvido em 2 horas → 5 minutos
Depois que entendeu o modelo de rede de contêineres, Alice conseguiu resolver seu problema de rede em 5 minutos — contra 2 horas de solução de problemas.
3. Quatro Modos de Rede do Docker
(1) Visão Geral dos Padrões
graph TB
subgraph Bridge["Modo Bridge (padrão)"]
B1["Contêiner A<br/>172.17.0.2"] --- B2["Ponte docker0<br/>172.17.0.1"]
B2 --- B3["Contêiner B<br/>172.17.0.3"]
B2 --- B4["Host eth0<br/>via NAT"]
end
subgraph Host["Modo Host"]
H1["Contêiner"] --- H2["Pilha de Rede do Host<br/>Compartilha todas as portas"]
end
subgraph None["Modo None"]
N1["Contêiner<br/>Apenas loopback"]
end
subgraph Overlay["Modo Overlay"]
O1["Contêiner A<br/>Host 1"] -.- O2["Contêiner B<br/>Host 2"]
end
(2) Comparação dos Quatro Modos
| Dimensão | Bridge | Host | None | Overlay |
|---|---|---|---|---|
| Isolamento | Pilha de Rede Dedicada | Rede do Host Compartilhada | Totalmente Isolado | Rede Virtual Entre Hosts |
| Encaminhamento de Porta | Requer -p |
Não requerido | Não disponível | Roteamento integrado |
| Performance | Média (sobrecarga NAT) | Alta (acesso direto) | - | Média (encapsulamento VXLAN) |
| Resolução DNS | Apenas bridge personalizada | Nenhuma (hospedagem compartilhada) | Nenhuma | ✅ Integrado |
| Entre Hosts | ❌ | ❌ | ❌ | ✅ |
| Casos de Uso | Máquina única, múltiplos contêineres | Rede de alta performance | Isolamento de segurança/depuração | Clusters Docker Swarm |
4. Uma Explicação Detalhada da Rede Bridge
(1) Bridge padrão vs. bridge personalizada
| Dimensão | Bridge padrão | Bridge personalizada |
|---|---|---|
| Resolução DNS | ❌ Apenas endereços IP | ✅ Comunicação usando nomes de contêineres |
| Isolamento de Contêiner | Todos os contêineres na mesma rede | Isolado por grupo de rede |
| Nível de Recomendação | ⭐ (Compatível com versões antigas) | ⭐⭐⭐ (Recomendado) |
| Método de Criação | Criado automaticamente pelo Docker | docker network create |
▶ Exemplo: Criando uma Rede Bridge Personalizada (Dificuldade: ⭐)
# Criar uma rede bridge personalizada
docker network create --driver bridge app-net
# Verificar
docker network ls | grep app-net
docker network inspect app-net
▶ Exemplo: Resolução DNS Entre Contêineres (Dificuldade: ⭐⭐)
# Iniciar dois contêineres na mesma rede personalizada
docker run -d --name db --network app-net \
-e POSTGRES_PASSWORD=secret postgres:15-alpine
docker run -d --name api --network app-net \
nginx:alpine
# Resolução DNS: api pode alcançar db pelo nome
docker exec api ping -c 2 db
PING db (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.100 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.050 ms
db resolve para o endereço IP do contêiner do banco de dados. É por isso que fastcgi_pass lemp-php:9000 funciona no projeto LEMP da Fase 1.
▶ Exemplo: Verificação de Isolamento de Rede (Dificuldade: ⭐⭐)
# Criar duas redes separadas
docker network create frontend-net
docker network create backend-net
# Contêiner frontend
docker run -d --name web --network frontend-net nginx:alpine
# Contêiner backend
docker run -d --name api --network backend-net nginx:alpine
# web NÃO pode alcançar api (redes diferentes)
docker exec web ping -c 2 -W 2 api
# Saída: ping: bad address 'api'
# Conectar web ao backend-net (agora pode alcançar api)
docker network connect backend-net web
docker exec web ping -c 2 api
# Saída: PING api (172.19.0.2): 64 bytes
5. Modo de Rede Host
▶ Exemplo: Executando um Contêiner no Modo Host (Dificuldade: ⭐⭐)
# Executar com rede host (compartilha a pilha de rede do host)
docker run -d --name host-nginx --network host nginx:alpine
# Nenhum mapeamento de porta necessário — o nginx escuta diretamente na porta 80 do host
curl http://localhost:80
-p. No entanto, há um alto risco de conflitos de porta — se a porta 80 no host já estiver em uso, o contêiner falhará ao iniciar. Use com cautela em ambientes de produção.
6. Como Funciona o Encaminhamento de Portas
(1) Três Maneiras de Expor Portas
| Método | Sintaxe | Descrição |
|---|---|---|
-p host:contêiner |
-p 8080:80 |
Mapeamento especificado |
-P |
-P |
Mapeado aleatoriamente para portas declaradas em EXPOSE |
--network host |
--network host |
Nenhum mapeamento de porta necessário (rede do host compartilhada) |
▶ Exemplo: Use docker network inspect para visualizar detalhes da rede (Dificuldade: ⭐⭐)
# Inspecionar configuração de rede
docker network inspect app-net
[
{
"Name": "app-net",
"Driver": "bridge",
"IPAM": {
"Config": [{"Subnet": "172.18.0.0/16", "Gateway": "172.18.0.1"}]
},
"Containers": {
"a1b2c3d4...": {"Name": "db", "IPv4Address": "172.18.0.2"},
"e5f6a7b8...": {"Name": "api", "IPv4Address": "172.18.0.3"}
}
}
]
7. Exemplo Completo: Arquitetura de Rede de Três Camadas
# ============================================
# Passo a passo completo: Arquitetura de rede de três camadas
# Isolamento Frontend / Backend / Banco de Dados
# ============================================
# 1. Criar três redes
docker network create frontend-net
docker network create backend-net
docker network create db-net
# 2. Iniciar banco de dados (apenas na db-net)
docker run -d --name db \
--network db-net \
-e POSTGRES_PASSWORD=secret \
-e POSTGRES_DB=myapp \
postgres:15-alpine
# 3. Iniciar servidor API (backend-net + db-net)
docker run -d --name api \
--network backend-net \
-e DATABASE_URL="postgresql://postgres:secret@db:5432/myapp" \
myapp-api:1.0
# Conectar API ao db-net para que ela possa alcançar o banco de dados
docker network connect db-net api
# 4. Iniciar Nginx (frontend-net + backend-net)
docker run -d --name web \
--network frontend-net \
-p 8080:80 \
-v $(pwd)/nginx.conf:/etc/nginx/conf.d/default.conf \
nginx:1.25-alpine
# Conectar Nginx ao backend-net para que ele possa alcançar a API
docker network connect backend-net web
# 5. Verificar conectividade
docker exec web ping -c 1 api # web → api ✅
docker exec api ping -c 1 db # api → db ✅
docker exec web ping -c 1 -W 1 db # web → db ❌ (não está na db-net)
# 6. Limpar
docker stop web api db
docker rm web api db
docker network rm frontend-net backend-net db-net
❓ Perguntas Frequentes
P: Dois contêineres podem se comunicar se não estiverem na mesma rede? R: Por padrão, não. Cada rede é um domínio independente e isolado. Para permitir que o Contêiner A acesse o Contêiner C na Rede B, você precisa usar
docker network connectpara adicionar A à Rede B. Um contêiner pode pertencer a várias redes ao mesmo tempo.
P: Quais são os riscos de usar o modo de rede host? R: Existem dois riscos principais: ① Conflitos de porta — os contêineres escutam diretamente nas portas do host, então falharão ao iniciar se essas portas já estiverem em uso por outros serviços; ② Segurança — os contêineres podem acessar todas as interfaces de rede do host, incluindo serviços internos no localhost. Use o modo host apenas quando precisar de máxima performance de rede.
P: O endereço IP do contêiner muda? R: Sim. O endereço IP pode mudar após a reinicialização do contêiner (especialmente para sub-redes não definidas pelo usuário). É por isso que você deve se comunicar usando nomes de contêineres (via resolução DNS) em vez de endereços IP. Para redes bridge personalizadas, o DNS mantém automaticamente o mapeamento de nomes de contêineres para endereços IP.
P: Como posso restringir o acesso à rede para contêineres? R: Existem três maneiras: ① Use várias redes para isolamento (recomendado) — o banco de dados está apenas na
db-net, então o frontend não pode acessá-lo diretamente; ② Use regras iptables (avançado); ③--icc=falseDesabilita a comunicação entre contêineres na bridge padrão (não recomendado; usar uma rede personalizada é melhor).
P: Como os contêineres se comunicam entre hosts? R: O Docker em host único não pode se comunicar diretamente entre hosts. Soluções: ① Rede overlay (requer Docker Swarm ou configuração manual de etcd); ② Mapeamento de porta + IP do host; ③ Plugins de rede de terceiros (Weave/Calico). A rede Overlay do Docker Swarm é a solução mais simples para comunicação entre hosts (Fase 4, Aula 20).
📖 Resumo
- Quatro modos de rede: Bridge (padrão/recomendado para configurações personalizadas), Host (alta performance), None (isolado), Overlay (entre hosts)
- A bridge padrão não oferece suporte a DNS, enquanto a bridge personalizada oferece suporte à resolução DNS para nomes de contêineres — sempre use a bridge personalizada
- Cada contêiner tem seu próprio localhost; os contêineres se comunicam entre si usando nomes de contêineres em vez de localhost
- Isolamento de várias redes implementa uma arquitetura de três camadas: Frontend ↔ Backend ↔ Banco de Dados
docker network connectAdicionando um Contêiner a Várias Redes- Mapeamento de Porta
-p host:contêinerExpõe Serviços de Contêiner ao Mundo Externo
📝 Exercícios
- Exercício Básico (Dificuldade: ⭐): Crie uma rede bridge personalizada, inicie dois contêineres Nginx e verifique se os nomes dos contêineres são resolvidos via DNS (
docker exec A ping B). - Exercício Avançado (Dificuldade: ⭐⭐): Crie duas redes separadas, coloque um contêiner em cada uma e verifique se contêineres em redes diferentes não podem fazer ping um no outro. Em seguida, use
docker network connectpara conectá-los. - Desafio (Dificuldade: ⭐⭐⭐): Use
docker network inspectpara visualizar a configuração IPAM e a lista de contêineres de uma rede personalizada e entenda o mecanismo de roteamento de rede interno do Docker.