Skip to content
VDS · Docker a kontajnery

Volumes: kde vlastne žijú dáta kontajnera

Ako sa pomenovaný volume líši od bind mountu, kde všetko fyzicky leží na disku a ako nestratiť databázu pri opätovnom vytvorení kontajnera.

Aktualizované 23. augusta 2026

Kontajner je jednorazový. Všetko, čo doň zapíšeš, zmizne spolu s ním. Dáta musia žiť mimo neho a existujú presne dva spôsoby: pomenovaný zväzok a pripojenie adresára z hostiteľa.

Dva spôsoby a kedy ktorý použiť

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:

Pomenovaný zväzok vytvára a ukladá sám Docker, v /var/lib/docker/volumes/<name>/_data. Práva vnútri nastavuje automaticky obraz. Takto sa uchovávajú databázy a interný stav služieb.

Pripojenie adresára je bežná cesta na disku stroja. Takto poskytuješ konfiguračné súbory, statické súbory webu a certifikáty: pohodlne sa upravujú v editore a ukladajú do repozitára.

Príznak :ro robí pripojenie iba na čítanie. Použi ho všade, kde kontajner nepotrebuje zápis — je to lacná ochrana.

Kde je všetko fyzicky uložené

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

Posledný príkaz je prvá vec, ktorú spustíš, keď dôjde miesto na disku. Viac podrobností: miesto na disku.

docker compose down -v a docker volume prune mažú zväzky natrvalo. Zväzok s databázou vyzerá ako „nepoužívaný“, kým je kontajner zastavený, a spadne pod čistenie. Pred čistením sa pozri na zoznam: docker volume ls -f dangling=true.

Kopírovanie a migrácia

Kopírovanie pomenovaného zväzku pomocou jednorazového kontajnera:

docker run --rm -v db-data:/from -v $(pwd):/to alpine \
  tar czf /to/db-data.tar.gz -C /from .

Obnovenie:

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

Pre databázy je tento spôsob vhodný len vtedy, keď je kontajner zastavený: kopírovanie bežiacej databázy na úrovni súborov môže byť nekonzistentné. Lepšie je spraviť dump pomocou nástrojov samotnej databázy — pg_dump, mysqldump. Pozri čo presne kopírovať.

Práva

Najčastejšia chyba pri pripojeniach adresárov je nesúlad vlastníka. Vnútri kontajnera beží proces pod vlastným UID a súbor, ktorý na hostiteľovi vytvoril root, je preň neprístupný.

docker compose exec app id
sudo chown -R 1000:1000 ./data

Mnohé obrazy prijímajú premenné PUID/PGID — to je pohodlnejšie než meniť vlastníka adresára.

Časté chyby

  • Dáta sa zapisovali dovnútra kontajnera. Pri aktualizácii si kontajner znovu vytvoril — dáta zmizli. Skontroluj: docker diff <container> ukáže, čo sa v jeho súborovom systéme zmenilo; veľké zápisy tam sú varovným signálom.
  • Pripojil si adresár cez neprázdnu cestu v obraze. Obsah obrazu sa skryje a služba nenájde svoje súbory.
  • Relatívna cesta v pripojení adresára. Rozbaľuje sa z adresára obsahujúceho compose.yaml, nie z aktuálneho. Spustenie odinakiaľ vytvorí nový prázdny adresár.
  • Zabudol si na zväzky pri preinštalovaní OS. Preinštalovanie úplne vymaže disk. Kópia musí byť uložená nie na tomto stroji.