Entendendo as Redes no Docker: Modos e Configurações

Visão Geral da Rede Docker

Funcionamento da Rede Docker

O Docker utiliza a tecnologia de ponte (bridge) do Linux para criar uma interface de rede virtual no host, chamada docker0. Sempre que um contêiner é iniciado, o Docker atribui a ele um endereço IP pertencente à sub-rede do ponte docker0, denominado Container-IP. Essa ponte virtual também atua como gateway padrão para todos os contêineres.

Uma vez que todos os contêineres em um mesmo host se conectam à mesma ponte, eles podem se comunicar diretamente entre si por meio dos seus respectivos IPs.

No entanto, como a ponte docker0 é uma interface virtual dentro do host, redes externas não conseguem alcançar os contêineres diretamente pelo Container-IP. Para permitir o acesso externo, é necessário fazer o mapeamento de portas do contêiner para o host, utilizando os parâmetros -p ou -P durante a execução do docker run. O acesso externo ocorre então via [IP_do_host]:[porta_mapeada].

Mapeamento Aleatório de Portas

docker run -d --name web_aleatorio -P nginx

Mapeamento com Porta Específica

docker run -d --name web_especifico -p 8080:80 nginx
docker ps --filter name=web_especifico

Testando no Navegador

Acesse: http://endereco-do-host:8080

Modos de Rede do Docker

Ao instalar o Docker, três redes são criadas automaticamente: bridge (padrão para novos contêineres), none e host. Para visualizar as redes disponíveis:

docker network ls


<p>Ao iniciar um contêiner com <code>docker run</code>, é possível definir o modo de rede utilizando <code>--net</code> ou <code>--network</code>:</p>

  • host: --network host
  • none: --network none
  • container: --network container:NOME_OU_ID
  • bridge: --network bridge (padrão, pode ser omitido)

Detalhamento dos Modos de Rede

Modo Host

Quando um contêiner utiliza o modo host, ele não recebe um Network Namespace isolado. Em vez disso, compartilha o mesmo namespace de rede com o host. Isso significa que o contêiner não cria interfaces de rede próprias nem recebe um IP dedicado — ele usa diretamente o IP e as portas do host. Essa abordagem elimina o isolamento de rede entre o contêiner e o sistema hospedeiro.

Esse modo é análogo ao modo bridge do VMware, onde o contêiner participa da mesma rede física do host.

Modo Container

Neste modo, o novo contêiner compartilha o Network Namespace com outro contêiner já existente, em vez de compartilhar com o host. Ambos os contêineres utilizam o mesmo IP e faixa de portas. A comunicação entre eles ocorre através da interface de loopback (lo).

Vale ressaltar que apenas os recursos de rede são compartilhados — sistemas de arquivos, lista de processos e demais namespaces continuam isolados.

Modo None

No modo none, o contêiner possui seu próprio Network Namespace, mas nenhuma configuração de rede é aplicada. Não há interfaces de rede, endereços IP ou rotas, exceto a interface de loopback. Esse modo é ideal para cenários que demandam total isolamento de rede, oferecendo maior segurança ao contêiner.

Modo Bridge

Este é o modo padrão do Docker. O contêiner recebe um Network Namespace exclusivo e é conectado à ponte virtual docker0. Funciona de forma semelhante ao modo NAT do VMware.

O funcionamento segue estas etapas:

  1. Quando o daemon Docker inicia, ele cria a ponte virtual docker0 no host. Todos os contêineres subsequentes são conectados a essa ponte, formando uma rede de camada 2 semelhante a um switch físico.
  2. Um IP da sub-rede do docker0 é atribuído ao contêiner, e o endereço do docker0 se torna o gateway padrão. Um par de interfaces virtuais (veth pair) é criado — essas interfaces funcionam como um túnel de dados bidirecional.
  3. Uma extremidade do par veth é inserida no contêiner como eth0, e a outra permanece no host com nome no formato veth*, conectada à ponte docker0. Pode-se verificar com:
brctl show

  1. Ao utilizar docker run -p, o Docker cria regras de DNAT nas tabelas iptables para realizar o encaminhamento de portas. Para inspecionar:
iptables -t nat -nL

Rede Personalizada

Por padrão, o modo bridge não permite definir um IP específico para o contêiner. O comando abaixo resultaria em erro:

docker run -itd --name teste_erro --network bridge --ip 172.17.0.10 nginx:latest

Criando uma Rede Personalizada

Para atribuir IPs específicos, primeiro é necessário criar uma rede com uma sub-rede definida:

docker network create \
  --subnet=172.20.0.0/16 \
  --opt "com.docker.network.bridge.name"="minha_ponte" \
  minha_rede

O parâmetro com.docker.network.bridge.name define o nome da interface de rede exibido ao executar ifconfig -a. Sem ele, o nome gerado será algo como br-110eb56a0b22. O valor minha_rede é o nome da rede exibido por docker network ls.

Agora é possível iniciar o contêiner com um IP específico:

docker run -itd \
  --name servidor_redis \
  --net minha_rede \
  --ip 172.20.0.10 \
  redis:latest

Para verificar as interfaces de rede (requer o pacote net-tools):

ifconfig

Tags: Docker Networking bridge host-network container-networking

Publicado em 7-2 21:43