Skip to content
VDS · Docker i kontejneri

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 -v i docker volume prune trajno 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.