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.
Podemos verificar as redes utilizando o comando:
docker network ls
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
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": {}
}
]
Fluxo de comunicação usando a Rede Virtual
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 acessalocalhost: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>
-
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
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
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
Brincando com redes utilizando distribuição alpine
Vamos montar 2 contêineres Alpine:
- Um com um servidor web (como o
nc
oubusybox
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
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
🧱 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
-
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
-
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
🔍 O que é isso?
- O Alpine é um Linux leve e vem quase sem nada instalado.
-
apk
é o gerenciador de pacotes do Alpine (como oapt
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
-
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
- 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
- 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
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
-
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!
No terminal do servidor, você verá essa mensagem sendo recebida, como:
Hello, server!
Top comments (0)