Volumeni: gde zapravo žive podaci kontejnera
Kako se imenovani volumen razlikuje od bind mount-a, gde sve to fizički živi na disku i kako da ne izgubiš bazu podataka pri ponovnom kreiranju kontejnera.
Ažurirano 23. avgust 2026.
Kontejner je potrošan. Sve što je u njemu napisano nestaje zajedno s njim. Podaci moraju da žive izvan njega, a postoje tačno dva načina: imenovani volumen i bind mount na direktorijum hosta.
Dva načina i kada koji koristiti
services:
db:
image: postgres:17
volumes:
- db-data:/var/lib/postgresql/data # named volume
app:
image: nginx:1.27
volumes:
- ./site:/usr/share/nginx/html:ro # directory bind mount
- ./nginx.conf:/etc/nginx/nginx.conf:ro
volumes:
db-data:
Imenovani volumen kreira i čuva sam Docker, u /var/lib/docker/volumes/<name>/_data. Dozvole unutra se postavljaju automatski iz slike. Tako se čuvaju baze podataka i interno stanje servisa.
Bind mount na direktorijum je obična putanja na disku mašine. Tako obezbeđuješ konfiguracione fajlove, statične fajlove sajta i sertifikate: zgodno ih je menjati u editoru i čuvati u repozitorijumu.
Oznaka :ro čini mount samo za čitanje. Koristi je svuda gde kontejneru nije potreban pristup za pisanje — to je jeftina zaštita.
Gde se sve fizički čuva
docker volume ls
docker volume inspect db-data
docker inspect -f '{{json .Mounts}}' <container> | python3 -m json.tool
sudo du -sh /var/lib/docker/volumes/* | sort -h | tail
Poslednja komanda je prvo što treba pokrenuti kada ponestane prostora na disku. Više detalja: prostor na disku.
docker compose down -vidocker volume prunetrajno brišu volumene. Volumen sa bazom podataka izgleda kao „neiskorišćen“ dok je kontejner zaustavljen i potpada pod čišćenje. Pre čišćenja pogledaj listu:docker volume ls -f dangling=true.
Kopiranje i migracija
Kopiranje imenovanog volumena pomoću potrošnog kontejnera:
docker run --rm -v db-data:/from -v $(pwd):/to alpine \
tar czf /to/db-data.tar.gz -C /from .
Vraćanje:
docker volume create db-data
docker run --rm -v db-data:/to -v $(pwd):/from alpine \
tar xzf /from/db-data.tar.gz -C /to
Za baze podataka ovaj metod je prikladan samo kada je kontejner zaustavljen: kopija pokrenute baze na nivou fajlova može biti nedosledna. Bolje je uraditi dump pomoću alata same baze — pg_dump, mysqldump. Pogledaj šta tačno kopirati.
Dozvole
Najčešća greška sa bind mount-ovima je neslaganje vlasnika. Unutar kontejnera proces radi pod svojim UID-om, a fajl koji je host kreirao kao root njemu je nedostupan.
docker compose exec app id
sudo chown -R 1000:1000 ./data
Mnoge slike prihvataju promenljive PUID/PGID — to je zgodnije od menjanja vlasnika direktorijuma.
Česte greške
- Podaci su upisani unutar kontejnera. Ponovo si kreirao kontejner tokom ažuriranja — podaci su nestali. Provera:
docker diff <container>će pokazati šta se promenilo u njegovom fajl sistemu; veliki upisi tamo su znak za uzbunu. - Bind mount-ovao si direktorijum preko neprazne putanje u slici. Sadržaj slike je sakriven, a servis ne može da pronađe svoje fajlove.
- Relativna putanja u bind mount-u. Razrešava se iz direktorijuma koji sadrži
compose.yaml, a ne iz trenutnog. Pokretanje sa druge lokacije napraviće novi prazan direktorijum. - Volumeni su zaboravljeni pri reinstalaciji OS-a. Reinstalacija briše disk u potpunosti. Kopija mora da se čuva ne na ovoj mašini.