Post

Gerenciamento de Redes no Docker: Guia Completo

Gerenciamento de Redes no Docker: Guia Completo

Sumário

  1. Parte 1: Conceitos Fundamentais de Redes no Docker e Tipos de Redes Disponíveis
  2. Parte 2: Configuração e Gerenciamento de Redes Customizadas no Docker
  3. Parte 3: Comunicação Entre Containers em Diferentes Redes
  4. Parte 4: Integração do Docker com iptables
  5. Parte 5: Como Alterar a Rede Padrão do Docker
  6. Parte 6: Configuração do Suporte a IPv6 no Docker
  7. Parte 7: Drivers de Rede no Docker
  8. Parte 8: Práticas Recomendadas de Segurança para Redes no Docker
  9. Parte 9: Resolução de Problemas (Troubleshooting)

Parte 1: Conceitos Fundamentais de Redes no Docker e Tipos de Redes Disponíveis

Conceitos Fundamentais

No Docker, o gerenciamento de redes é essencial para conectar containers entre si, com o host e com redes externas. Cada container é isolado por padrão, e o Docker oferece diversos tipos de redes para suportar diferentes topologias e garantir requisitos de segurança.

Aqui estão alguns conceitos-chave que você precisa entender para lidar com redes no Docker:

  • Namespaces de rede: Docker utiliza namespaces de rede do kernel Linux para criar ambientes isolados de rede para cada container, garantindo que cada container tenha sua própria pilha de rede.
  • Veth pairs: Um par de interfaces virtuais Ethernet, chamado de “veth pair”, é usado para conectar a interface de rede do container ao host. Um lado do veth pair é conectado ao container e o outro à bridge no host.
  • Bridge e roteamento: Docker usa uma bridge interna (geralmente chamada de docker0) para conectar containers na rede padrão bridge. Essa bridge atua como um switch virtual, permitindo a comunicação entre containers e roteando o tráfego para redes externas.

Esses conceitos são a base sobre a qual as redes Docker operam, permitindo criar redes com diferentes graus de isolamento e conectividade.

Tipos de Redes no Docker

O Docker oferece quatro tipos principais de redes que atendem a diferentes casos de uso:

  1. Bridge Network (Rede Bridge):
    • Definição: A rede bridge é o tipo de rede padrão no Docker. Ela cria uma bridge virtual no host que conecta os containers para que possam se comunicar entre si.
    • Caso de uso: Ideal para ambientes isolados, como quando você deseja que os containers se comuniquem apenas entre si, sem interação direta com o host ou a rede externa.
    • Comando para criação:
      1
      
      docker network create --driver bridge minha-bridge
      
    • Conectar um container:
      1
      
      docker run -dit --name meu-container --network minha-bridge nginx
      
  2. Host Network (Rede Host):
    • Definição: A rede host faz com que o container compartilhe diretamente a interface de rede do host. O container não tem sua própria pilha de rede, mas usa diretamente a do host.
    • Caso de uso: Necessário quando o desempenho de rede é crítico ou quando se deseja eliminar a sobrecarga de NAT. Exemplo: aplicações que precisam de acesso de baixa latência ou alta performance à rede.
    • Comando para execução:
      1
      
      docker run -dit --network host nginx
      
  3. Overlay Network (Rede Overlay):
    • Definição: A rede overlay conecta containers em diferentes hosts, sendo usada principalmente em clusters Docker Swarm ou Kubernetes. Cria uma rede distribuída sobre a infraestrutura subjacente.
    • Caso de uso: Ideal para clusters onde containers precisam se comunicar entre vários nós. Muito útil em arquiteturas de microserviços distribuídos.
    • Criação de uma rede overlay:
      1
      
      docker network create --driver overlay minha-overlay
      
  4. None Network (Rede None):
    • Definição: A rede none desabilita completamente a conectividade de rede do container. Isso significa que o container não terá conectividade externa, exceto se você explicitamente configurar volumes ou outros métodos.
    • Caso de uso: Quando você deseja isolar completamente um container, garantindo que ele não interaja com nenhuma rede.
    • Comando para execução:
      1
      
      docker run -dit --network none nginx
      

Parte 2: Configuração e Gerenciamento de Redes Customizadas no Docker

Criação de Redes Customizadas

Além das redes padrão, o Docker permite criar redes customizadas que oferecem controle total sobre o tráfego de rede, incluindo a capacidade de definir subnets, gateways e políticas de isolamento.

1. Criando uma rede bridge customizada:

Você pode definir parâmetros como subnet e gateway ao criar uma rede customizada, o que é útil para definir ranges de IPs específicos ou integrar containers com redes externas.

Exemplo:

1
2
3
4
5
docker network create \
  --driver bridge \
  --subnet 192.168.1.0/24 \
  --gateway 192.168.1.1 \
  minha-rede-customizada

Neste caso, criamos uma rede chamada minha-rede-customizada com o range de IP 192.168.1.0/24 e o gateway 192.168.1.1.

2. Criando uma rede macvlan para integração com a rede física:

Para situações onde você deseja que containers tenham endereços IP visíveis na rede física (como dispositivos de rede reais), pode usar o driver macvlan.

Exemplo de criação de uma rede macvlan:

1
2
3
4
5
6
7
docker network create \
  --driver macvlan \
  --subnet 192.168.2.0/24 \
  --gateway 192.168.2.1 \
  --ip-range 192.168.2.100/28 \
  --aux-address="reserved=192.168.2.200" \
  minha-macvlan

Aqui, a rede macvlan permite que os containers usem diretamente endereços IP da rede física, com o range definido como 192.168.2.100/28.

Conectando Containers a Redes Customizadas

Depois de criar uma rede customizada, você pode conectar containers a ela facilmente especificando a rede no comando docker run.

Exemplo:

1
2
docker run -dit --name container1 --network minha-rede-customizada nginx
docker run -dit --name container2 --network minha-rede-customizada nginx

Esses dois containers agora estão conectados à rede minha-rede-customizada e podem se comunicar entre si usando essa rede.

Gerenciamento de Redes Customizadas

Aqui estão alguns comandos adicionais para gerenciar redes Docker:

  • Listar redes disponíveis:
    1
    
    docker network ls
    
  • Inspecionar uma rede: Este comando retorna detalhes sobre uma rede específica, como os containers conectados, os IPs atribuídos, e o estado da rede.
    1
    
    docker network inspect minha-rede-customizada
    
  • Desconectar um container de uma rede:
    1
    
    docker network disconnect minha-rede-customizada container1
    
  • Remover uma rede:
    1
    
    docker network rm minha-rede-customizada
    

Esses comandos ajudam a monitorar e gerenciar suas redes, garantindo que o tráfego de rede esteja bem controlado e os containers devidamente conectados.


Gerenciamento de DNS no Docker

O Docker oferece mecanismos para configurar os servidores de DNS usados por containers, permitindo maior controle sobre a resolução de nomes, especialmente em ambientes onde a comunicação entre containers e outros serviços depende de configurações específicas de DNS.

Especificando Servidores DNS

Por padrão, o Docker utiliza o servidor DNS configurado no host. No entanto, você pode definir servidores DNS personalizados usando a opção --dns no comando docker run.

Exemplo:

1
docker run -dit --dns 8.8.8.8 nginx

Neste exemplo, o container nginx usará o servidor DNS do Google (8.8.8.8) para resolver os nomes de domínio.

Configurando Domínios de Busca (Search Domains)

Além de especificar um servidor DNS, o Docker permite configurar domínios de busca para containers, o que facilita a resolução de nomes de domínio internos em uma rede privada.

Exemplo:

1
docker run -dit --dns-search exemplo.com nginx

Esse comando faz com que o container adicione exemplo.com como um domínio de busca. Isso significa que quando o container tenta resolver um nome como meu-servico, ele automaticamente tentará resolver meu-servico.exemplo.com.

Configurando Hostnames e Domain Names

Você também pode personalizar o hostname e o domain name do container ao iniciar um container. Isso é útil em ambientes onde você precisa controlar a identidade de rede dos containers.

Exemplo:

1
docker run -dit --hostname meu-container --dns-search exemplo.com nginx

Neste caso, o container terá o hostname meu-container e fará parte do domínio exemplo.com.

Configurações DNS Persistentes com Redes Customizadas

Ao criar uma rede customizada, o Docker permite definir configurações de DNS diretamente na rede, tornando as configurações persistentes para todos os containers que forem conectados a ela.

Exemplo:

1
2
3
4
5
docker network create \
  --driver bridge \
  --dns 8.8.8.8 \
  --dns 8.8.4.4 \
  minha-rede-com-dns

Todos os containers conectados à rede minha-rede-com-dns usarão os servidores DNS configurados (8.8.8.8 e 8.8.4.4).


Conectando Containers a Redes Customizadas

Depois de criar uma rede customizada, você pode conectar containers a ela facilmente especificando a rede no comando docker run.

Exemplo:

1
2
docker run -dit --name container1 --network minha-rede-customizada nginx
docker run -dit --name container2 --network minha-rede-customizada nginx

Esses dois containers agora estão conectados à rede minha-rede-customizada e podem se comunicar entre si usando essa rede.


Parte 3: Comunicação Entre Containers em Diferentes Redes

Containers conectados a diferentes redes no Docker, por padrão, não conseguem se comunicar diretamente. Isso é feito para garantir o isolamento entre redes, aumentando a segurança e a flexibilidade no controle de tráfego. No entanto, em alguns casos, você pode querer que containers em diferentes redes se comuniquem, seja dentro do mesmo host ou em hosts distintos.

Abordagens para Comunicação entre Containers em Redes Diferentes

1. Conectar Containers a Múltiplas Redes

Você pode conectar um container a mais de uma rede, permitindo que ele se comunique com containers em ambas as redes. Isso é útil em situações onde containers de redes distintas precisam compartilhar dados ou serviços.

Exemplo:

1
2
docker run -dit --name container1 --network minha-rede-customizada nginx
docker network connect minha-bridge container1

Aqui, o container1 está conectado tanto à rede minha-rede-customizada quanto à rede minha-bridge, possibilitando a comunicação com containers em ambas as redes.

2. Uso de Redes Overlay em Docker Swarm ou Kubernetes

Em ambientes distribuídos, como clusters Docker Swarm ou Kubernetes, a rede overlay é usada para conectar containers entre diferentes hosts. A rede overlay cria uma camada de abstração sobre a infraestrutura física, permitindo a comunicação entre containers em diferentes máquinas.

Exemplo de criação de rede overlay em Docker Swarm:

1
2
3
docker network create \
  --driver overlay \
  minha-overlay

Containers em hosts diferentes que estejam conectados à rede minha-overlay poderão se comunicar como se estivessem no mesmo host.

3. Configuração de Regras de iptables e Proxies

Em casos onde redes estão completamente isoladas e a conexão direta entre elas não é possível, você pode configurar manualmente regras de iptables no host para permitir a comunicação entre essas redes ou usar um proxy reverso para rotear o tráfego entre containers em diferentes redes.

Exemplo de configuração de regra de iptables para permitir comunicação entre redes:

1
sudo iptables -A FORWARD -i br0 -o br1 -j ACCEPT

Esse comando permite o roteamento de pacotes entre a interface br0 (rede bridge de um grupo de containers) e br1 (rede bridge de outro grupo de containers).

Alternativa: Usar um proxy reverso como o NGINX para rotear o tráfego entre redes Docker.

Isolamento de Rede e Segurança

O isolamento entre redes no Docker é uma importante prática de segurança, especialmente em ambientes multi-tenant ou quando diferentes partes da sua aplicação (frontend, backend, banco de dados) estão rodando em containers separados. Para garantir que o tráfego indesejado não cruze as redes, considere usar firewalls internos e políticas de rede rigorosas.

Sugestão de prática:

  • Criação de redes customizadas por microserviço: isole diferentes partes da aplicação, limitando o tráfego de rede entre elas, e configure proxies ou firewalls para controlar o acesso.

Antes da introdução de redes customizadas, o Docker usava uma funcionalidade chamada --link para conectar containers, permitindo a comunicação entre eles sem precisar de uma rede dedicada. Embora o uso de links tenha sido gradualmente substituído pelas redes modernas do Docker, eles ainda podem ser úteis em ambientes legados.

O comando --link permite conectar um container a outro, simplificando a comunicação entre eles sem a necessidade de criar uma rede específica.

Exemplo:

1
2
docker run -dit --name meu-banco mysql
docker run -dit --name minha-app --link meu-banco:mysql-app nginx

Neste exemplo, o container minha-app pode se comunicar com o container meu-banco usando o alias mysql-app para resolver o nome do serviço de banco de dados.

  • Alias de link: O segundo container (minha-app) acessa o primeiro container (meu-banco) usando o nome ou alias definido no comando --link.
  • Comando descontinuado: Embora funcional, o uso de --link é desencorajado (deprecated) e substituído pelo uso de redes customizadas, que oferecem mais flexibilidade e controle.

Com o avanço do Docker, as redes customizadas substituíram os links como a forma preferida de conectar containers. As redes oferecem isolamento, controle de IPs, e permitem que containers em diferentes hosts ou redes overlay se comuniquem facilmente.

  • Redes customizadas:
    1
    2
    3
    
    docker network create minha-rede
    docker run -dit --name container1 --network minha-rede nginx
    docker run -dit --name container2 --network minha-rede mysql
    

Parte 4: Integração do Docker com iptables

O Docker gerencia automaticamente o tráfego de rede dos containers utilizando o iptables, uma ferramenta poderosa do Linux para controle de tráfego de pacotes. Ele cria regras no iptables para permitir a comunicação entre containers e também para controlar o tráfego de entrada e saída dos containers para redes externas.

Como o Docker Configura o iptables

Quando você inicia o Docker e cria redes ou containers, o Docker automaticamente configura regras no iptables para facilitar a comunicação entre os containers e o mundo externo. Isso inclui configurar regras de NAT para containers, redirecionamento de portas e roteamento.

Principais Canais e Regras Afectadas:
  • Cadeia DOCKER: Usada para gerenciar o redirecionamento de portas e o controle de acesso aos containers.
  • Cadeia FORWARD: Utilizada para rotear pacotes entre redes diferentes ou entre containers e redes externas.
  • Regras de NAT: Para fazer com que o tráfego de saída dos containers seja traduzido para o IP do host.
Exemplo de Regras de iptables Automáticas:
  1. Redirecionamento de Portas (Port Forwarding): Quando você redireciona uma porta do host para um container, o Docker cria automaticamente uma regra no iptables para rotear o tráfego.

    Exemplo:

    1
    
    docker run -dit -p 8080:80 nginx
    

    Regra criada no iptables:

    1
    
    iptables -t nat -A DOCKER -p tcp --dport 8080 -j DNAT --to-destination 172.17.0.2:80
    

    Aqui, o tráfego que chega à porta 8080 do host é redirecionado para a porta 80 do container com IP 172.17.0.2.

  2. Mascaramento de Endereços (MASQUERADE): O Docker também configura regras de mascaramento para permitir que containers utilizem o IP do host ao se comunicar com redes externas.

    Exemplo:

    1
    
    iptables -t nat -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
    

    Isso garante que o tráfego de saída de containers na rede bridge seja mascarado pelo IP do host, permitindo que os containers tenham conectividade com o mundo externo.

Gerenciamento Manual de Regras do iptables

Embora o Docker configure automaticamente o iptables, você pode desativar esse comportamento para gerenciar as regras manualmente. Isso pode ser necessário em ambientes onde políticas de segurança estritas exigem controle manual sobre o tráfego.

Desativar o Gerenciamento Automático do iptables:

Para desativar o gerenciamento automático do iptables pelo Docker, você deve editar o arquivo de configuração do daemon (/etc/docker/daemon.json) e adicionar o seguinte:

1
2
3
{
  "iptables": false
}

Após fazer essa alteração, reinicie o serviço Docker:

1
sudo systemctl restart docker

Agora, o Docker não alterará automaticamente o iptables e você precisará configurar as regras manualmente.

Inspecionar as Regras do iptables Criadas pelo Docker:

Para inspecionar as regras de rede configuradas pelo Docker, você pode usar o comando:

1
sudo iptables -t nat -L -n -v

Isso listará as regras de NAT criadas, como redirecionamento de portas e mascaramento de endereços.

Impacto na Segurança e no Isolamento de Containers

O uso do iptables no Docker oferece grande flexibilidade, mas também pode introduzir riscos de segurança se não for bem monitorado. Como o Docker cria e remove regras automaticamente, é importante revisar e auditar regularmente essas regras para garantir que estão alinhadas com as políticas de segurança da sua infraestrutura.

Pontos de Atenção:

  • Regras de NAT: Revisar frequentemente as regras de NAT e redirecionamento de portas, especialmente em ambientes de produção.
  • Exposição de Portas: Evitar expor portas de containers ao público, a menos que seja estritamente necessário.
  • Firewalls externos: Complementar a segurança com firewalls externos ou políticas de rede adicionais.

Gerenciamento de Portas no Docker

O gerenciamento de portas é essencial para expor os serviços em execução dentro dos containers para o mundo externo. O Docker permite o mapeamento de portas do host para o container, controlando a acessibilidade externa dos serviços.

Redirecionamento de Portas (Port Mapping)

O redirecionamento de portas é feito com a opção -p ou --publish no comando docker run. Isso conecta uma porta específica do host a uma porta do container.

Exemplo:

1
docker run -dit -p 8080:80 nginx

Nesse exemplo, a porta 8080 do host é mapeada para a porta 80 do container que está executando o NGINX.

  • -p [host_port]:[container_port]: Mapeia a porta do host para a porta do container.
  • Expor múltiplas portas:

    1
    
    docker run -dit -p 8080:80 -p 443:443 nginx
    

Você pode expor múltiplas portas, como no exemplo acima, onde as portas HTTP (80) e HTTPS (443) são mapeadas para o host.

Considerações de Segurança

Ao expor portas de containers, é importante seguir boas práticas de segurança:

  • Expor apenas as portas necessárias: Minimize a superfície de ataque, evitando expor portas que não precisam de acesso externo.
  • Usar firewalls: Complementar com ferramentas como ufw ou firewalld para limitar o acesso às portas expostas.

Parte 5: Como Alterar a Rede Padrão do Docker

Por padrão, o Docker cria uma rede bridge chamada bridge com uma faixa de endereços IP pré-configurada. Em alguns casos, você pode querer alterar essa rede padrão, seja para evitar conflitos de IPs, seja para usar um range de endereços específico. O Docker permite configurar pools de endereços IPv4 e IPv6, definindo novos parâmetros para redes criadas automaticamente.

Alterando a Rede Bridge Padrão

1. Definindo Pools de Endereços Customizados

Para alterar a rede padrão do Docker, você precisa modificar o arquivo de configuração do daemon Docker (/etc/docker/daemon.json). Nesse arquivo, você pode definir um pool de endereços IP customizados que serão usados ao criar redes.

Exemplo de configuração de pools de endereços:

  1. Edite o arquivo /etc/docker/daemon.json:

    1
    
    sudo nano /etc/docker/daemon.json
    
  2. Adicione a seguinte configuração:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    {
      "default-address-pools": [
        {
          "base": "192.168.1.0/16",
          "size": 24
        },
        {
          "base": "fd00::/56",
          "size": 64
        }
      ]
    }
    
  • base: Define a base do pool de endereços. No exemplo, usamos 192.168.1.0/16 para IPv4 e fd00::/56 para IPv6.
  • size: Determina o tamanho do subnet que será alocado para cada rede criada. Neste exemplo, cada nova rede terá um tamanho de /24 para IPv4 e /64 para IPv6.
2. Reinicie o Docker

Após modificar o arquivo daemon.json, reinicie o serviço Docker para aplicar as mudanças:

1
sudo systemctl restart docker
3. Verificar a Configuração

Após reiniciar, todas as novas redes criadas pelo Docker usarão os novos pools de endereços. Para verificar, crie uma nova rede e inspecione seus detalhes:

1
2
docker network create minha-nova-rede
docker network inspect minha-nova-rede

A saída deve mostrar que a rede foi criada com um subnet dentro dos ranges definidos.


Parte 6: Configuração do Suporte a IPv6 no Docker

Por padrão, o Docker usa apenas endereços IPv4 para seus containers e redes. Entretanto, muitas aplicações e ambientes modernos precisam de suporte a IPv6 para conectividade futura ou compatibilidade com redes mais recentes. O Docker oferece suporte a IPv6, mas ele deve ser habilitado explicitamente.

Passos para Configurar IPv6 no Docker

1. Ativar o Suporte a IPv6 no Docker

A configuração de IPv6 no Docker é feita no arquivo de configuração daemon.json. Para ativar o IPv6 e definir um range de endereços específicos para ele, siga estes passos:

  1. Edite o arquivo /etc/docker/daemon.json:

    1
    
    sudo nano /etc/docker/daemon.json
    
  2. Adicione as seguintes configurações:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    {
      "ipv6": true,
      "ip6tables": true,
      "experimental": true,
      "fixed-cidr-v6": "fd00::/64",
      "default-address-pools": [
        {
          "base": "192.168.0.0/16",
          "size": 24
        },
        {
          "base": "fd00::/56",
          "size": 64
        }
      ]
    }
    
    • ipv6: Ativa o suporte a IPv6 no Docker.
    • ip6tables: Habilita o uso de ip6tables para gerenciar as regras de tráfego IPv6, similar ao iptables para IPv4.
    • experimental: Habilita recursos experimentais no Docker, que podem incluir funcionalidades avançadas de IPv6.
    • fixed-cidr-v6: Define o range de endereços IPv6 a ser usado pelo Docker. Aqui usamos fd00::/64.
2. Reinicie o Docker

Após salvar o arquivo de configuração, reinicie o Docker para que as alterações entrem em vigor:

1
sudo systemctl restart docker

Agora, o Docker estará configurado para suportar IPv6, e novas redes criadas automaticamente poderão usar endereços IPv6.

3. Criar uma Rede com Suporte a IPv6

Após ativar o suporte a IPv6, você pode criar redes que utilizam ambos os protocolos, IPv4 e IPv6, e conectar containers a essas redes.

Exemplo de criação de uma rede dual stack (IPv4 e IPv6):

1
2
3
4
5
6
7
docker network create \
  --subnet="192.168.1.0/24" \
  --gateway="192.168.1.1" \
  --subnet="fd00:0:0:1::/64" \
  --gateway="fd00:0:0:1::1" \
  --ipv6 \
  ipv6-dualstack-network

Neste exemplo, a rede ipv6-dualstack-network foi criada com suporte a ambos os protocolos, com subnets e gateways definidos para IPv4 e IPv6.

4. Executar Containers em Redes com IPv6

Agora, você pode iniciar containers que usarão tanto IPv4 quanto IPv6:

1
docker run -dit --name meu-container --network ipv6-dualstack-network nginx

Esse comando inicia um container chamado meu-container na rede ipv6-dualstack-network. O container terá endereços IPv4 e IPv6 atribuídos.

5. Verificar a Configuração de IPv6 no Container

Você pode inspecionar os detalhes de rede de um container para verificar os endereços IPv6 atribuídos:

1
docker inspect meu-container

Na saída, você verá algo como:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
"NetworkSettings": {
    "Networks": {
        "ipv6-dualstack-network": {
            "IPAMConfig": {},
            "Links": null,
            "Aliases": null,
            "NetworkID": "3f23e9e128b4",
            "EndpointID": "74b255d94e3d",
            "Gateway": "192.168.1.1",
            "IPAddress": "192.168.1.2",
            "IPPrefixLen": 24,
            "IPv6Gateway": "fd00:0:0:1::1",
            "GlobalIPv6Address": "fd00:0:0:1::2",
            "GlobalIPv6PrefixLen": 64,
            "MacAddress": "02:42:c0:a8:01:02",
            "DriverOpts": null
        }
    }
}

Aqui, o container recebeu tanto um endereço IPv4 (192.168.1.2) quanto um endereço IPv6 (fd00:0:0:1::2).


Conclusão

Com esses passos, você aprendeu a alterar a rede padrão do Docker configurando pools de endereços IPv4 e IPv6, e também a habilitar e configurar suporte a IPv6 no Docker. Isso garante que seus containers estejam prontos para operar em ambientes com ambas as versões de IP.


Parte 7: Drivers de Rede no Docker

Os drivers de rede no Docker controlam o comportamento das redes que você cria e como os containers interagem com elas. Cada driver oferece características diferentes para atender a casos de uso específicos, desde o isolamento simples até redes complexas distribuídas.

Principais Drivers de Rede no Docker

  1. Bridge (Padrão):
    • Definição: O driver bridge é o mais comum e utilizado por padrão no Docker. Ele cria uma rede local no host Docker que permite que os containers se comuniquem entre si.
    • Uso Comum: Utilizado em ambientes isolados, como desenvolvimento local, onde containers precisam se comunicar entre si sem interagir diretamente com redes externas.
    • Comando de criação:
      1
      
      docker network create --driver bridge minha-bridge
      
  2. Host:
    • Definição: Com o driver host, o container compartilha a pilha de rede do host, ou seja, não existe um namespace de rede separado. Isso elimina a sobrecarga de NAT, permitindo uma comunicação direta com a rede externa.
    • Uso Comum: Usado em situações que exigem alto desempenho de rede ou acesso direto à interface de rede do host. No entanto, o isolamento de rede é reduzido, pois o container não possui uma pilha de rede isolada.
    • Comando de execução:
      1
      
      docker run -dit --network host nginx
      
  3. Overlay:
    • Definição: O driver overlay é usado principalmente em ambientes distribuídos, como clusters Docker Swarm ou Kubernetes. Ele conecta containers em diferentes hosts por meio de uma rede virtual distribuída, permitindo comunicação segura entre os hosts.
    • Uso Comum: Ideal para clusters onde os containers precisam se comunicar em hosts diferentes. O driver overlay cria uma rede que abrange vários nós, sem a necessidade de roteamento manual.
    • Comando de criação:
      1
      
      docker network create --driver overlay minha-overlay
      
  4. Macvlan:
    • Definição: O driver macvlan permite que você atribua diretamente um endereço MAC e um IP ao container, fazendo com que ele apareça como um dispositivo real na rede física.
    • Uso Comum: Usado quando você deseja que containers se comportem como dispositivos físicos na rede local, ou quando o isolamento de IP é importante. É comum em ambientes que exigem que containers tenham endereços IP visíveis pela rede externa.
    • Comando de criação:
      1
      2
      3
      4
      5
      6
      
      docker network create \
        --driver macvlan \
        --subnet 192.168.1.0/24 \
        --gateway 192.168.1.1 \
        --ip-range 192.168.1.100/28 \
        minha-rede-macvlan
      
  5. None:
    • Definição: O driver none desativa completamente a rede do container. O container não tem acesso a qualquer rede, e é totalmente isolado do ponto de vista de comunicação externa.
    • Uso Comum: Ideal para casos onde o container deve ser completamente isolado em termos de rede, ou quando a comunicação ocorre apenas por volumes ou processos internos.
    • Comando de execução:
      1
      
      docker run -dit --network none nginx
      

Uso de Drivers em Diferentes Contextos

  • Bridge e Host são usados amplamente em ambientes de desenvolvimento e produção local.
  • Overlay é essencial para arquiteturas de microserviços distribuídas, como em Kubernetes ou Docker Swarm.
  • Macvlan é útil em cenários onde a visibilidade de IP e MAC é importante, como em redes corporativas que requerem um nível mais alto de controle sobre os dispositivos conectados.

Parte 8: Práticas Recomendadas de Segurança para Redes no Docker

A segurança das redes Docker é uma preocupação essencial, especialmente quando se trata de aplicações em produção ou em ambientes distribuídos, como clusters. O Docker oferece diversas ferramentas e mecanismos que podem ser usados para melhorar a segurança do tráfego de rede entre containers.

Práticas de Segurança para Redes Docker

  1. Utilize Redes Customizadas:
    • Criar redes customizadas para diferentes serviços é uma boa prática para segmentar o tráfego entre containers. Isso reduz o risco de vazamento de informações ou acesso não autorizado entre containers.
    • Exemplo: Crie redes separadas para o frontend e o backend, garantindo que apenas serviços específicos possam se comunicar diretamente.
      1
      2
      
      docker network create frontend-network
      docker network create backend-network
      
  2. Evite Expor Portas Desnecessárias:
    • Ao expor portas de containers para o mundo externo (usando -p), você aumenta a superfície de ataque. Exponha apenas as portas que são estritamente necessárias para o funcionamento da aplicação.
    • Exemplo:
      1
      
      docker run -dit -p 80:80 nginx
      

      Neste caso, apenas a porta 80 foi exposta. Evite expor portas administrativas, como 22 ou 3306, diretamente para a internet.

  3. Implemente Políticas de Firewall:
    • Complementar as regras de rede do Docker com firewalls externos é uma prática recomendada. O uso de ferramentas como ufw ou firewalld pode restringir o acesso a portas e redes específicas.
    • Exemplo com ufw:
      1
      
      sudo ufw allow from 192.168.1.0/24 to any port 8080
      
  4. Monitore e Audite Regras de iptables:
    • Como o Docker gerencia as regras do iptables automaticamente, é importante monitorá-las regularmente para garantir que as regras criadas correspondem às políticas de segurança da organização.
    • Comando para verificar regras de iptables:
      1
      
      sudo iptables -L -n -v
      
  5. Use Drivers de Rede Adequados ao Caso de Uso:
    • Escolher o driver de rede correto pode impactar diretamente a segurança. Por exemplo, o driver macvlan pode ser útil para isolar containers em redes físicas, enquanto o driver none pode ser usado para containers que precisam ser completamente isolados.
  6. Limite o Tráfego com Ferramentas de Controle de Acesso:
    • Ferramentas como Docker Compose ou Docker Swarm podem ser usadas para definir políticas de controle de acesso, limitando quais serviços podem se comunicar entre si.
    • Exemplo em Docker Compose:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      
      version: '3'
      services:
        app:
          image: myapp
          networks:
            - frontend
        db:
          image: mysql
          networks:
            - backend
      networks:
        frontend:
        backend:
      
  7. Ative o Suporte a TLS:
    • Use TLS (Transport Layer Security) para garantir que a comunicação entre o Docker daemon e os containers seja criptografada. Isso evita ataques de interceptação e garante que o tráfego entre os containers seja seguro.
  8. Isolamento de Redes entre Ambientes de Produção e Desenvolvimento:
    • Sempre mantenha redes de produção separadas das redes de desenvolvimento. Isso evita que dados sensíveis de produção sejam acessados inadvertidamente em ambientes menos seguros.

Conclusão

Com essas práticas recomendadas de segurança, você pode garantir que suas redes Docker sejam segmentadas, monitoradas e protegidas adequadamente. O uso correto de drivers de rede e o controle rigoroso sobre o tráfego entre containers e o mundo externo são fundamentais para manter um ambiente seguro e eficiente.


Parte 9: Resolução de Problemas (Troubleshooting) no Docker

A configuração e o gerenciamento de redes no Docker podem apresentar uma série de desafios. Problemas podem surgir ao tentar conectar containers, redirecionar portas, ou ao configurar suporte a IPv6. Nesta seção, vamos revisar os erros mais comuns e como corrigi-los.

1. Problemas com Redes Docker

1.1 Containers Não Conseguem se Comunicar Entre Si

Sintoma: Containers que estão na mesma rede Docker (como uma rede bridge) não conseguem se comunicar, mesmo estando na mesma rede.

Causas Comuns:

  • O container pode não estar corretamente conectado à rede.
  • O firewall (iptables) pode estar bloqueando o tráfego entre containers.
  • Problemas de resolução de DNS interna no Docker.

Soluções:

  • Verifique se os containers estão na mesma rede usando o comando docker network inspect:

    1
    
    docker network inspect <nome_da_rede>
    

    Isso mostrará todos os containers conectados a essa rede, permitindo identificar possíveis problemas.

  • Se o tráfego estiver bloqueado, verifique as regras de iptables no host:

    1
    
    sudo iptables -L -n -v
    
  • Caso o problema seja DNS, certifique-se de que o Docker está configurado para resolver corretamente os nomes dos containers. Utilize docker run --dns para especificar um servidor DNS, se necessário.


1.2 Falha ao Criar Redes Customizadas com Subnets Específicas

Sintoma: O Docker falha ao criar uma rede com uma subnet personalizada.

Mensagem de Erro:

1
Error response from daemon: Pool overlaps with other one on this address space

Causa Comum: O range de IP que você está tentando usar para criar a rede entra em conflito com uma subnet já existente.

Soluções:

  • Liste as redes existentes e seus ranges de IP com:

    1
    2
    
    docker network ls
    docker network inspect <nome_da_rede>
    
  • Se houver um conflito de IP, escolha outro range de endereços para a nova rede.


2. Problemas com iptables no Docker

2.1 Redirecionamento de Portas Não Funciona

Sintoma: Mesmo após redirecionar uma porta (usando -p), o tráfego externo não chega ao container.

Causas Comuns:

  • O Docker pode não ter configurado corretamente as regras de redirecionamento de portas no iptables.
  • O firewall do host pode estar bloqueando o tráfego.

Soluções:

  • Verifique as regras de NAT do iptables para garantir que o redirecionamento foi aplicado corretamente:

    1
    
    sudo iptables -t nat -L -n -v
    

    Você deve ver uma regra redirecionando a porta do host para a porta do container.

  • Se as regras não forem encontradas, reinicie o serviço Docker:

    1
    
    sudo systemctl restart docker
    
  • Verifique o status do firewall do host e permita o tráfego nas portas necessárias. Exemplo com ufw:

    1
    
    sudo ufw allow 8080/tcp
    

2.2 Problemas ao Desativar o Gerenciamento Automático do iptables

Sintoma: Após desativar a manipulação do iptables pelo Docker (via "iptables": false no daemon.json), os containers não conseguem acessar redes externas.

Causa Comum: O Docker não está configurando as regras de NAT automaticamente, então o tráfego de saída dos containers não está sendo roteado para a rede externa.

Solução:

  • Se você desativou o iptables no Docker, precisará configurar manualmente as regras de NAT para que os containers possam acessar a rede externa. Um exemplo de regra de mascaramento (NAT):

    1
    
    sudo iptables -t nat -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
    

    Essa regra faz com que o tráfego de saída dos containers na rede docker0 seja mascarado com o IP do host.


3. Problemas com Rede Padrão do Docker

3.1 Containers Usam o Range de IP Incorreto

Sintoma: Containers estão recebendo endereços IP de um range indesejado, mesmo após modificar o arquivo daemon.json para configurar um novo pool de endereços.

Causas Comuns:

  • O arquivo de configuração daemon.json pode não ter sido aplicado corretamente.
  • O Docker pode não ter sido reiniciado após a alteração no arquivo.

Soluções:

  • Verifique se a sintaxe do arquivo daemon.json está correta. Um exemplo básico de configuração:

    1
    2
    3
    4
    5
    6
    7
    8
    
    {
      "default-address-pools": [
        {
          "base": "192.168.1.0/16",
          "size": 24
        }
      ]
    }
    
  • Reinicie o Docker para aplicar as alterações:

    1
    
    sudo systemctl restart docker
    
  • Verifique a rede bridge padrão para garantir que os novos ranges de IP estão sendo usados:

    1
    
    docker network inspect bridge
    

4. Problemas com IPv6 no Docker

4.1 IPv6 Não Funciona Mesmo Após Configuração

Sintoma: Containers não recebem endereços IPv6, mesmo após configurar o suporte a IPv6 no arquivo daemon.json.

Causas Comuns:

  • O suporte a IPv6 pode não estar ativado corretamente no Docker.
  • O range de endereços IPv6 configurado pode estar incorreto ou indisponível.

Soluções:

  • Verifique se o IPv6 está habilitado no arquivo daemon.json:

    1
    2
    3
    4
    
    {
      "ipv6": true,
      "fixed-cidr-v6": "fd00::/64"
    }
    
  • Reinicie o Docker após aplicar as configurações:

    1
    
    sudo systemctl restart docker
    
  • Crie uma rede com suporte a IPv6:

    1
    
    docker network create --ipv6 --subnet="fd00::/64" minha-rede-ipv6
    
  • Verifique se o container recebeu um endereço IPv6:

    1
    
    docker inspect <container_id> | grep "GlobalIPv6Address"
    

4.2 Problemas com ip6tables

Sintoma: Mesmo com o IPv6 ativado, não é possível acessar o container via IPv6.

Causas Comuns:

  • As regras de ip6tables podem estar bloqueando o tráfego IPv6.

Soluções:

  • Verifique as regras de ip6tables no host para garantir que o tráfego IPv6 está permitido:

    1
    
    sudo ip6tables -L -n -v
    
  • Adicione regras de ip6tables para permitir o tráfego IPv6 entre o host e os containers, se necessário:

    1
    
    sudo ip6tables -A FORWARD -s fd00::/64 -j ACCEPT
    

Conclusão

Esta seção de troubleshooting abordou problemas comuns ao gerenciar redes no Docker, desde falhas de comunicação entre containers até problemas com iptables e suporte a IPv6. Seguir essas dicas de solução de problemas deve ajudar a resolver a maioria dos erros relacionados ao gerenciamento de redes no Docker, garantindo que seus containers e redes operem de maneira segura e eficiente.

This post is licensed under CC BY 4.0 by the author.