Sari la conținutul principal

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​

MecanismLocația datelorCaz de utilizare
Volum Dockeradministrat de Dockerdate persistente ale bazelor de date
Bind mountcale 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.

warning

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