4.3 KiB
Tutorial: Deploy Database in VPC Privata (RDS Simulation)
In questo tutorial imparerai a deployare un database PostgreSQL in una rete privata simulando RDS in AWS VPC.
Obiettivo
Deployare PostgreSQL in Docker private network che simula RDS in VPC privata AWS.
Prerequisiti
- Lab 02 (Network & VPC) completato
- Docker Engine in esecuzione
- Comandi base: docker-compose, docker ps, docker exec
Passo 1: Verifica l'ambiente
Il compose di questo lab crea da solo le reti lab05-vpc-public e lab05-vpc-private. Lab 02 resta un prerequisito concettuale, non una dipendenza runtime.
Esegui:
# Verifica servizi e reti definiti nel compose
docker compose config --services
docker compose config | grep -A 20 "networks:"
# Atteso:
# app
# db
# test-public
Passo 2: Esamina docker-compose.yml
Apri il file docker-compose.yml e osserva la configurazione del database.
Esegui:
cat docker-compose.yml | grep -A 30 "db:"
Configurazione chiave:
- image: postgres:16-alpine
- networks: solo vpc-private (nessuna rete pubblica)
- volumes: db-data per persistenza
- ports: NESSUNA porta esposta
- resources: 2 vCPU, 4GB RAM
Passo 3: Avvia il database
Deploya il database nella rete privata.
Esegui:
# Avvia i container
docker compose up -d
# Attendi che PostgreSQL sia pronto (circa 10-15 secondi)
sleep 15
# Verifica che il database sia in esecuzione
docker ps | grep lab05-db
Atteso:
lab05-db postgres:16-alpine Up 5432/tcp lab05-vpc-private
Nota: 5432/tcp significa che la porta è aperta nel container, ma NON è mappata sull'host.
Passo 4: Verifica isolamento di rete
Il database NON deve essere accessibile dall'host.
Esegui:
# Verifica NESSUNA porta mappata su host
docker port lab05-db
# Atteso: (nessun output)
Se vedi una porta mappata (es. 0.0.0.0:5432->5432/tcp), c'è un errore di configurazione.
Passo 5: Verifica healthcheck
PostgreSQL impiega qualche secondo per avviarsi.
Esegui:
# Verifica health status
docker inspect lab05-db --format '{{.State.Health.Status}}'
# Oppure usa pg_isready
docker exec lab05-db pg_isready -U lab05_user
Atteso: healthy o accepting connections
Passo 6: Connettiti al database
Puoi connetterti SOLO da container nella stessa rete privata.
Esegui da un client PostgreSQL temporaneo collegato alla rete privata:
# Connettiti da un client nella stessa rete privata
docker run --rm -it --network lab05-vpc-private \
-e PGPASSWORD=lab05_password \
postgres:16-alpine \
psql -h db -U lab05_user -d lab05_db
# Una volta connesso, esegui:
lab05_db=> SELECT version();
lab05_db=> \q
Se provi a connetterti dall'host:
# Questo FALLIRA' (corretto!)
psql -h localhost -U lab05_user -d lab05_db
# Errore: connection refused
Passo 7: Crea dati di test
Crea una tabella e inserisci dati per verificare la persistenza.
Esegui:
docker exec lab05-db psql -U lab05_user -d lab05_db -c "
CREATE TABLE test_table (
id SERIAL PRIMARY KEY,
data TEXT,
created_at TIMESTAMP DEFAULT NOW()
);
"
docker exec lab05-db psql -U lab05_user -d lab05_db -c "
INSERT INTO test_table (data) VALUES ('Test RDS simulation');
"
Verifica i dati:
docker exec lab05-db psql -U lab05_user -d lab05_db -c "
SELECT * FROM test_table;
"
Verifica Finale
Esegui lo script di verifica finale.
Esegui:
bash tests/99-final-verification.sh
Tutti i test devono PASSARE.
Parallelismo con AWS RDS
| Locale | AWS |
|---|---|
| PostgreSQL container | RDS Instance |
| Private network | VPC Private Subnet |
| Named volume | EBS volume |
| Resource limits | DB instance class |
| No host access | Security group restriction |
Troubleshooting
Database non parte
# Logs del container
docker logs lab05-db
# Verifica risorse
docker stats lab05-db
Connessione fallita
# Verifica rete
docker network inspect lab05-vpc-private
# Verifica container connessi
docker inspect lab05-db --format '{{.NetworkSettings.Networks}}'
Persi dati dopo riavvio
# Verifica volume esista
docker volume ls | grep db-data
# Verifica montaggio
docker inspect lab05-db --format '{{.Mounts}}'
Prossimo tutorial: Implementare healthchecks e dipendenze.