Pular para o conteúdo principal

Capítulo 5 - Redes no Docker

No mundo dos containers, cada container é isolado do outro por padrão. Porém, muitas aplicações precisam se comunicar — por exemplo, uma API que acessa um banco de dados ou um servidor web que conversa com um serviço de autenticação.

É aqui que entra o Docker Networking, que permite que containers se comuniquem entre si e com o mundo externo.

🌐 Tipos de Redes no Docker

O Docker oferece diferentes drivers de rede, cada um para uma necessidade específica:

TipoDescrição
bridgeCria uma rede privada interna no host. Containers podem se comunicar usando IP ou nome (DNS interno).
hostO container compartilha a pilha de rede do host. É como se ele rodasse diretamente na sua máquina.
noneDesativa qualquer interface de rede do container. Totalmente isolado.
overlayPermite que containers em hosts diferentes (em um cluster Docker Swarm) se comuniquem.
macvlanDá ao container um IP na rede física, como se fosse outro dispositivo na sua rede local.
dica

Neste capítulo, vamos focar nos tipos bridge, none e host, que são os mais comuns no desenvolvimento local.

🔍 Explorando Redes Existentes

Para listar as redes existentes no seu Docker, execute:

docker network ls

Por padrão, você verá pelo menos estas redes:

  • bridge (rede padrão dos containers)
  • host
  • none

Se você não especificar nenhuma rede ao criar um container, ele será conectado à rede bridge.


🕸️ Comunicação entre Containers — Modo Bridge

Vamos testar como funciona a rede bridge.

🏗️ Cenário:

  • Um container nginx servindo páginas.
  • Um container ubuntu que faz uma requisição HTTP ao nginx.

🚀 Passo a passo:

1️⃣ Suba um container com nginx:

docker run -d --name webserver nginx

2️⃣ Descubra o IP do nginx:

docker inspect webserver

Procure por:

"Networks": {
"bridge": {
"IPAddress": "172.17.0.X"
}
}

⚠️ Esse é o IP do container dentro da rede bridge.

3️⃣ Suba um container Ubuntu:

docker run -it --name cliente ubuntu bash

4️⃣ Instale o curl:

apt update && apt install curl -y

5️⃣ Faça uma requisição HTTP para o nginx:

curl http://172.17.0.X

🎉 Você verá o conteúdo da página padrão do nginx, confirmando que os containers conseguem se comunicar na rede bridge.

dica

Essa comunicação funciona porque ambos os containers estão na mesma rede bridge padrão.


🔒 Isolando um Container — Modo None

Imagine que você quer executar um container totalmente isolado da rede, seja por segurança, testes ou outros motivos.

🚫 Como fazer:

1️⃣ Remova o nginx anterior:

docker rm -f webserver

2️⃣ Suba o nginx com rede none:

docker run -d --name webserver --network none nginx

3️⃣ Inspecione o container:

docker inspect webserver

➡️ Veja que agora o campo IPAddress não existe e Networks mostra apenas:

"Networks": {}

4️⃣ Tente se conectar...

No container Ubuntu, tente:

curl http://webserver

Erro! O container webserver está isolado — sem IP, sem DNS, sem comunicação.

cuidado

Ao usar a rede none, o container não consegue nem mesmo acessar a internet.


🏗️ Criando uma Rede Bridge Personalizada — E Usando DNS!

Trabalhar com IPs não é prático, pois eles podem mudar. Vamos criar uma rede onde os containers possam se comunicar pelo nome.

🚀 Criando a rede:

docker network create myNet

🔗 Conectando containers:

1️⃣ Desconecte o nginx da rede none:

docker network disconnect none webserver

2️⃣ Conecte o nginx na rede myNet:

docker network connect myNet webserver

3️⃣ Conecte o Ubuntu na mesma rede:

docker network connect myNet cliente

🔥 Testando:

No container Ubuntu:

curl http://webserver

🎉 Sucesso! Agora usamos o nome do container como hostname, graças ao DNS interno da rede personalizada.

dica

Isso facilita muito a comunicação! webserver é o nome do container e funciona como hostname dentro da rede myNet.


🚀 Modo Host — Sem Isolamento de Rede

Quando usamos --network host, o container compartilha a pilha de rede do seu computador.

✔️ O que isso significa?

  • Não há isolamento de portas.
  • Se seu computador responde no localhost:8080, o container também estará lá — sem necessidade de -p.

🔥 Teste na prática:

1️⃣ Limpe todos os containers:

docker rm -f $(docker ps -qa)

2️⃣ Rode sua aplicação (exemplo: my-app) diretamente na rede do host:

docker run -d --network host my-app

3️⃣ Acesse:

Abra no navegador:

http://localhost:8080

Sem precisar mapear portas!

dica

Use docker inspect no container para comparar como a configuração de rede muda entre bridge e host.

atenção

O modo host não funciona no Windows e Mac da mesma forma que no Linux, devido às diferenças nas pilhas de rede desses sistemas.


🎯 Resumo do Capítulo

  • Containers se comunicam por redes Docker.
  • O modo bridge é o padrão e permite comunicação via IP ou DNS se for uma rede personalizada.
  • O modo none isola completamente o container.
  • O modo host faz o container usar diretamente a rede do host.
  • Criar redes personalizadas melhora a comunicação, permitindo usar nomes em vez de IPs.

🚀 Próximo Passo

Agora que dominamos redes no Docker, estamos prontos para entender volumes e persistência de dados, nosso próximo capítulo! 💾🔗