Files

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 database
  • global/: configurazione globale
  • pg_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.