# 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 ## 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: ```bash # 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 subnet - `lab02-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: ```bash # Lista tutte le reti docker network ls | grep lab02 ``` Atteso: ``` lab02-vpc-public bridge local ``` Esegui: ```bash # Ispeziona la configurazione rete docker network inspect lab02-vpc-public ``` Atteso (output formattato): ```json { "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: ```bash # 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: ```bash # Ispeziona la rete privata docker network inspect lab02-vpc-private ``` Atteso: ```json { "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: ```bash # 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: ```bash # 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: ```bash # Crea container nella rete pubblica docker run -d --name test-web \ --network lab02-vpc-public \ nginx:alpine ``` Esegui: ```bash # 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: ```bash 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-public` creata con subnet 10.0.1.0/24 - [ ] Rete `lab02-vpc-private` creata 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](./02-deploy-containers-networks.md) imparerai a distribuire container in queste reti usando docker-compose.yml, creando un'architettura multi-tier (web pubblica, database privato). --- ## Troubleshooting **Problema: `Error: network already exists`** Soluzione: ```bash # 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: ```bash # 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: ```bash # 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