No ecossistema de containers, a rede é o componente que permite a comunicação entre serviços, o acesso à internet e a exposição de aplicações para o mundo externo. Entender como o Docker gerencia o tráfego de dados é fundamental para arquitetar sistemas distribuídos resilientes e seguros.
Fundamentos de Rede no Docker
Ao instalar o Docker, o engine configura automaticamente três interfaces de rede inicciais. Você pode listá-las com o seguinte comando:
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
e3f4g5h6i7j8 bridge bridge local
k9l0m1n2o3p4 host host local
q5r6s7t8u9v0 none null local
Análise dos Drivers de Rede Principais
1. Modo Bridge (Padrão)
Este é o driver padrão utilizado quando nenhum modo é especificado. Ele cria uma ponte virtual (geralmente chamada de docker0) no host. Cada container recebe um endereço IP privado dentro da faixa dessa sub-rede.
Exemplo: Implantando um servidor Apache com mapeamento de porta
# Executa o container mapeando a porta 80 do container para a 9090 do host
docker run -d --name servidor-apache -p 9090:80 httpd:alpine
# Verifica as portas ativas
docker port servidor-apache
# Teste de conectividade local
curl http://localhost:9090
2. Modo Host
Neste modo, o container compartilha diretamente o stack de rede do host, removendo o isolamento entre o sistema hospedeiro e o container. Não há necessidade de mapeamento de portas (port forwarding), o que resulta em performance máxima de I/O.
# Executa um utilitário de rede para listar portas do host através do container
docker run --rm --net=host alpine netstat -tulpn
3. Modo None
Desativa completamente a interface de rede externa do container. Útil para tarefas de processamento em lote que exigem alto isolamento ou para montagem manual de configurações de rede personalizadas.
docker run -it --net=none alpine ip addr
Redes Customizadas (User-Defined Bridge)
Em ambientes de produção, redes bridge personalizadas são preferíveis em relação à rede bridge padrão. Elas oferecem resolução automática de DNS entre containers (permitindo o uso do nome do container como hostname) e melhor isolamento.
Prática: Comunicação entre Microserviços
# 1. Criar uma rede isolada para a aplicação
docker network create --driver bridge rede-producao
# 2. Subir uma instância de banco de dados MongoDB na rede
docker run -d --name banco-dados --net rede-producao mongo:latest
# 3. Executar um container de aplicação para testar a resolução de nome
docker run -it --rm --net rede-producao alpine ping -c 3 banco-dados
Interconectando Redes Distintas
Um container pode estar conectado a múltiplas redes simultaneamente. Isso permite criar "pontes" entre diferentes camadas da aplicação.
# Conectar um container existente a uma nova rede
docker network connect rede-producao container-legado
# Validar a conexão
docker inspect container-legado --format='{{json .NetworkSettings.Networks}}'
Cenário Real: Setup de Aplicação Web e Banco de Dados
Abaixo, um exemplo de como estruturar uma stack simples garantindo que os serviços se comuniquem de forma isolada.
# Criação da rede de backend
docker network create backend-net
# Inicialização do MariaDB
docker run -d --name db-servidor \
--net backend-net \
-e MARIADB_ROOT_PASSWORD=admin_pass \
mariadb:latest
# Inicialização do Adminer (Interface Web) para gerenciar o DB
docker run -d --name gerenc-db \
--net backend-net \
-p 8081:8080 \
adminer
Diagnóstico e Solução de Problemas
Para depurar problemas de conectividade, as seguintes ferramentas são essenciais:
- Inspecionar detalhes da rede:
docker network inspect [NOME_DA_REDE] - Capturar tráfego: Utilizar um container com
tcpdumpcompartilhado no namespace do container alvo: ``` docker run --rm --net=container:[NOME_CONTAINER] nicolaka/netshoot tcpdump -i eth0 - Verificar IP de um container específico: ```
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [ID_CONTAINER]
Resumo de Escolha de Driver
| Caso de Uso | Driver Recomendado | Principal Vantagem |
|---|---|---|
| Aplicações multicontainer locais | Custom Bridge | DNS nativo e isolamento. |
| Serviços de alta performance | Host | Latência de rede mínima. |
| Segurança máxima/Processamento local | None | Isolamento total de stack. |
| Clusters multi-host | Overlay | Comunicação entre diferentes nós. |