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