Volume — konteyner o'chsa ham ma'lumot qoladi
Muammodan boshlaylik
11-darsdagi 4-mashq: MySQL konteynerini o'chirib, qayta yaratdik — barcha jadvallar yo'qoldi. Production da bu falokat:
- Yangi versiyaga yangilash = konteynerni o'chirib, yangi image dan yaratish
- Server qayta ishga tushdi, konteyner qayta yaratildi
- Har safar — butun baza yo'q
Konteyner — vaqtinchalik (4-dars). Ma'lumot esa doimiy bo'lishi kerak. Ularni ajratish — volume ning vazifasi.
Volume nima
Volume — Docker boshqaradigan, konteynerdan tashqarida saqlanadigan papka. Konteyner unga ulanadi, lekin u konteynerga tegishli emas:
┌─────────────────┐
│ Konteyner v1 │──┐
└─────────────────┘ │ ┌──────────────────────┐
├─────→ │ Volume: baza-data │ ← konteyner o'chsa ham qoladi
┌─────────────────┐ │ └──────────────────────┘
│ Konteyner v2 │──┘
└─────────────────┘
Ishlatish
docker run -d --name baza \
-e MYSQL_ROOT_PASSWORD=root123 \
-e MYSQL_DATABASE=dokon \
-v baza-data:/var/lib/mysql \
-p 127.0.0.1:3306:3306 \
mysql:8.4
baza-data— volume nomi (yo'q bo'lsa — avtomatik yaratiladi)/var/lib/mysql— konteyner ichidagi yo'l, MySQL ma'lumotlarini shu yerga yozadi
| Image | Ma'lumot papkasi |
|---|---|
mysql, mariadb |
/var/lib/mysql |
postgres |
/var/lib/postgresql/data |
mongo |
/data/db |
redis |
/data |
Sinov
docker exec baza mysql -uroot -proot123 dokon -e "CREATE TABLE t (id INT); INSERT INTO t VALUES (42);"
docker rm -f baza
docker run -d --name baza -e MYSQL_ROOT_PASSWORD=root123 \
-v baza-data:/var/lib/mysql -p 127.0.0.1:3306:3306 mysql:8.4
docker exec baza mysql -uroot -proot123 dokon -e "SELECT * FROM t;"
# 42 — ma'lumot joyida
Konteyner butunlay o'chirildi va qaytadan yaratildi — ma'lumot saqlanib qoldi.
--mount sintaksisi
docker run -d --name baza \
--mount type=volume,source=baza-data,target=/var/lib/mysql \
mysql:8.4
-v bilan bir xil, lekin aniqroq va o'qishli.
Boshqarish
docker volume ls
docker volume create baza-data
docker volume inspect baza-data
docker volume rm baza-data
docker volume prune # ishlatilmayotganlar ⚠️
[{
"Name": "baza-data",
"Driver": "local",
"Mountpoint": "/var/lib/docker/volumes/baza-data/_data"
}]
Linux da — haqiqiy papka. Windows/macOS da — Docker Desktop VM ichida.
[!WARNING]
docker volume prunevadocker rm -vma'lumotni qaytarib bo'lmaydigan tarzda o'chiradi. Production da volume larni o'chirishdan oldin backup (21-dars).
Anonim volume lar
docker run -d mysql:8.4 # -v yo'q
docker volume ls
# local 3f8a9c2e1b7d4f5a... ← anonim
Image Dockerfile ida VOLUME /var/lib/mysql bor — Docker avtomatik nomsiz volume yaratadi. 11-darsdagi 4-mashq aynan shu: har yangi konteyner — yangi anonim volume, eski ma'lumot "yo'qolgandek".
Qoida: ma'lumot saqlaydigan har bir konteynerga — nomlangan volume.
Bir nechta konteyner — bitta volume
docker run -d --name yozuvchi -v umumiy:/data alpine \
sh -c "while true; do date >> /data/vaqt.txt; sleep 5; done"
docker run --rm -v umumiy:/data:ro alpine tail /data/vaqt.txt
Masalan, ilova yuklangan fayllarni yozadi, Nginx ularni beradi. :ro — faqat o'qish.
[!WARNING] Ikki baza konteyneri bitta ma'lumot volume iga yozmasin — ma'lumot buziladi.
Volume, bind mount, tmpfs
| Volume | Bind mount (20-dars) | tmpfs (21-dars) | |
|---|---|---|---|
| Qayerda | Docker boshqaradi | Kompyuterdagi aniq papka | RAM |
| Sintaksis | -v nom:/yo'l |
-v /host/yo'l:/yo'l |
--tmpfs /yo'l |
| Nima uchun | Baza, yuklangan fayllar | Kod — ishlab chiqishda | Vaqtinchalik fayllar |
-v ning chap qismi: nom — volume; yo'l — bind mount.
Nima uchun shunday?
Konteyner va ma'lumotning hayot sikllari butunlay boshqacha. Konteyner — almashtiriladigan qism: har yangilanishda, har nosozlikda qayta yaratiladi. Ma'lumot esa yillar yashashi kerak. Ularni ajratish ikkalasini erkin qiladi: konteynerni bemalol o'chirib-yaratasiz, ma'lumot esa alohida saqlanadi, backup qilinadi va himoyalanadi.
Xulosa
Eslab qoling:
- Volume — konteynerdan tashqaridagi doimiy papka
-v nom:/konteyner/yo'l— konteyner o'chsa ham ma'lumot qoladi- Har bir bazaning ma'lumot papkasi — Docker Hub sahifasida
docker volume ls / inspect / rm / prune— prune ehtiyotkorlik bilan- Doim nomlangan volume; anonim — "yo'qolgan" ma'lumot sababi
- Bitta volume — ko'p konteyner (
:ro), lekin bitta baza
Keyingi dars
20-dars: Bind mount — kodni konteynerga ulash, hot reload