Modos de rede do Docker: desempenho e quando usar bridge, host, none e container

Aquela linha verde, “Container started”, aparece no terminal. O serviço claramente subiu, mas o curl continua dando timeout. Você já conferiu docker logs três vezes e não há erro, o mapeamento de portas -p 8080:80 está configurado, a rota está certa e o firewall está desativado. Então onde está o problema?
Mais tarde, descobri que havia escolhido o modo de rede errado. Eu achava que bastava executar docker run -p, sem saber que o Docker oferece quatro modos de rede: bridge, host, none e container.
Se você também já viu um “contêiner em execução que simplesmente não responde”, ou entende apenas parte da configuração de rede do Docker, este artigo explica, sem rodeios, as diferenças, os princípios e os casos de uso desses quatro modos. Nada de mergulhar na teoria complexa de namespaces de rede do Linux: vamos falar apenas do que você realmente precisa saber na prática.
Primeiro, entenda a “base” da rede do Docker: a ponte docker0
O que é docker0? O “gateway do condomínio” dos contêineres
Depois que o Docker é instalado, uma interface de rede virtual chamada docker0 aparece automaticamente no sistema. Pense nela como o gateway de um condomínio: todos os contêineres, ou moradores, precisam passar por ela para acessar a rede externa.
Abra o terminal e teste este comando:
ip addr show docker0
Você verá uma saída parecida com esta:
docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
Viu o 172.17.0.1? Esse é o endereço IP da docker0. O Docker atribui a cada novo contêiner um IP da faixa 172.17.0.0/16, como 172.17.0.2 ou 172.17.0.3.
Agora veja a lista de redes do Docker:
docker network ls
NETWORK ID NAME DRIVER SCOPE
7f8a2b3c9d4e bridge bridge local
Essa rede bridge padrão usa a ponte docker0 por baixo dos panos.
veth pair: o “interfone” que conecta o contêiner
A docker0, sozinha, não basta. O contêiner fica em seu próprio “ambiente isolado” — tecnicamente, um namespace de rede. Como ele se comunica com a docker0?
A resposta é o veth pair. Ele funciona como um par de interfones: uma ponta fica dentro do contêiner e se chama eth0; a outra fica no host e se chama vethXXX, como veth9a7b4c. As duas pontas se comunicam diretamente.
Inicie um contêiner para testar:
docker run -d --name test-nginx nginx
Veja as interfaces de rede no host:
ip addr | grep veth
Você verá um novo dispositivo cujo nome começa com veth. Agora entre no contêiner e verifique:
docker exec test-nginx ip addr
Dentro do contêiner há uma interface eth0 com o IP 172.17.0.2. Essa eth0 e a vethXXX do host formam um par. O pacote sai pela eth0, chega imediatamente à vethXXX, passa pela docker0 e então sai pela interface de rede do host, como eth0 ou ens33, para acessar a internet.
O caminho completo é este:
Dentro do contêiner (172.17.0.2)
↓ eth0
↓ (veth pair)
↓ vethXXX
↓
Ponte docker0 (172.17.0.1)
↓ Encaminhamento NAT
↓
Interface de rede do host (por exemplo, 192.168.1.100)
↓
Internet
Parece um pouco indireto, mas funciona muito rápido. Ao executar ping para o IP do contêiner, a latência normalmente fica em alguns décimos de milissegundo.
Para ser sincero, também fiquei confuso na primeira vez que vi o conceito de veth pair. Depois percebi que é apenas um cabo de rede virtual: uma ponta ligada ao contêiner e outra à docker0. Só isso.
Modo bridge: a “opção padrão” do Docker
Por que bridge é o padrão?
Se você não especificar um modo de rede, o Docker usará bridge automaticamente. O motivo é simples: ele oferece um bom equilíbrio entre isolamento e facilidade de uso.
No modo bridge, cada contêiner tem um IP independente, o que evita conflitos de porta. Ao mesmo tempo, o parâmetro -p permite expor facilmente um serviço no host. Para a maioria dos cenários, isso já é suficiente.
Por exemplo, inicie dois contêineres Nginx:
docker run -d -p 8080:80 --name web1 nginx
docker run -d -p 8081:80 --name web2 nginx
Os dois escutam a porta 80, mas não entram em conflito porque cada um está em seu próprio namespace de rede. No host, você os acessa pelas portas 8080 e 8081; nos bastidores, o Docker faz o encaminhamento de portas por NAT.
Use docker inspect web1 para ver a configuração de rede:
"Networks": {
"bridge": {
"IPAddress": "172.17.0.2",
"Gateway": "172.17.0.1"
}
}
O contêiner recebeu o IP privado 172.17.0.2, e seu gateway é o endereço 172.17.0.1 da docker0.
Bridge padrão vs. bridge personalizada: uma diferença essencial
Há uma armadilha aqui. Na rede bridge padrão, ou seja, na docker0, os contêineres só conseguem se comunicar por IP; a resolução pelo nome do contêiner não é oferecida.
Teste o seguinte:
docker run -d --name db mysql
docker run -it --name app alpine ping db
O ping não funcionará. É preciso informar o IP diretamente, como em ping 172.17.0.2.
Agora crie uma rede bridge personalizada:
docker network create mynet
docker run -d --name db --network mynet mysql
docker run -it --name app --network mynet alpine ping db
Desta vez funciona. Redes bridge personalizadas incluem resolução DNS, então o nome do contêiner pode ser usado diretamente como nome de domínio.
Esse é também o motivo para recomendar uma rede personalizada, em vez da docker0 padrão, em produção: a descoberta de serviços fica muito mais simples e você não precisa fixar endereços IP no código ou na configuração.
O que existe por trás do parâmetro -p: encaminhamento NAT
Quando você usa -p 8080:80, o Docker adiciona uma regra NAT ao iptables do host:
iptables -t nat -L -n | grep 8080
Você verá algo parecido com isto:
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:172.17.0.2:80
Isso significa que todo o tráfego enviado à porta 8080 do host é encaminhado para 172.17.0.2:80 no contêiner.
É por isso que http://IP-do-host:8080 abre o serviço do contêiner: o Docker faz a conversão de endereços para você.
Quando usar o modo bridge
Em resumo, bridge é indicado para estes cenários:
- Arquitetura de microsserviços: vários contêineres colaboram, precisam de isolamento e também devem se comunicar; use uma rede bridge personalizada
- Ambiente de desenvolvimento: você precisa subir serviços rapidamente para testar, e o bridge padrão resolve
- Aplicações web que exigem mapeamento de portas: por exemplo, um blog ou uma API
Em termos de desempenho, bridge acrescenta algum custo de NAT e veth pair. Mas, sinceramente, essa perda é desprezível para a maioria das aplicações. Poucos projetos encontram um gargalo real nesse ponto, então não vale a pena se preocupar com isso logo de início.
Modo host: a escolha para quem prioriza desempenho
O que é o modo host? Rede sem isolamento
O modo host é direto: o contêiner deixa de ter uma rede independente e passa a usar a pilha de rede do host.
Adicione --net=host ao iniciar o contêiner:
docker run -d --net=host --name web nginx
Nesse caso, o contêiner não tem um IP independente nem uma interface eth0 própria; ele compartilha diretamente as interfaces de rede do host. A configuração exibida por ip addr dentro do contêiner é igual à do host.
Mais importante: não é necessário usar -p para mapear portas. Se o serviço do contêiner escuta a porta 80, basta acessar IP-do-host:80 externamente.
De onde vem a vantagem de desempenho?
O modo host ignora a ponte docker0 e o veth pair, além de dispensar o encaminhamento NAT. Os pacotes entram e saem diretamente pela interface de rede do host, como se o processo estivesse sendo executado no próprio host.
Alguns testes mostram que, em cenários de alta concorrência, host pode ser de 5% a 10% mais rápido do que bridge. Pode parecer pouco, mas essa diferença importa em aplicações extremamente sensíveis à latência, como negociações de alta frequência e servidores de jogos em tempo real.
Já encontrei um caso em que o Nginx, usado como proxy reverso, processava dezenas de milhares de requisições por segundo. Depois da mudança para host, a latência P99 caiu de 12 ms para 9 ms. Foram apenas 3 milissegundos, mas, naquele projeto, essa redução valia dezenas de milhares de yuans.
Armadilhas e custos do modo host
O desempenho melhora, mas há várias desvantagens.
Armadilha 1: conflito de portas
Como o contêiner usa diretamente as portas do host, iniciar vários contêineres na mesma porta gera erro:
docker run -d --net=host nginx # Escuta a porta 80
docker run -d --net=host nginx # Tenta escutar a porta 80 novamente: Address already in use
Não há diferença em relação a iniciar dois processos Nginx diretamente no host. Quer executar várias instâncias? Você precisará alterar a porta de escuta dentro do contêiner ou deixar de usar o modo host.
Armadilha 2: o serviço no contêiner precisa escutar em 0.0.0.0
Se o serviço dentro do contêiner escutar apenas em 127.0.0.1, ele não poderá ser acessado externamente. Para receber conexões da rede externa, precisa escutar em 0.0.0.0.
Uma vez executei um serviço Node.js em modo host, mas o código usava app.listen(3000, 'localhost'). Não havia jeito de conectar de fora. O problema só foi resolvido depois que mudei para app.listen(3000, '0.0.0.0').
Armadilha 3: perda do isolamento de rede
O contêiner consegue acessar diretamente todos os recursos de rede do host, o que aumenta o risco de segurança. Se ele executa código de terceiros não confiável, usar host é criar um problema para você mesmo.
Quando usar o modo host?
Sendo direto: considere host somente quando houver um gargalo real de desempenho. Na maioria dos cenários, o pequeno custo do modo bridge simplesmente não é um problema.
Host é adequado para estes casos:
- Ferramentas de monitoramento: Prometheus, Grafana e ELK, que precisam acessar diretamente os recursos de rede do host
- Proxies de alto desempenho: Nginx e HAProxy usados para balanceamento de carga quando a menor latência possível é importante
- Bancos de dados: serviços sensíveis ao desempenho de rede, como MySQL e Redis, sempre avaliando os riscos de segurança
Se sua aplicação recebe apenas alguns milhares de requisições por segundo, não complique com host: bridge é suficiente.
Modos none e container: para casos especiais
Modo none: um sandbox totalmente desconectado
None significa exatamente isso: o contêiner não tem rede.
docker run -it --net=none alpine sh
Execute ip addr dentro do contêiner e você verá apenas a interface de loopback, lo. O contêiner não acessa a internet e também não pode ser acessado por outros contêineres.
Quando usar o modo none?
Para ser sincero, quase nunca usei none no trabalho. Seus casos de uso são bastante restritos:
- Testes de segurança: executar código não confiável com isolamento total da rede para evitar vazamento de dados
- Processamento offline de dados: o contêiner faz apenas cálculos locais e não precisa de comunicação de rede
- Configuração manual da rede: em situações muito raras, quando é necessário personalizar toda a rede, por exemplo, configurando veth manualmente com uma ferramenta como pipework
Se você não trabalha com pesquisa de segurança nem tem uma necessidade especial de configuração de rede, provavelmente não usará none.
Modo container: dois contêineres compartilhando a mesma rede
O modo container permite que um contêiner use o namespace de rede de outro. Parece complicado, mas o exemplo deixa claro:
# Primeiro, inicie um contêiner
docker run -d --name web nginx
# O segundo contêiner compartilha a rede de web
docker run -it --net=container:web alpine sh
Agora os dois contêineres compartilham a mesma configuração de rede: o mesmo endereço IP, o mesmo espaço de portas e as mesmas interfaces. No segundo contêiner, você pode acessar o Nginx em localhost:80.
Um uso típico do modo container: Pods do Kubernetes
Os Pods do Kubernetes são implementados com esse modelo de compartilhamento. Vários contêineres de um Pod compartilham a rede de um contêiner “pause”.
Por exemplo, um Pod pode executar o contêiner da aplicação e um contêiner sidecar que coleta logs. Os dois se comunicam por localhost, sem precisar expor portas externamente.
Porém, se você usa apenas Docker, e não Kubernetes, o modo container também aparece pouco. Uma rede bridge personalizada permite a comunicação entre contêineres e é mais flexível.
O papel desses dois modos
No fim, none e container funcionam mais como “recursos de baixo nível” do que como soluções do dia a dia. Eles oferecem flexibilidade para situações específicas, mas você não precisará deles em 80% dos casos.
Lembre-se:
- Modo none: use quando precisar de isolamento total da rede, algo raro
- Modo container: comum em orquestradores como Kubernetes, mas pouco usado diretamente com Docker
Decisão prática: como escolher o modo de rede certo
Um fluxograma de decisão
Diante de um projeto real, qual modo de rede usar? Este fluxo simples ajuda a decidir:
Você precisa de isolamento de rede?
│
├─ Não → Existe um gargalo de desempenho?
│ │
│ ├─ Sim → Use Host (considere os riscos de segurança)
│ └─ Não → Use Bridge (mais seguro)
│
└─ Sim → Os contêineres precisam se comunicar pelo nome?
│
├─ Sim → Rede Bridge personalizada
└─ Não → Rede Bridge padrão
Casos especiais:
- Não precisa de nenhuma rede → modo None
- Contêineres dentro de um Pod do Kubernetes → modo Container
Tabela rápida de recomendações
| Cenário | Modo recomendado | Motivo |
|---|---|---|
| Arquitetura de microsserviços com vários contêineres | bridge personalizada | Permite resolver nomes de contêineres e oferece bom isolamento |
| Uma única aplicação web | bridge padrão | É simples, suficiente e funciona com um único comando |
| Banco de dados ou cache de alto desempenho | Host | Reduz o custo de rede, mas exige avaliar os riscos de segurança |
| Ferramentas de monitoramento, como Prometheus ou ELK | Host | Precisam acessar diretamente os recursos do host |
| Balanceador de carga, como Nginx ou HAProxy | Host | Prioriza a menor latência possível |
| Ambiente de desenvolvimento e testes | bridge padrão | Inicia rapidamente sem configuração complexa |
| Contêiner sidecar dentro de um Pod do K8s | Container | Compartilha a rede com o contêiner principal |
| Sandbox de segurança ou tarefa offline | None | Mantém isolamento total da rede |
Três equívocos comuns
Equívoco 1: “O modo host é sempre o melhor”
Não é. Host sacrifica isolamento e flexibilidade em troca de um ganho de desempenho que pode ser irrelevante em muitos cenários.
Já vi gente executar todos os contêineres em host e acabar com uma pilha de conflitos de porta e problemas de segurança. O desempenho realmente melhorou um pouco, mas o custo de manutenção ficou dez vezes maior.
A realidade: bridge é suficiente para 80% das aplicações. Não escolha host apenas porque ele é “mais rápido”.
Equívoco 2: “O bridge padrão é suficiente”
Ele não é recomendado para ambientes de produção. A rede bridge padrão não resolve nomes de contêineres. Quando vários serviços precisam se comunicar, você acaba fixando IPs ou passando-os por variáveis de ambiente, uma solução muito frágil.
Criar uma rede bridge personalizada é simples:
docker network create mynet
especifique network no docker-compose.yml
A realidade: dois minutos configurando uma rede personalizada podem economizar horas de diagnóstico.
Equívoco 3: “Todo problema de rede em contêiner acontece porque o modo está errado”
Não necessariamente. Muitas vezes, a causa é o firewall, a configuração do iptables ou o DNS.
Siga estes passos para diagnosticar:
- Dentro do contêiner, teste se o gateway, o IP da docker0, responde a ping
- Depois, teste se o IP externo do host responde a ping
- Verifique se há regras DROP no iptables
- Confira a configuração do Docker daemon em
/etc/docker/daemon.json
A realidade: o modo é apenas o primeiro ponto; o diagnóstico de rede precisa ser sistemático.
Técnicas avançadas
Técnica 1: conectar um contêiner a várias redes
Às vezes, um contêiner precisa se conectar a duas redes ao mesmo tempo, como uma rede de frontend e outra de backend. Faça assim:
docker network create frontend
docker network create backend
docker run -d --name web --network frontend nginx
docker network connect backend web
Agora o contêiner web participa das redes frontend e backend.
Técnica 2: controlar a atribuição de IP com precisão
Ao criar uma rede personalizada, você pode definir a sub-rede e o gateway:
docker network create \
--driver bridge \
--subnet 192.168.10.0/24 \
--gateway 192.168.10.1 \
mynet
docker run -d --network mynet --ip 192.168.10.100 nginx
Isso é útil quando você precisa de um IP fixo, por exemplo, para uma lista de permissões do firewall.
Técnica 3: ferramentas úteis para diagnosticar problemas de rede
Estes comandos ajudam a investigar a rede dentro de um contêiner:
# Instalar ferramentas de rede
docker exec -it <container> apk add curl netcat-openbsd
# Testar conectividade
docker exec <container> nc -zv <host> <port>
# Ver a tabela de rotas
docker exec <container> ip route
# Capturar pacotes para análise (exige permissão no host)
docker exec <container> tcpdump -i eth0
Conclusão
Depois de tudo isso, vamos recapitular rapidamente os quatro modos de rede:
- Modo bridge: é o padrão e serve para a maioria dos casos; em produção, prefira uma rede bridge personalizada
- Modo host: prioriza desempenho, mas sacrifica o isolamento; use apenas quando houver um gargalo real
- Modo none: deixa o contêiner totalmente sem rede e é raramente usado
- Modo container: compartilha a rede e é usado principalmente no Kubernetes
Lembre-se: não existe o melhor modo, apenas o mais adequado para cada caso.
Se você está começando com Docker, use primeiro o bridge padrão. Ajuste quando surgir um problema concreto: se a descoberta de serviços estiver difícil, passe para uma rede bridge personalizada; se o desempenho realmente não for suficiente, considere host. Não comece tentando decidir qual modo é o “melhor”.
Vale a pena testar: crie uma rede personalizada, inicie alguns contêineres e veja se eles conseguem se comunicar usando os respectivos nomes. Executar o processo uma vez ensina mais do que ler dez artigos.
Se você já encontrou problemas de rede do Docker em um projeto real, compartilhe sua experiência nos comentários. Esse assunto é profundo, mas, dominando os conceitos básicos, você consegue resolver sozinho 80% dos casos.
Guia completo para escolher o modo de rede do Docker
Entenda os princípios, o desempenho e os casos de uso dos modos bridge, host, none e container.
⏱️ Estimated time: 30 min
- 1
Step 1: Entenda os quatro modos de rede
Os quatro modos de rede são:
bridge (modo padrão)
• Comunica-se pela ponte docker0 e exige mapeamento de portas
• Serve para a maioria dos casos; tem desempenho um pouco inferior ao host, mas oferece mais segurança
host
• Usa diretamente a rede do host, sem mapeamento de portas
• Oferece o melhor desempenho, próximo do nativo, mas reduz a segurança porque o contêiner fica exposto diretamente à rede do host
• É indicado para cenários de alto desempenho
none
• Não oferece rede e mantém isolamento completo
container
• Compartilha o namespace de rede de outro contêiner - 2
Step 2: Compare o desempenho e escolha o cenário
Comparação de desempenho:
• host oferece o melhor desempenho, próximo do nativo
• bridge é um pouco mais lento por causa do custo de NAT
• container depende do contêiner cuja rede é compartilhada
• none não oferece rede
Escolha por cenário:
• Use bridge na maioria dos casos: é o padrão, mais seguro e exige mapeamento de portas
• Use host quando houver uma necessidade real de alto desempenho, considerando a menor segurança
• Use none para isolamento completo e sem acesso à rede
• Use container quando contêineres precisarem compartilhar o mesmo namespace de rede - 3
Step 3: Configure na prática e aplique boas práticas
Configuração do modo bridge:
• docker run -d -p 8080:80 nginx (bridge padrão com mapeamento de portas)
• Crie uma rede personalizada: docker network create my-network
• Use a rede personalizada: docker run --network my-network
Configuração do modo host:
• docker run --network host nginx (usa diretamente a rede do host)
Boas práticas:
• Se você está começando com Docker, use primeiro o bridge padrão
• Ajuste a configuração quando surgir um problema concreto
• Se a descoberta de serviços ficar complicada, mude para uma rede bridge personalizada
• Só considere host quando o desempenho realmente não for suficiente
• Não comece tentando decidir qual modo é o ‘melhor’
FAQ
Quais são os quatro modos de rede do Docker e suas características?
bridge (padrão):
• Comunica-se pela ponte docker0 e exige mapeamento de portas
• Serve para a maioria dos casos; tem desempenho um pouco inferior ao host, mas oferece mais segurança
host:
• Usa diretamente a rede do host, sem mapeamento de portas
• Oferece o melhor desempenho, próximo do nativo, mas reduz a segurança porque o contêiner fica exposto diretamente à rede do host
• É indicado para cenários de alto desempenho
none:
• Não oferece rede e mantém isolamento completo
container:
• Compartilha o namespace de rede de outro contêiner
Qual é a diferença entre os modos bridge e host?
• É o padrão, e os contêineres se comunicam pela ponte docker0
• Exige o parâmetro -p para mapear portas
• Serve para a maioria dos casos; tem desempenho um pouco inferior ao host, mas oferece mais segurança
Modo host:
• Usa diretamente a rede do host, sem mapeamento de portas
• Oferece o melhor desempenho, próximo do nativo
• Porém, reduz a segurança porque o contêiner fica exposto diretamente à rede do host
• É indicado para cenários de alto desempenho
Em desempenho, host é o melhor e fica próximo do nativo, enquanto bridge é um pouco mais lento por causa do custo de NAT.
Como escolher o modo de rede mais adequado?
• Use bridge na maioria dos casos: é o padrão, mais seguro e exige mapeamento de portas
• Use host quando houver uma necessidade real de alto desempenho, considerando a menor segurança
• Use none para isolamento completo e sem acesso à rede
• Use container quando contêineres precisarem compartilhar o mesmo namespace de rede
Boas práticas:
• Se você está começando com Docker, use primeiro o bridge padrão
• Ajuste a configuração quando surgir um problema concreto
• Se a descoberta de serviços ficar complicada, mude para uma rede bridge personalizada
• Só considere host quando o desempenho realmente não for suficiente
• Não comece tentando decidir qual modo é o ‘melhor’
15 min de leitura · Publicado em: 17 dez 2025 · Atualizado em: 4 set 2026
Guia prático Docker
Se você chegou pela busca, o caminho mais rápido é ir para o post anterior ou próximo desta série.
Anterior
Como resolver problemas de permissão em diretórios montados no Docker: 5 soluções práticas
Entenda por que arquivos criados por containers geram Permission denied, diagnostique conflitos de UID e GID e aplique cinco soluções seguras no Linux, macOS, Windows, CI e Kubernetes.
Parte 17 de 34
Próximo
Rede entre contêineres Docker na prática: como conectar contêineres Web e de banco de dados corretamente
Como fazer contêineres Docker se comunicarem? Este guia prático mostra como usar uma rede personalizada para resolver falhas na resolução de nomes e mudanças de IP, garantindo uma comunicação estável entre contêineres Web e de banco de dados. Inclui comandos completos e dicas de solução de problemas.
Parte 19 de 34



Comentários
Entre com GitHub para comentar