Mergulhando na Rede do Docker

DockerBeginner
Pratique Agora

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.

Este é um Laboratório Guiado, que fornece instruções passo a passo para ajudar você a aprender e praticar. Siga as instruções cuidadosamente para concluir cada etapa e ganhar experiência prática. Dados históricos mostram que este é um laboratório de nível iniciante com uma taxa de conclusão de 98%. Ele recebeu uma taxa de avaliação positiva de 100% dos alunos.

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.

  1. 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
  1. Agora, vamos criar uma rede bridge personalizada:
docker network create my-custom-bridge
  1. 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
  1. 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
  1. 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.

  1. Primeiro, vamos criar uma segunda rede bridge personalizada:
docker network create my-second-bridge
  1. 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
  1. 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.

  1. 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
  1. 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 container1 consegue se comunicar com o container2 (estão na mesma rede).
  • O container1 não consegue se comunicar com o container3 (estão em redes diferentes).
  • O container2 consegue se comunicar tanto com o container1 quanto com o container3 (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.

  1. Crie um container usando o modo de rede host:
docker run --network host --name host-container -d nginx
  1. 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.

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

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

  1. Crie um container sem rede:
docker run --network none --name isolated-container -d alpine sleep infinity
  1. 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.

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

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

  1. Crie uma nova rede bridge para este exercício:
docker network create service-network
  1. Verifique a criação da rede:
docker network ls

Você deve ver service-network na lista.

  1. 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
  1. Crie um container cliente e use o nslookup para 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.

  1. 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:

  1. Redes bridge personalizadas para melhor isolamento e comunicação entre containers.
  2. Conexão de containers a múltiplas redes simultaneamente.
  3. Modo de rede Host para acesso direto à pilha de rede do hospedeiro.
  4. Modo de rede None para isolamento total de rede.
  5. 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.