7.3 KiB
Tutorial: Creare Reti VPC con Docker Bridge Networks
In questo tutorial imparerai a creare reti Docker bridge che simulano le VPC (Virtual Private Cloud) e le subnet dei provider cloud. Capirai come segmentare il traffico di rete tra container usando concetti direttamente trasferibili ad AWS, Azure o GCP.
Obiettivo
Creare due reti isolate che simulano una subnet pubblica e una subnet privata in una VPC cloud:
- VPC Public Subnet:
lab02-vpc-public(10.0.1.0/24) - per servizi accessibili - VPC Private Subnet:
lab02-vpc-private(10.0.2.0/24) - isolata, senza accesso esterno
Nota pratica: il tutorial 2 usa docker compose per creare e gestire le stesse reti. Se segui questo tutorial alla lettera con docker network create, prima di avviare il compose dovrai rimuovere le reti manuali oppure dichiararle come reti esterne. Nel flusso consigliato per studenti conviene usare questo tutorial per capire i concetti e usare il compose del tutorial 2 come implementazione finale.
Prerequisiti
- Docker Engine >= 24.0 installato e in esecuzione
- Comandi base Docker (
docker run,docker ps) - Completato Lab 01: IAM & Sicurezza (raccomandato)
Passo 1: Comprendere i Concetti VPC
Prima di creare reti, capiremo cosa stiamo simulando.
Concetti Cloud:
- VPC (Virtual Private Cloud): Rete virtuale isolata nel cloud
- Subnet: Segmento di indirizzi IP all'interno di una VPC (es. 10.0.1.0/24)
- Subnet Pubblica: Subnet con route verso internet gateway
- Subnet Privata: Subnet senza accesso diretto a internet
Parallelismo Docker ↔ Cloud:
| Concetto Docker | Cloud AWS |
|---|---|
| Bridge Network | VPC |
| Subnet (10.0.x.0/24) | Subnet CIDR |
| --internal flag | Private subnet (no IGW) |
| Container | EC2 Instance |
Passo 2: Creare la Subnet Pubblica
Creiamo la prima rete che simula una subnet pubblica VPC.
Esegui:
# Crea rete public subnet con subnet custom
docker network create --driver bridge \
--subnet 10.0.1.0/24 \
--gateway 10.0.1.1 \
lab02-vpc-public
Spiegazione:
--driver bridge: Usa bridge driver (isolamento host locale)--subnet 10.0.1.0/24: CIDR block per questa subnet--gateway 10.0.1.1: Gateway predefinito per la subnetlab02-vpc-public: Nome che segue nomenclatura cloud
Atteso:
a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1v2
Passo 3: Verificare la Creazione della Rete Pubblica
Verifichiamo che la rete sia stata creata correttamente.
Esegui:
# Lista tutte le reti
docker network ls | grep lab02
Atteso:
lab02-vpc-public bridge local
Esegui:
# Ispeziona la configurazione rete
docker network inspect lab02-vpc-public
Atteso (output formattato):
{
"Name": "lab02-vpc-public",
"Driver": "bridge",
"IPAM": {
"Config": [
{
"Subnet": "10.0.1.0/24",
"Gateway": "10.0.1.1"
}
]
},
"Internal": false
}
Verifica che:
- Subnet sia
10.0.1.0/24 - Gateway sia
10.0.1.1 - Internal sia
false(pubblica)
Passo 4: Creare la Subnet Privata
Ora creiamo una rete isolata che simula una subnet privata.
Esegui:
# Crea rete private subnet (isolata)
docker network create --driver bridge \
--subnet 10.0.2.0/24 \
--gateway 10.0.2.1 \
--internal \
lab02-vpc-private
Spiegazione:
--internal: Flag critico! Isola la rete (nessun accesso esterno)- Subnet diversa:
10.0.2.0/24(nessuna sovrapposizione con pubblica) - Stesso gateway pattern:
10.0.2.1
Atteso:
f1e2d3c4b5a697886950a2b3c4d5e6f7g8h9i0j1k2l3
Passo 5: Verificare la Subnet Privata
Verifichiamo che la rete privata sia configurata correttamente.
Esegui:
# Ispeziona la rete privata
docker network inspect lab02-vpc-private
Atteso:
{
"Name": "lab02-vpc-private",
"Driver": "bridge",
"IPAM": {
"Config": [
{
"Subnet": "10.0.2.0/24",
"Gateway": "10.0.2.1"
}
]
},
"Internal": true
}
Verifica che:
- Subnet sia
10.0.2.0/24 - Gateway sia
10.0.2.1 - Internal sia
true(critico per isolamento!)
Passo 6: Verificare Entrambe le Reti
Vediamo un riepilogo di entrambe le reti create.
Esegui:
# Lista reti lab02
docker network ls --filter "name=lab02" --format "table {{.Name}}\t{{.Driver}}\t{{.Scope}}"
Atteso:
NAME DRIVER SCOPE
lab02-vpc-private bridge local
lab02-vpc-public bridge local
Esegui:
# Verifica subnet CIDR
docker network inspect lab02-vpc-public --format '{{.IPAM.Config}}'
docker network inspect lab02-vpc-private --format '{{.IPAM.Config}}'
Passo 7: Testare con un Container (Opzionale)
Verifichiamo che le reti funzionino creando un container di test.
Esegui:
# Crea container nella rete pubblica
docker run -d --name test-web \
--network lab02-vpc-public \
nginx:alpine
Esegui:
# Verifica che il container abbia IP dalla subnet corretta
docker inspect test-web --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'
Atteso:
10.0.1.2
(Indirizzo nella subnet 10.0.1.0/24 - corretto!)
Pulisci il test:
docker stop test-web
docker rm test-web
Parallelismo con AWS VPC
| Operazione Locale | AWS VPC Equivalente |
|---|---|
docker network create |
aws ec2 create-vpc |
--subnet 10.0.1.0/24 |
aws ec2 create-subnet --cidr-block |
--internal |
No route to Internet Gateway |
lab02-vpc-public |
vpc-12345678 |
| Container nella rete | EC2 instance in subnet |
Verifica
Hai completato questo tutorial quando:
- Rete
lab02-vpc-publiccreata con subnet 10.0.1.0/24 - Rete
lab02-vpc-privatecreata con subnet 10.0.2.0/24 - Rete privata ha
Internal: true - Entrambe le reti appaiono in
docker network ls - Capisci il parallelismo tra Docker bridge networks e VPC
Prossimo Passo
Nel prossimo tutorial imparerai a distribuire container in queste reti usando docker-compose.yml, creando un'architettura multi-tier (web pubblica, database privato).
Prima di passare al tutorial 2, se hai creato le reti manualmente in questo tutorial, puliscile per evitare conflitti con Compose:
docker network rm lab02-vpc-public lab02-vpc-private
Troubleshooting
Problema: Error: network already exists
Soluzione:
# Rimuovi rete esistente
docker network rm lab02-vpc-public lab02-vpc-private
# Oppure usa nomi diversi
docker network create ... lab02-vpc-public-v2
Problema: Error: subnet conflicts with existing network
Soluzione:
# Verifica subnet in uso
docker network ls -q | xargs docker network inspect --format '{{.IPAM.Config}}'
# Cambia subnet in conflitto
docker network create --subnet 10.0.10.0/24 ...
Problema: Container non ottiene IP dalla subnet corretta
Soluzione:
# Verifica configurazione IPAM
docker network inspect lab02-vpc-public --format '{{json .IPAM}}'
# Assicurati che il container sia nella rete corretta
docker inspect container --format '{{json .NetworkSettings.Networks}}'
Problema: --internal flag blocks all communication
Questo è il comportamento corretto! I container in reti private:
- NON possono raggiungere internet
- NON possono essere raggiunti dall'host
- POSONO comunicare con altri container nella stessa rete