5.1 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 lab-05-database_db-data
Il volume e nominativo (local driver), quindi i dati sopravvivono. Nel repository il nome reale include il prefisso del progetto compose: lab-05-database_db-data.
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
# Verifica health (riprova finché non è pronto)
until docker exec lab05-db pg_isready -U lab05_user 2>/dev/null; do
echo "Attendiamo che il database sia pronto..."
sleep 2
done
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 volume inspect lab-05-database_db-data --format '{{.Mountpoint}}'
# Lista file nel volume (come root)
sudo ls -la $(docker volume inspect lab-05-database_db-data --format '{{.Mountpoint}}')
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 nel container
docker inspect lab05-db --format '{{json .Mounts}}'
# Verifica volume nominativo
docker volume ls | grep db-data
Tutte le verifiche devono passare.
Troubleshooting
Dati persi dopo riavvio
# Verifica che il volume sia nominativo
docker volume inspect lab-05-database_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, ricrealo rialzando il compose
docker compose up -d
# Attendi che il database sia pronto
until docker exec lab05-db pg_isready -U lab05_user 2>/dev/null; do
echo "Attendiamo che il database sia pronto..."
sleep 2
done
Permesso negato su volume
# Verifica proprietà volume
sudo ls -la $(docker volume inspect lab-05-database_db-data --format '{{.Mountpoint}}')
# PostgreSQL deve poter scrivere
sudo chown -R 999:999 $(docker volume inspect lab-05-database_db-data --format '{{.Mountpoint}}')
Prossimo tutorial: Configurare security e access control.