Persistența cu volume
Sistemul de fișiere read/write al unui container este legat de ciclul său de viață. Datele care trebuie să supraviețuiască recreării containerului sunt păstrate în volume sau bind mounts.
Volume și bind mounts
| Mecanism | Locația datelor | Caz de utilizare |
|---|---|---|
| Volum Docker | administrat de Docker | date persistente ale bazelor de date |
| Bind mount | cale explicită de pe gazdă | fișiere sursă sau configurații locale |
În docker-compose.yml, serviciul db montează volumul pgdata în /var/lib/postgresql/data.
Identificarea volumului
Cu serviciile pornite, rulați:
docker volume ls
Compose adaugă de obicei numele proiectului ca prefix, astfel încât volumul va apărea ca lab1_pgdata dacă repository-ul se află în directorul lab1.
docker volume inspect lab1_pgdata
Dacă numele proiectului este diferit, folosiți numele afișat de docker volume ls.
Testarea persistenței
Creați un tichet în configurația cu PostgreSQL:
curl -sS -X POST http://localhost:8080/tickets \
-H 'Content-Type: application/json' \
-d '{"title":"Persistența volumului","priority":"high","reporter":"student"}'
Confirmați că tichetul există:
curl -sS http://localhost:8080/tickets
Opriți proiectul. down șterge containerele și rețeaua proiectului, dar păstrează implicit volumul:
docker compose down
docker volume ls
Recreați serviciile și verificați datele:
docker compose up --detach
docker compose ps
curl -sS http://localhost:8080/tickets
Tichetul trebuie să fie prezent deoarece noul container PostgreSQL folosește același volum.
Ștergerea explicită a volumului
docker compose down --volumes
docker compose up --detach
docker compose ps
curl -sS http://localhost:8080/tickets
Lista trebuie să fie goală. Opțiunea --volumes șterge volumele declarate de proiect, iar PostgreSQL pornește cu un director de date nou.
Nu folosiți docker compose down --volumes într-un mediu cu date importante fără backup și confirmarea explicită a efectului.
Demonstrație scurtă de bind mount
Un bind mount poate expune directorul curent în container, read-only.
Pe Bash, WSL sau macOS:
docker run --rm --mount type=bind,source="$(pwd)",target=/work,readonly \
alpine:3.24 ls -la /work
Pe PowerShell:
docker run --rm --mount "type=bind,source=$($PWD.Path),target=/work,readonly" `
alpine:3.24 ls -la /work
Spre deosebire de un volum, calea bind mount-ului este aleasă și administrată direct pe sistemul gazdă.
Checkpoint
- recrearea containerelor nu șterge implicit un volum
docker compose down --volumesșterge intenționat volumele proiectului- volumele sunt potrivite pentru date administrate de Docker
- bind mounts leagă explicit o cale a gazdei de una din container