feat(lab-02): complete Phase 3 - Network & VPC lab
Implement Lab 02 with Docker bridge networks simulating VPC/Subnets. Test Infrastructure (RED phase): - 6 bash test scripts for network creation, isolation, INF-02 compliance - Fail-fast orchestration with run-all-tests.sh - Quick validation script for development Documentation (Diátaxis framework): - 3 tutorials: VPC creation, container deployment, isolation verification - 4 how-to guides: create network, inspect config, test isolation, cleanup - 3 reference docs: Docker network commands, Compose syntax, VPC mapping - 1 explanation: Docker ↔ VPC parallels (PARA-01/02/03/04) Infrastructure (GREEN phase): - docker-compose.yml with VPC networks (10.0.1.0/24, 10.0.2.0/24) - 5 services: web, app, db, test-public, test-private - INF-02 compliant: 127.0.0.1 bindings only, no 0.0.0.0 - Private network with --internal flag - Multi-homed app container (public + private networks) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
306
labs/lab-02-network/tutorial/01-create-vpc-networks.md
Normal file
306
labs/lab-02-network/tutorial/01-create-vpc-networks.md
Normal file
@@ -0,0 +1,306 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user