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



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

BASH
# 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

100%
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: ⭐)

BASH
# 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: ⭐⭐)

BASH
# 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
💻 Saída:

TEXT 📖 Somente leitura
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
📌 Ponto-chave: A rede bridge personalizada registra automaticamente registros DNS para cada contêiner. O nome do contêiner serve como hostname — 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: ⭐⭐)

BASH
# 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: ⭐⭐)

BASH
# 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
⚠️ Nota: No modo Host, os contêineres usam as portas do host diretamente e não exigem mapeamento -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: ⭐⭐)

BASH
# Inspecionar configuração de rede
docker network inspect app-net
💻 Saída (trecho):

TEXT 📖 Somente leitura
[
  {
    "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

BASH
# ============================================
# 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 connect para 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=false Desabilita 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


📝 Exercícios

  1. 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).
  2. 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 connect para conectá-los.
  3. Desafio (Dificuldade: ⭐⭐⭐): Use docker network inspect para 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.
Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%