← Vissza a bloghoz Útmutató

Adattárolás Dockerben: volume-ok és bind mountok

A konténerek alapból mulandók — de az adataidnak nem kell elveszniük. Megtanulod a named volume-ok, a bind mountok és a tmpfs különbségét, gyakorlati példákkal.

Van egy klasszikus rémálom, amit minden Docker-kezdő átél legalább egyszer: gondosan feltöltöd az adatbázist, kísérletezel, majd kiadsz egy docker rm-et — és az összes adatod köddé válik. A konténerek ugyanis alapból mulandók (ephemeral): amikor törlöd a konténert, a benne tárolt adatok is eltűnnek. De ez nem azt jelenti, hogy a Dockerben ne lehetne tartós adatot tárolni. Épp ellenkezőleg: a Docker három különböző mechanizmust kínál erre. Ebben a cikkben végigvesszük a named volume-okat, a bind mountokat és a tmpfs-t, gyakorlati példákkal.

Miért mulandó a konténer filerendszere?

Ahhoz, hogy megértsd a megoldást, először a problémát kell látnod. Ahogy korábban a Docker image-ek és rétegek cikkben láthattad, egy konténer az image csak olvasható rétegei fölé kap egy vékony, írható réteget. Minden, amit a futó konténer ír — naplók, ideiglenes fájlok, adatbázis-fájlok — ebbe a felső rétegbe kerül.

A baj az, hogy ez az írható réteg a konténer életciklusához van kötve. Amint törlöd a konténert (docker rm), ez a réteg is megsemmisül, és vele az összes adat. Ezért nem szabad fontos adatot közvetlenül a konténer filerendszerében tárolni. A megoldás az, hogy az adatot kivisszük a konténerből — pontosan ezt teszik a volume-ok és a mountok.

A három tárolási mód

A Docker három fő mechanizmust kínál arra, hogy adatot tárolj a konténer írható rétegén kívül:

TípusHol tárolódikTipikus használat
Named volumeA Docker kezeli (/var/lib/docker/volumes/)Adatbázisok, tartós alkalmazás-adat
Bind mountA hoszt egy tetszőleges könyvtárábanForráskód fejlesztéskor, konfig-fájlok
tmpfsA memóriában (RAM), sosem a lemezenÉrzékeny ideiglenes adat, titkok

Nézzük meg mindhármat részletesen.

Named volume-ok

A named volume a Docker által teljes mértékben kezelt tárolóterület. A Docker dönti el, hova kerül a lemezen, neked csak egy nevet kell adnod. Ez az ajánlott megoldás a legtöbb tartós adat — különösen az adatbázisok — tárolására.

Volume létrehozása, listázása és vizsgálata:

docker volume create app-data
docker volume ls
docker volume inspect app-data

Egy volume eltávolítása (csak ha nem használja konténer):

docker volume rm app-data

💡 Tipp: A named volume-okat nem kell előre létrehoznod. Ha a docker run parancsban olyan volume-nevet adsz meg, ami még nem létezik, a Docker automatikusan létrehozza neked.

Bind mountok

A bind mount a hoszt gép egy konkrét könyvtárát vagy fájlját csatolja be a konténerbe. Te adod meg a pontos hoszt-elérési utat, és a konténer közvetlenül a hoszt fájljait látja. Ez ideális fejlesztés közben, amikor a forráskódodat akarod élőben tükrözni a konténerbe, vagy amikor egy konfigurációs fájlt akarsz beadni.

A bind mount kockázata, hogy szorosan a hoszt könyvtárszerkezetéhez köti a konténert, és könnyű véletlenül felülírni a konténer fájljait. Ezért production adattárolásra inkább a named volume-ot ajánljuk.

tmpfs

A tmpfs mount a konténer egy könyvtárát a hoszt memóriájában (RAM) tárolja, sosem írja lemezre. Amint a konténer leáll, az adat nyomtalanul eltűnik. Ez akkor hasznos, ha érzékeny ideiglenes adatot (pl. titkokat, munkamenet-cache-t) szeretnél tárolni, amit nem akarsz lemezen látni.

A -v és a --mount szintaxis

Két módon csatolhatsz tárolót egy konténerhez. A régebbi, tömör -v (vagy --volume) és az újabb, bőbeszédűbb, de olvashatóbb --mount.

Named volume csatolása a -v szintaxissal:

docker run -d \
  -v app-data:/var/lib/postgresql/data \
  postgres:16-alpine

Ugyanez a --mount szintaxissal — itt explicit kulcs-érték párokkal adod meg a típust, forrást és célt:

docker run -d \
  --mount type=volume,source=app-data,target=/var/lib/postgresql/data \
  postgres:16-alpine

Egy bind mount (figyeld meg az abszolút hoszt-utat):

docker run -d \
  --mount type=bind,source="$(pwd)"/src,target=/app/src \
  node:20-alpine

Egy tmpfs mount:

docker run -d \
  --mount type=tmpfs,target=/app/tmp \
  node:20-alpine

⚠️ Figyelem: A -v szintaxisnál a bind mount forrásának abszolút útnak kell lennie. A --mount ebben szigorúbb és informatívabb a hibákról, ezért újabb szkriptekben gyakran ezt ajánlják — de mindkettő helyes és működik.

Egy adatbázis adatainak megőrzése

Lássuk a gyakorlatban, miért életbevágó ez. Indítsunk egy PostgreSQL-t named volume-mal:

docker run -d --name db \
  -e POSTGRES_PASSWORD=secret \
  -v pg-data:/var/lib/postgresql/data \
  postgres:16-alpine

Most töltsd fel adattal, majd nyugodtan állítsd le és töröld a konténert:

docker stop db
docker rm db

Ha újra elindítod ugyanazzal a volume-mal, az adataid mind ott lesznek — a pg-data volume túlélte a konténer törlését:

docker run -d --name db \
  -e POSTGRES_PASSWORD=secret \
  -v pg-data:/var/lib/postgresql/data \
  postgres:16-alpine

Ha Compose-zal dolgozol, a named volume-okat a volumes blokkban deklarálod — erről a Docker Compose bevezető cikkben olvashatsz részletesen.

Egy volume biztonsági mentése

Mivel a named volume tartalma nem közvetlenül a hoszt filerendszerében látszik, a mentéshez egy bevett trükköt használunk: indítunk egy ideiglenes segédkonténert, amely egyszerre látja a volume-ot és egy hoszt-könyvtárat, majd tar-ral kimentjük az adatot.

docker run --rm \
  -v pg-data:/data:ro \
  -v "$(pwd)":/backup \
  alpine \
  tar czf /backup/pg-data-backup.tar.gz -C /data .

Ez létrehoz egy pg-data-backup.tar.gz fájlt az aktuális könyvtárban. Visszaállításhoz hasonló logikával bontod ki az archívumot egy (akár új) volume-ba:

docker run --rm \
  -v pg-data:/data \
  -v "$(pwd)":/backup \
  alpine \
  sh -c "cd /data && tar xzf /backup/pg-data-backup.tar.gz"

A --rm kapcsoló gondoskodik róla, hogy a segédkonténer a futás után automatikusan eltűnjön. A :ro a mentésnél csak olvasható módban csatolja a volume-ot, ami biztonságosabb.

Összefoglalás

A konténerek mulandók, de az adataidnak nem kell azzá válniuk. A lényeg:

  • A konténer írható rétege a konténer törlésével együtt megsemmisül — ezért visszük ki az adatot volume-okba és mountokba.
  • A named volume a Docker által kezelt, ajánlott megoldás tartós adatra (pl. adatbázisok).
  • A bind mount a hoszt egy konkrét könyvtárát csatolja — ideális fejlesztéshez és konfigokhoz.
  • A tmpfs a memóriában tárol, érzékeny ideiglenes adathoz.
  • A -v és a --mount szintaxis is használható; a volume-okat a docker volume parancscsalád kezeli.
  • Egy named volume-ot egy segéd-konténerrel és tar-ral menthetsz le.

Most rajtad a sor: indíts egy adatbázist named volume-mal, töltsd fel adattal, töröld a konténert, majd győződj meg róla, hogy az adatok túlélik! Ha még az alapokat csiszolnád, nézd meg a Kezdő lépések oldalt, vagy ismerkedj a Hogyan működik cikkel.