Volume — konteyner o'chsa ham ma'lumot qoladi

~12 daq · Docker · Ma'lumotlarni saqlash

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 prune va docker rm -v ma'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