Introdução
Os contêineres Docker são ambientes isolados que executam aplicações sem interferir com o sistema hospedeiro. Por padrão, o Docker cria redes virtuais para isolar o tráfego dos contêineres, mas às vezes você pode querer que seu contêiner use a rede do hospedeiro diretamente.
Neste laboratório, você aprenderá como configurar contêineres Docker para usar a rede do hospedeiro. Você explorará as diferenças entre a rede bridge (ponte) padrão e a rede host (hospedeira), entenderá quando usar a rede host e implementará exemplos práticos para ver os benefícios em primeira mão.
Compreendendo os Tipos de Rede Docker
Antes de configurarmos contêineres para usar a rede host, vamos explorar os diferentes tipos de rede disponíveis no Docker e entender seus propósitos.
Verificando as Redes Docker Disponíveis
Vamos começar examinando as redes Docker padrão em seu sistema:
Abra um terminal em seu ambiente LabEx.
Execute o seguinte comando para listar todas as redes Docker:
docker network ls
Você deve ver uma saída semelhante a esta:
NETWORK ID NAME DRIVER SCOPE
1234567890ab bridge bridge local
0987654321cd host host local
abcdef123456 none null local
O Docker fornece três redes padrão:
bridge: A rede padrão para contêinereshost: Usa a rede do hospedeiro diretamentenone: Sem rede (contêineres são isolados)
Compreendendo a Rede Bridge Padrão
Quando você executa um contêiner sem especificar uma rede, o Docker o conecta à rede bridge padrão. Isso cria uma interface de rede virtual para cada contêiner e permite que os contêineres se comuniquem entre si e com a rede externa.
Vamos ver isso em ação:
- Execute um contêiner nginx simples com a rede bridge padrão:
docker run --name nginx-bridge -d -p 8080:80 nginx:alpine
- Verifique as configurações de rede do contêiner:
docker inspect nginx-bridge --format '{{json .NetworkSettings.Networks}}' | jq
Você deve ver a saída mostrando que o contêiner está conectado à rede bridge e tem seu próprio endereço IP.
- Verifique se o contêiner é acessível do host fazendo uma requisição para a porta mapeada:
curl http://localhost:8080
Você deve ver o conteúdo HTML da página de boas-vindas do nginx.
Isso mostra como a rede bridge funciona - o contêiner tem seu próprio endereço IP, e a porta 80 no contêiner é mapeada para a porta 8080 no host.
Executando um Contêiner com o Modo de Rede Host
Agora, vamos explorar como executar um contêiner usando a rede host e entender como ela difere da rede bridge.
Usando a Rede Host
Quando você usa o modo de rede host, o contêiner compartilha o namespace de rede do host diretamente. Isso significa:
- O contêiner usa o endereço IP do host
- Nenhum mapeamento de porta é necessário
- O contêiner pode acessar todas as interfaces de rede no host
- Conflitos de porta podem ocorrer se o contêiner tentar usar portas já em uso no host
Vamos executar um contêiner com rede host:
- Pare e remova o contêiner nginx anterior para liberar a porta 80:
docker stop nginx-bridge
docker rm nginx-bridge
- Agora, execute um novo contêiner nginx usando a rede host:
docker run --name nginx-host --network host -d nginx:alpine
Observe que não precisamos especificar a flag -p para mapeamento de porta, pois o contêiner usará diretamente a pilha de rede do host.
- Verifique as configurações de rede do contêiner:
docker inspect nginx-host --format '{{json .NetworkSettings.Networks}}' | jq
Você verá que o contêiner está conectado à rede host.
- Acesse o servidor nginx diretamente na porta 80 do host:
curl http://localhost:80
Você deve ver o conteúdo HTML da página de boas-vindas do nginx.
Entendendo as Diferenças
Vamos comparar as duas abordagens:
Com rede bridge (padrão):
- Contêiner tem seu próprio endereço IP
- Mapeamento de porta necessário para acessar os serviços do contêiner
- Camada de rede adicional para isolamento
- Mais seguro devido ao isolamento
Com rede host:
- Contêiner usa o endereço IP do host
- Nenhum mapeamento de porta necessário
- Acesso direto às interfaces de rede do host
- Melhor desempenho de rede
- Menos isolamento entre o contêiner e o host
Comparando Desempenho e Comportamento de Rede
Agora, vamos executar alguns testes para ver as diferenças práticas entre as redes bridge e host no Docker.
Testando o Desempenho da Rede
Primeiro, vamos criar um contêiner com rede bridge e outro com rede host, e então comparar seu desempenho.
- Vamos parar e remover o contêiner nginx anterior:
docker stop nginx-host
docker rm nginx-host
- Crie um novo contêiner com rede bridge para testar o desempenho:
docker run --name bridge-test -d --network bridge nginx:alpine
- Crie outro contêiner com rede host:
docker run --name host-test -d --network host nginx:alpine
- Vamos usar
docker execpara executar um teste de rede simples em cada contêiner:
Para o contêiner de rede bridge:
docker exec bridge-test sh -c "time wget -q -O /dev/null http://google.com"
Para o contêiner de rede host:
docker exec host-test sh -c "time wget -q -O /dev/null http://google.com"
Compare os tempos de execução. Tipicamente, o contêiner de rede host terá um desempenho ligeiramente melhor porque evita a camada de rede adicional.
Examinando as Interfaces de Rede
Vamos examinar as interfaces de rede em ambos os contêineres:
- Para o contêiner de rede bridge:
docker exec bridge-test ip addr show
Você verá que este contêiner tem suas próprias interfaces de rede, isoladas do host.
- Para o contêiner de rede host:
docker exec host-test ip addr show
Você notará que este contêiner tem exatamente as mesmas interfaces de rede que o sistema host, incluindo todas as interfaces de rede físicas.
- Compare com as interfaces de rede do host:
ip addr show
As interfaces do contêiner de rede host devem corresponder às do sistema host.
Entendendo Conflitos de Porta
Ao usar a rede host, conflitos de porta podem ocorrer se o contêiner tentar usar portas já em uso no host:
- Pare e remova todos os contêineres em execução:
docker stop bridge-test host-test
docker rm bridge-test host-test
- Inicie um serviço no host usando a porta 8080:
python3 -m http.server 8080 &
- Agora, tente executar um contêiner com rede host que também deseja usar a porta 8080:
docker run --name conflict-test --network host -d -p 8080:80 nginx:alpine
Você deve ver um erro porque a porta 8080 já está em uso no host.
- Limpe o servidor HTTP Python:
kill %1
Isso demonstra uma desvantagem potencial da rede host - você precisa estar ciente de conflitos de porta com o host.
Casos de Uso Práticos para Rede Host
Agora, vamos explorar alguns casos de uso práticos onde a rede host é benéfica e implementar um exemplo do mundo real.
Quando Usar a Rede Host
A rede host é particularmente útil nos seguintes cenários:
Aplicações críticas para o desempenho: Quando o desempenho da rede é crucial e você deseja evitar a sobrecarga da rede bridge.
Ferramentas de monitoramento de rede: Aplicações que precisam capturar ou analisar o tráfego de rede no host.
Aplicações que usam múltiplas portas: Quando você tem serviços que usam muitas portas ou alocação dinâmica de portas.
Acessando interfaces de rede de hardware: Quando os contêineres precisam de acesso direto às interfaces de rede físicas.
Implementando uma Ferramenta de Monitoramento de Rede com Rede Host
Vamos implementar um exemplo prático: um contêiner simples de monitoramento de rede que precisa de acesso às interfaces de rede do host.
- Primeiro, execute uma ferramenta de monitoramento de rede usando a rede host:
docker run --name netmon --network host -d alpine:latest sleep infinity
Este contêiner será executado indefinidamente, permitindo que executemos comandos dentro dele.
- Agora, vamos capturar algum tráfego de rede dentro do contêiner:
docker exec netmon sh -c "apk add --no-cache tcpdump && tcpdump -c 10 -i any -n"
O comando acima:
- Instala a ferramenta tcpdump no contêiner
- Captura 10 pacotes de qualquer interface
- Mostra a saída numérica (sem resolução de nome de host)
Como estamos usando a rede host, o contêiner pode acessar todas as interfaces de rede do host diretamente.
- Vamos verificar se podemos capturar tráfego para um serviço específico do host:
## Abra uma nova janela de terminal e gere algum tráfego
curl http://localhost:80 &
## No terminal original, execute:
docker exec netmon sh -c "apk add --no-cache tcpdump && tcpdump -c 5 -i any port 80 -n"
Você deve ver o contêiner capturando tráfego HTTP na porta 80.
Isso demonstra como a rede host permite que o contêiner acesse as interfaces de rede do host e capture tráfego, o que seria mais difícil com a rede bridge.
Usando a Rede Host em um Arquivo Docker Compose
Para aqueles que usam Docker Compose, você pode configurar um serviço para usar a rede host em seu arquivo docker-compose.yml:
version: "3"
services:
web:
image: nginx:alpine
network_mode: "host"
Esta configuração faria com que o serviço web usasse a pilha de rede do host.
Considerações de Segurança e Melhores Práticas
Ao usar a rede host com contêineres Docker, é importante entender as implicações de segurança e seguir as melhores práticas.
Implicações de Segurança da Rede Host
Usar a rede host reduz o isolamento entre o contêiner e o sistema host. Isso tem várias implicações de segurança:
Isolamento de rede reduzido: Contêineres com rede host podem acessar todas as interfaces de rede e portas no host.
Potenciais conflitos de porta: Serviços no contêiner podem entrar em conflito com serviços em execução no host.
Superfície de ataque aumentada: Se um contêiner for comprometido, o invasor pode ter acesso mais direto à rede do host.
Melhores Práticas para Usar a Rede Host
Siga estas melhores práticas ao usar a rede host:
- Limite os privilégios do contêiner: Mesmo ao usar a rede host, siga o princípio do menor privilégio:
## Execute um contêiner com rede host, mas remova as capacidades
docker run --name secure-host-net --network host --cap-drop ALL --cap-add NET_ADMIN -d alpine:latest sleep infinity
Use a rede host somente quando necessário: Use a rede host apenas para contêineres que realmente precisam dela, não como uma escolha padrão.
Auditorias de segurança regulares: Monitore os contêineres que usam a rede host mais de perto para possíveis problemas de segurança.
Use sistemas de arquivos somente leitura sempre que possível:
## Execute um contêiner com rede host e sistema de arquivos somente leitura
docker run --name readonly-host-net --network host --read-only -d alpine:latest sleep infinity
- Limpe contêineres não utilizados:
## Remova todos os contêineres parados (limpeza)
docker container prune -f
Limpando Seu Ambiente de Laboratório
Vamos limpar todos os contêineres que criamos durante este laboratório:
## Liste todos os contêineres
docker ps -a
## Pare todos os contêineres em execução
docker stop $(docker ps -q) 2> /dev/null || true
## Remova todos os contêineres
docker rm $(docker ps -a -q) 2> /dev/null || true
## Verifique se todos os contêineres foram removidos
docker ps -a
Você não deve ver nenhum contêiner listado após executar esses comandos.
Quando Escolher Bridge vs. Rede Host
Para resumir quando usar cada tipo de rede:
Use a rede bridge (padrão) quando:
- Você precisa de isolamento entre contêineres
- Você precisa de controle preciso sobre o mapeamento de portas
- Sua aplicação não requer acesso direto às interfaces de rede do host
- A segurança é uma prioridade máxima
Use a rede host quando:
- O desempenho da rede é crítico
- Você precisa de acesso direto às interfaces de rede do host
- Seu contêiner precisa usar muitas portas ou alocação dinâmica de portas
- Você precisa monitorar o tráfego de rede
- O contêiner deve parecer ter o mesmo endereço IP que o host
Resumo
Neste laboratório, você aprendeu:
- As diferenças entre a rede bridge (ponte) e a rede host do Docker
- Como executar contêineres Docker com rede host usando a flag
--network host - As vantagens de desempenho da rede host em comparação com a rede bridge
- Casos de uso práticos onde a rede host é benéfica
- Considerações de segurança e melhores práticas ao usar a rede host
A rede host remove o isolamento de rede entre o contêiner e o host, permitindo que o contêiner acesse diretamente as interfaces de rede do host. Isso pode melhorar o desempenho, simplificar a configuração e permitir que certos tipos de aplicações, como ferramentas de monitoramento de rede, funcionem corretamente.
Lembre-se que, embora a rede host ofereça certas vantagens, ela também reduz o isolamento e pode introduzir preocupações de segurança. Sempre siga as melhores práticas e use a rede host somente quando seu caso de uso exigir.



