Documentation (6 files, 1500+ lines): Tutorials (3): - 01-deploy-rds-database.md: Deploy PostgreSQL in private network - 02-data-persistence.md: Data persistence with named volumes - 03-security-compliance.md: INF-01/02/03/04 compliance How-to Guides (1): - connect-to-postgresql.md: Connection methods Reference (1): - postgresql-commands.md: PostgreSQL command reference Explanation (1): - database-rds-parallels.md: Docker↔RDS parallels with architecture diagrams Key concepts: - PostgreSQL container → RDS Instance - Private network → VPC Private Subnet - Named volume → EBS volume - Resource limits → DB instance class Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
4.8 KiB
Tutorial: Persistenza Dati Database (EBS Volume Simulation)
In questo tutorial imparerai come i dati del database persistono oltre il ciclo di vita del container, simulando EBS volumes in AWS.
Obiettivo
Verificare che i dati del database sopravvivano al riavvio e alla rimozione del container.
Prerequisiti
- Tutorial 01 completato
- Database in esecuzione
- Dati di test creati
Passo 1: Verifica volume esistente
Verifica che il volume nominativo sia stato creato.
Esegui:
# Lista volumi Docker
docker volume ls | grep db-data
# Atteso:
# local lab05_db-data
Il volume è nominativo (local driver), quindi i dati sopravvivono.
Passo 2: Inserisci dati di test
Crea dati che persisteranno oltre il riavvio.
Esegui:
# Crea tabella con timestamp
docker exec lab05-db psql -U lab05_user -d lab05_db -c "
CREATE TABLE IF NOT EXISTS persistence_test (
id SERIAL PRIMARY KEY,
message TEXT,
created_at TIMESTAMP DEFAULT NOW()
);
"
# Inserisci dati con timestamp unico
docker exec lab05-db psql -U lab05_user -d lab05_db -c "
INSERT INTO persistence_test (message)
VALUES ('Test persistenza - $(date +%s)');
"
Passo 3: Verifica dati prima del riavvio
Esegui:
# Conta righe
docker exec lab05-db psql -U lab05_user -d lab05_db -t -c "
SELECT COUNT(*) FROM persistence_test;
"
# Salva l'ID per verifica
row_count=$(docker exec lab05-db psql -U lab05_user -d lab05_db -t -c "
SELECT COUNT(*) FROM persistence_test;" | tr -d ' ')
echo "Righe prima del riavvio: $row_count"
Passo 4: Ferma e rimuovi il container
Simula un failure del database.
Esegui:
# Ferma il container
docker-compose stop db
# Rimuovi il container (NON il volume!)
docker-compose rm -f db
# Verifica che il container sia rimosso
docker ps -a | grep lab05-db
Atteso: Nessun output (container rimosso)
Passo 5: Riavvia il database
Crea un nuovo container con lo stesso volume.
Esegui:
# Riavvia il database
docker-compose up -d db
# Attendi che sia pronto
sleep 10
# Verifica health
docker exec lab05-db pg_isready -U lab05_user
Passo 6: Verifica dati dopo riavvio
I dati devono essere ancora presenti.
Esegui:
# Conta righe dopo riavvio
new_row_count=$(docker exec lab05-db psql -U lab05_user -d lab05_db -t -c "
SELECT COUNT(*) FROM persistence_test;" | tr -d ' ')
echo "Righe dopo il riavvio: $new_row_count"
Verifica:
# Se i conti sono uguali, SUCCESSO
if [ "$row_count" = "$new_row_count" ]; then
echo "✓ DATI PERSISTITI CORRETTAMENTE"
else
echo "✗ DATI PERSI - ERRORE"
fi
Passo 7: Verifica contenuto volume
Esplora il volume per capire come PostgreSQL memorizza i dati.
Esegui:
# Trova il mount point del volume
docker inspect lab05-db --format '{{range .Mounts}}{{if eq .Destination "/var/lib/postgresql/data"}}{{.Source}}{{end}}{{end}}'
# Lista file nel volume (come root)
sudo ls -la /var/lib/docker/volumes/lab05_db-data/_data/
Struttura chiave:
base/: dati databaseglobal/: configurazione globalepg_wal/: write-ahead log
Passo 8: Test persistenza totale
Rimuovi TUTTO e ricrea da zero.
Esegui:
# Ferma e rimuovi tutto
docker-compose down -v
# Nota: -v rimuove anche i volumi! NON usare -v per preservare dati
# Riavvia
docker-compose up -d
# Verifica che i dati siano PERSI (corretto con -v)
docker exec lab05-db psql -U lab05_user -d lab05_db -c "
SELECT COUNT(*) FROM persistence_test;
"
Atteso: ERRORE (tabella non esiste) perché i dati sono stati rimossi.
Parallelismo con AWS EBS
| Locale | AWS |
|---|---|
| Named volume | EBS volume |
| Volume mount point | EBS mount point |
| Data survives container restart | Data survives instance reboot |
| Data lost with volume rm | Data lost with EBS deletion |
INF-04 Compliance Check
Verifica che la configurazione sia INF-04 compliant.
Esegui:
# Verifica volume montato
grep -A 20 "db:" docker-compose.yml | grep "/var/lib/postgresql/data"
# Verifica volume nominativo
grep "db-data:" docker-compose.yml
# Verifica driver local
grep -A 3 "volumes:" docker-compose.yml | grep -A 2 "db-data:"
Tutte le verifiche devono passare.
Troubleshooting
Dati persi dopo riavvio
# Verifica che il volume sia nominativo
docker volume inspect lab05_db-data
# Verifica montaggio corretto
docker inspect lab05-db --format '{{json .Mounts}}' | jq
Volume non trovato
# Lista tutti i volumi
docker volume ls
# Se il volume non esiste, ricrea
docker volume create lab05_db-data
Permesso negato su volume
# Verifica proprietà volume
sudo ls -la /var/lib/docker/volumes/lab05_db-data/
# PostgreSQL deve poter scrivere
sudo chown -R 999:999 /var/lib/docker/volumes/lab05_db-data/
Prossimo tutorial: Configurare security e access control.