Introdução
Neste laboratório, exploraremos conceitos avançados de rede do Docker, aprofundando os fundamentos já conhecidos. Vamos analisar detalhadamente os três principais modos de rede: Bridge, Host e None. Você também aprenderá a criar redes personalizadas, conectar containers em diferentes redes e entender as implicações de cada modo na comunicação e no isolamento dos containers. Esta experiência prática fornecerá uma base sólida sobre as práticas de rede no ecossistema Docker.
Redes Bridge Personalizadas
Embora o Docker forneça uma rede bridge padrão, a criação de redes bridge personalizadas oferece melhor isolamento e controle sobre a comunicação entre containers.
- Primeiro, vamos visualizar a lista atual de redes do Docker:
docker network ls
Você deverá ver algo semelhante a isto:
NETWORK ID NAME DRIVER SCOPE
296d1b460b17 bridge bridge local
91199fc6ad2e host host local
1078d2c781b6 none null local
- Agora, vamos criar uma rede bridge personalizada:
docker network create my-custom-bridge
- Liste todas as redes do Docker novamente para verificar a criação:
docker network ls
Agora você deve ver a my-custom-bridge na saída:
NETWORK ID NAME DRIVER SCOPE
296d1b460b17 bridge bridge local
91199fc6ad2e host host local
7215f99d0080 my-custom-bridge bridge local
1078d2c781b6 none null local
- Inicie dois containers na rede bridge personalizada e instale o utilitário ping:
docker run --network=my-custom-bridge --name container1 -d nginx
docker run --network=my-custom-bridge --name container2 -d nginx
Agora, vamos instalar o utilitário ping em ambos os containers. Precisamos fazer isso porque a imagem padrão do Nginx não inclui o comando ping:
docker exec container1 apt-get update && docker exec container1 apt-get install -y iputils-ping
docker exec container2 apt-get update && docker exec container2 apt-get install -y iputils-ping
- Teste a comunicação entre os containers:
docker exec container1 ping -c 4 container2
Você deve ver respostas de ping bem-sucedidas, demonstrando que containers na mesma rede bridge personalizada podem se comunicar usando os nomes dos containers. Isso funciona porque o DNS integrado do Docker resolve os nomes dos containers para seus respectivos endereços IP dentro da mesma rede.
Se você não vir pings bem-sucedidos, certifique-se de que ambos os containers estão em execução (docker ps) e que você instalou corretamente o utilitário ping.
Conectando Containers entre Redes
O Docker permite que os containers sejam conectados a múltiplas redes, possibilitando a comunicação entre containers que residem em redes distintas. Isso é particularmente útil quando você deseja isolar certos containers, mas ainda permitir comunicações específicas entre eles.
- Primeiro, vamos criar uma segunda rede bridge personalizada:
docker network create my-second-bridge
- Verifique a criação da rede:
docker network ls
Agora você deve ver ambas as redes personalizadas:
NETWORK ID NAME DRIVER SCOPE
296d1b460b17 bridge bridge local
91199fc6ad2e host host local
7215f99d0080 my-custom-bridge bridge local
8a15f99d0081 my-second-bridge bridge local
1078d2c781b6 none null local
- Conecte o
container2à nova rede:
docker network connect my-second-bridge container2
Este comando adiciona o container2 à rede my-second-bridge enquanto o mantém conectado à my-custom-bridge.
- Crie um novo container na segunda rede:
docker run --network=my-second-bridge --name container3 -d nginx
docker exec container3 apt-get update && docker exec container3 apt-get install -y iputils-ping
- Teste a comunicação entre todos os containers:
docker exec container1 ping -c 2 container2
docker exec container1 ping -c 2 container3
docker exec container2 ping -c 2 container3
Observe os resultados:
- O
container1consegue se comunicar com ocontainer2(estão na mesma rede). - O
container1não consegue se comunicar com ocontainer3(estão em redes diferentes). - O
container2consegue se comunicar tanto com ocontainer1quanto com ocontainer3(está conectado a ambas as redes).
Se o container1 conseguisse dar ping no container3, haveria algo errado com o seu isolamento de rede.
Modo de Rede Host
O modo de rede Host remove o isolamento de rede entre o container e o hospedeiro Docker, permitindo que o container utilize a rede do host diretamente. Isso pode ser útil para maximizar o desempenho, mas traz implicações de segurança, pois reduz o isolamento.
- Crie um container usando o modo de rede host:
docker run --network host --name host-container -d nginx
- Verifique a lista de redes atual:
docker network ls
Você não verá uma nova rede para este container porque ele está utilizando a rede do hospedeiro diretamente.
- Verifique se o container está de fato usando a rede do host:
docker inspect --format '{{.HostConfig.NetworkMode}}' host-container
A saída deve ser host.
- Tente acessar a página padrão do Nginx a partir da sua máquina host:
curl localhost:80
Você deverá ver a página de boas-vindas do Nginx. Isso funciona porque o container está usando a rede do hospedeiro, e o Nginx está escutando na porta 80 da interface de rede do host.
Nota: Se você já tiver um serviço rodando na porta 80 da sua máquina host, esta etapa pode falhar. Nesse caso, você precisaria parar o serviço existente primeiro.
Modo de Rede None
O modo de rede 'none' cria containers sem nenhuma interface de rede, isolando-os completamente. Isso é útil para isolamento de segurança máxima, mas significa que o container não pode se comunicar através da rede de forma alguma.
- Crie um container sem rede:
docker run --network none --name isolated-container -d alpine sleep infinity
- Verifique a lista de redes atual:
docker network ls
Você não verá uma nova rede para este container, pois ele não está conectado a nenhuma.
- Verifique que o container não possui interface de rede:
docker exec isolated-container ip addr
Você deve ver apenas a interface de loopback (lo). Não haverá eth0 ou outras interfaces de rede.
- Tente dar um ping no Google a partir do container isolado:
docker exec isolated-container ping -c 2 google.com
Isso deve falhar com um erro de "Network is unreachable" (Rede inalcançável), já que o container não tem acesso à rede.
Aliases de Rede e Descoberta de Serviços
As redes do Docker suportam a descoberta de serviços usando aliases de rede, o que é extremamente útil para criar aplicações resilientes e escaláveis. Este recurso permite que múltiplos containers respondam ao mesmo nome DNS, possibilitando um balanceamento de carga básico.
- Crie uma nova rede bridge para este exercício:
docker network create service-network
- Verifique a criação da rede:
docker network ls
Você deve ver service-network na lista.
- Crie dois containers com o mesmo alias de rede:
docker run -d --network service-network --network-alias myservice --name service1 nginx
docker run -d --network service-network --network-alias myservice --name service2 nginx
- Crie um container cliente e use o
nslookuppara resolver o serviço:
docker run --rm --network service-network appropriate/curl nslookup myservice
Você deve ver os IPs de ambos os containers retornados, demonstrando que o servidor DNS embutido do Docker está realizando o balanceamento entre os dois containers.
- Teste o acesso ao serviço múltiplas vezes:
for i in {1..4}; do docker run --rm --network service-network appropriate/curl ping -c 1 myservice; done
Você deve ver respostas de ambos os containers, demonstrando o balanceamento de carga básico. O servidor DNS do Docker alternará entre os dois endereços IP ao resolver myservice.
PING myservice (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.106 ms
--- myservice ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.106/0.106/0.106 ms
PING myservice (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.119 ms
--- myservice ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.119/0.119/0.119 ms
PING myservice (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.097 ms
--- myservice ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.097/0.097/0.097 ms
PING myservice (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.140 ms
--- myservice ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.140/0.140/0.140 ms
Resumo
Neste laboratório avançado de redes Docker, exploramos diversos conceitos fundamentais:
- Redes bridge personalizadas para melhor isolamento e comunicação entre containers.
- Conexão de containers a múltiplas redes simultaneamente.
- Modo de rede Host para acesso direto à pilha de rede do hospedeiro.
- Modo de rede None para isolamento total de rede.
- Aliases de rede e descoberta de serviços para construção de aplicações escaláveis.
Esses recursos avançados de rede no Docker fornecem ferramentas poderosas para projetar aplicações complexas de múltiplos containers com controle preciso sobre a comunicação e o isolamento. Compreender esses conceitos é crucial para arquitetar aplicações containerizadas eficientes, seguras e escaláveis.
Lembre-se de que, embora a rede do Docker ofereça grande flexibilidade, é importante considerar as implicações de segurança ao projetar sua arquitetura. Siga sempre o princípio do privilégio mínimo, expondo apenas as portas e serviços estritamente necessários.
À medida que você continuar trabalhando com Docker, verá que esses conceitos de rede são inestimáveis na orquestração de aplicações complexas e arquiteturas de microsserviços. Pratique esses conceitos regularmente para se tornar proficiente no gerenciamento eficaz de redes Docker.



