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ípus | Hol tárolódik | Tipikus használat |
|---|---|---|
| Named volume | A Docker kezeli (/var/lib/docker/volumes/) | Adatbázisok, tartós alkalmazás-adat |
| Bind mount | A hoszt egy tetszőleges könyvtárában | Forráskód fejlesztéskor, konfig-fájlok |
| tmpfs | A 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 runparancsban 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
-vszintaxisnál a bind mount forrásának abszolút útnak kell lennie. A--mountebben 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--mountszintaxis is használható; a volume-okat adocker volumeparancscsalá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.