DEV Community

Yuri Peixinho
Yuri Peixinho

Posted on

Docker - Redes (Networks)

As redes virtuais são estruturas de redes criadas para permitir a comunicação entre contaienrs (e também containers e porta host) de forma isolada, segura e controalda. Elas são essenciais quando o usuário quer oquestrar múltiplos containers que precisam interagir entre si, como por exemplo, uma aplicação web que se conecta a um banco de dados rodando em outro container.

No tópico Criar e publicar imagem para aplicação ASP .NET Core MVC — Macoratti, temos um exemplo usando essas redes.

Redes definidas por Software (SDN) ou redes virtuais

Por padrão, o docker é disponibilizado com 3 redes que oferecem configurações específicas para gerenciar o tráfego de dados.

Image description

Podemos verificar as redes utilizando o comando:

docker network ls
Enter fullscreen mode Exit fullscreen mode

3. Rede Bridge (Padrão)

Usado para containers em um único host (máquina). O docker adiciona todos os containers a essa rede quando os cria. (Essa é a rede padrão para qualquer container, a menor que associemos explicitamente outra rede a ele)

  • Cada container recebe um IP interno
  • Contaienrs na mesma rede bridge customizada conseguem se comunicar por nome (DNS)
  • Ideal para ambientes locais de desenvolvimento

2. Rede Host

Remove a separação de rede entre o host (máquina) e o container. O container usa a rede do host diretamente.

  • Sem isolamento de rede
  • Funciona somente em Linux.

3. Rede None

A rede none é uma rede que não possui conectividade e que pode ser usada para isolar completamente os containers

Comparação rápida

Tipo de Rede Comunicação entre containers Isolamento Uso externo Host diferente
Bridge 🔁 (via NAT)
Host ❌ (todos compartilham)
None

Inspecionando a rede atual

Podemos inspecionar a nossa rede atual, utilizando o comando

docker network inspect bridge
Enter fullscreen mode Exit fullscreen mode

Dentro do terminal, podemos ver algo como:

[
    {
        "Name": "bridge",
        "Id": "66b2ad5681cbdf2b5b33658dbebc6f13bda599080017acd70bf563aa37c16ca0",
        "Created": "2025-03-16T19:28:29.898623376Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "3eba092a04b97d951b65d2e06224963be18cd1fc6aadf7097000ceee570c9304": {
                "Name": "mysql",
                "EndpointID": "9a17c4d14d164973e2fda085d95001b2e1bc314e6208efed8b9e273ee9a84784",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "**172.17.0.2**/16",
                "IPv6Address": ""
            },
            "42a00d5faafe4ba2b6e7607b096ce33b9b04c079add1b7a5e083aeed639dddc4": {
                "Name": "appmvc",
                "EndpointID": "69c9a990beb78a766c1518fdd261a9a2e70338aac910fabcc252a164424a99c9",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "**172.17.0.3**/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]
Enter fullscreen mode Exit fullscreen mode

Fluxo de comunicação usando a Rede Virtual

Image description

Passo a passo do fluxo:

1. Navegador → Aplicação MVC (contêiner)

  • O navegador faz uma requisição para a aplicação (ex: localhost:5000).
  • Como a aplicação está rodando dentro de um contêiner Docker, ela só pode ser acessada externamente se você fizer um mapeamento de porta.
  • Isso é o que significa o "Mapeamento de Porta" no desenho.

Exemplo prático:

Você roda a app com docker run -p 5000:80, e aí seu navegador acessa localhost:5000, que o Docker redireciona para a porta 80 do contêiner.

2. Aplicação MVC → MySQL Database

  • A aplicação precisa se comunicar com o banco de dados.
  • Ambos estão em contêineres diferentes, mas como estão na mesma rede Docker (nesse caso, a bridge), eles podem se enxergar usando o nome do serviço (tipo DNS interno).

3. Rede Bridge

  • O meio de comunicação entre os contêineres é a "rede bridge", que é o tipo de rede padrão do Docker.
  • Ela cria uma rede virtual isolada, onde os contêineres se comunicam sem expor portas ao host, usando apenas nomes.

Criar uma rede

Como já vimos, Por padrão, o Docker cria redes automáticas como bridge, host, e none. Porém, você pode criar redes customizadas para maior controle sobre a comunicação entre seus contêineres.

O comando básico para criar uma rede no Docker é:

docker network create <nome-da-rede>
Enter fullscreen mode Exit fullscreen mode
  • docker network create: Este comando cria uma nova rede.
  • <nome-da-rede>: Nome que você deseja dar à rede.

Usando o parâmetro -driver

O parâmetro --driver define qual tipo de driver a rede utilizará. Como já vimos também, o driver especifica como os contêineres se conectam uns aos outros e como o tráfego de rede é gerenciado.

Por padrão, se você não especificar o --driver, o Docker irá usar o driver bridge, que é o tipo mais comum e usado por redes isoladas de contêineres.

docker network create --driver <tipo-do-driver> minha-rede-alpine
Enter fullscreen mode Exit fullscreen mode

Aqui você pode substituir <tipo-do-driver> por um dos seguintes drivers, dependendo do comportamento desejado:

  • bridge: Rede isolada onde contêineres podem se comunicar entre si, mas não com o mundo externo, a menos que você configure explicitamente.
  • host: Contêineres compartilham a pilha de rede do host, ou seja, eles ficam na mesma rede que a máquina host.
  • overlay: Permite que contêineres de diferentes máquinas Docker se comuniquem, ideal para redes de múltiplos hosts em um cluster Docker.
  • none: Nenhuma rede é atribuída ao contêiner, ele não pode se comunicar com outros contêineres nem com o mundo externo.

Verificando a criação da rede

Após criar a rede, você pode verificar se ela foi criada com sucesso e qual o tipo de driver que ela usa com o comando:

docker network ls
Enter fullscreen mode Exit fullscreen mode

Esse comando exibe uma lista das redes Docker existentes, incluindo o nome da rede e o tipo de driver utilizado.

Conectando um container a uma rede

Caso existaum container existente que esteja em outra rede, como no exemplo da imagem abaixo, o container3 (alp3), que está na rede bridge e não na rede redealpine, podemos utilizar o comando:

docker network connect redealpine alp3
Enter fullscreen mode Exit fullscreen mode

Image description

Brincando com redes utilizando distribuição alpine

Vamos montar 2 contêineres Alpine:

  • Um com um servidor web (como o nc ou busybox simulando um backend)
  • Outro como cliente que se conecta a esse "servidor"

Vamos usar redes do Docker pra controlar se eles se "enxergam" ou não.

🧪 Etapa 1: Criar uma rede customizada (tipo bridge)

docker network create minha-rede-alpine
Enter fullscreen mode Exit fullscreen mode

Ao inspecionar as redes, podemos ver que agora existe uma nova rede do tipo bridge

**NETWORK ID     NAME                DRIVER    SCOPE**
66b2ad5681cb   bridge              bridge    local
ead84d2f48aa   host                host      local
**5bdf95e1ef53   minha-rede-alpine   bridge    local**
1419b512f8a2   none                null      local
Enter fullscreen mode Exit fullscreen mode

🧱 Etapa 2: Subir o container servidor

A ideia aqui é simular um servidor dentro de um contêiner. Esse "servidor" vai ficar escutando numa porta, esperando alguém se conectar a ele.

docker run -dit --name alpine-server --network minha-rede-alpine alpine sh
Enter fullscreen mode Exit fullscreen mode
  • docker run: cria e executa um contêiner.
  • d: executa em segundo plano (modo "detached").
  • i: mantém a entrada interativa (permite digitar comandos).
  • -name alpine-server: dá o nome "alpine-server" pra esse contêiner.
  • -network minha-rede-alpine: coloca o contêiner dentro da rede virtual que criamos.
  • alpine: usa a imagem Alpine Linux, que é super leve.
  • sh: abre o shell do Alpine, tipo o "terminal" do Linux.

👉 Depois disso, o contêiner está rodando e esperando você dar comandos.

2.1 Acessar o terminal do contêiner

docker exec -it alpine-server sh
Enter fullscreen mode Exit fullscreen mode
  • docker exec: executa um comando dentro de um contêiner já em execução
  • it: terminal interativo (pra você digitar coisas e ver as respostas)
  • alpine-server: nome do contêiner
  • sh: abre o terminal do Alpine

2.2. Instalar o netcat-openbsd

apk add netcat-openbsd
Enter fullscreen mode Exit fullscreen mode

🔍 O que é isso?

  • O Alpine é um Linux leve e vem quase sem nada instalado.
  • apk é o gerenciador de pacotes do Alpine (como o apt no Ubuntu).
  • netcat-openbsd é uma ferramenta que permite escutar ou enviar dados pela rede.

Netcat é tipo um "WhatsApp de terminal": ele escuta numa porta e mostra tudo que recebe.

2.3. Rodar o "servidor" com o nc (netcat)

nc -l -p 1234
Enter fullscreen mode Exit fullscreen mode
  • nc: É o netcat, o programa
  • -l: Significa "listen" (ficar escutando)
  • -p 1234: É a porta onde ele vai escutar. Pode ser qualquer número de porta (de 1024 a 65535 geralmente).

🔊 Ou seja: esse comando deixa o contêiner esperando alguém se conectar nele na porta 1234. Ele vai mostrar na tela tudo que receber.

Etapa 3: Subir o contêiner cliente

Agora, vamos criar um segundo contêiner Alpine que atuará como cliente, e ele se conectará ao servidor que acabamos de criar.

docker run -dit --name alpine-client --network minha-rede-alpine alpine s
Enter fullscreen mode Exit fullscreen mode
  • Esse comando cria e executa o contêiner cliente chamado "alpine-client", conectando-o à mesma rede minha-rede-alpine que criamos anteriormente.

3.1 Acessar o terminal do contêiner cliente

docker exec -it alpine-client sh
Enter fullscreen mode Exit fullscreen mode
  • Isso abre o terminal interativo dentro do contêiner alpine-client, onde podemos rodar os comandos necessários para simular o cliente.

3.2 Instalar o netcat-openbsd no contêiner cliente

Agora, precisamos instalar a ferramenta netcat no contêiner cliente, para ele conseguir se conectar ao servidor.

apk add netcat-openbsd
Enter fullscreen mode Exit fullscreen mode

3.3 Conectar ao servidor a partir do cliente

Dentro do contêiner cliente, vamos usar o nc (netcat) para conectar ao servidor na porta que configuramos anteriormente (porta 1234).

nc alpine-server 1234
Enter fullscreen mode Exit fullscreen mode
  • alpine-server é o nome do contêiner servidor. Como estamos na mesma rede Docker, o cliente consegue se referir ao servidor pelo nome do contêiner.
  • 1234 é a porta que o servidor está escutando.

Se tudo estiver funcionando corretamente, assim que o cliente se conectar, qualquer texto digitado no cliente será enviado para o servidor, e o servidor exibirá isso em seu terminal.

4. Teste a comunicação

Agora, no terminal do cliente, digite alguma mensagem, por exemplo:

Hello, server!
Enter fullscreen mode Exit fullscreen mode

No terminal do servidor, você verá essa mensagem sendo recebida, como:

Hello, server!
Enter fullscreen mode Exit fullscreen mode

Heroku

Amplify your impact where it matters most — building exceptional apps.

Leave the infrastructure headaches to us, while you focus on pushing boundaries, realizing your vision, and making a lasting impression on your users.

Get Started

Top comments (0)

👋 Kindness is contagious

DEV is better (more customized, reading settings like dark mode etc) when you're signed in!

Okay