Asosiy kontentga o‘tish
Innovialabs

Docker’da volume va bind mount: konteyner ma’lumotlarini saqlash

Amaliyot3 daq

Qisqacha

Konteyner qatlamiga yozilgan hamma narsa u o‘chirilganda yo‘qoladi. Ilova ma’lumotlari uchun named volume, ishlab chiqishda manba kodi uchun bind mount ishlating, bekapni esa alohida qiling va tiklashni tekshiring.

Konteynerdagi ma’lumotlar nega yo‘qoladi

Har bir konteyner obraz ustida yupqa yoziladigan qatlam oladi. Ilova ulangan xotirasiz diskka yozgan hamma narsa o‘sha yerga tushadi. Konteynerni to‘xtatish ma’lumotlarni o‘chirmaydi, lekin docker rm, Compose orqali qayta yaratish yoki obrazni yangilashda bu qatlam fayllar bilan birga yo‘qoladi.

Shuning uchun qoida oddiy: konteynerdan uzoqroq yashashi kerak bo‘lgan hamma narsa — ma’lumotlar bazalari, yuklangan fayllar, navbatlar — yoziladigan qatlamdan tashqarida saqlanadi.

Saqlashning uchta varianti

TuriMa’lumotlar qayerdaNima uchun mos
Named volumeDocker boshqaradigan hududdaMa’lumotlar bazalari, yuklamalar, prodakshn
Bind mountXostdagi aniq papkadaIshlab chiqishda manba kodi, konfiglar
tmpfsOperativ xotiradaSaqlash shart bo‘lmagan vaqtinchalik va maxfiy ma’lumotlar

Named volume

docker volume create pgdata
docker run -d --name db -v pgdata:/var/lib/postgresql/data postgres:16

Nega volume ma’lumotlar uchun standart tanlov:

  • Docker ularni o‘zi yaratadi va saqlaydi, xostdagi yo‘lni bilish shart emas.
  • Linux, macOS va Windows’da bir xil ishlaydi.
  • Agar bo‘sh volume’ni obrazda allaqachon fayllar bor papkaga ulasangiz, Docker birinchi foydalanishda ularni o‘sha yerga nusxalaydi.
  • Konteynerlar o‘rtasida oson ko‘chiriladi va ular o‘chirilgandan keyin ham saqlanadi.

Foydali buyruqlar: docker volume ls, docker volume inspect pgdata, docker volume rm pgdata. docker volume prune bilan ehtiyot bo‘ling — u foydalanilmayotgan volume’larni ma’lumotlari bilan birga o‘chiradi.

Bind mount

docker run -d -v "$(pwd)/src:/app/src" my-app

Xost papkasi konteynerga to‘g‘ridan-to‘g‘ri ulanadi: o‘zgarishlar ikkala tomonda darhol ko‘rinadi. Bu ishlab chiqish uchun qulay — kodni muharrirda tahrirlaysiz, konteynerdagi ilova o‘zgarishlarni ko‘radi.

Kamchiliklari:

  • Muayyan kompyuterning papkalar tuzilishiga bog‘liqlik.
  • Konteyner xostdagi fayllarni o‘zgartirishi yoki o‘chirishi mumkin.
  • macOS va Windows’da bind mount orqali fayl amallari sekinroq ishlashi mumkin.

Konteyner faqat o‘qiydigan konfiglar uchun :ro qo‘shing — faqat o‘qish uchun ulash.

Kirish huquqlari bilan muammolar

Eng ko‘p uchraydigan xato — Permission denied. Sababi: konteyner ichidagi jarayon bitta UIDli foydalanuvchidan ishlaydi, xostdagi fayllar esa boshqa UID’ga tegishli. Foydalanuvchi nomlari muhim emas — raqamli identifikatorlar solishtiriladi.

Qanday hal qilish mumkin:

  • Konteynerdagi jarayon UID’ini bilib oling: docker exec <container> id.
  • Xostdagi papka egasini chown orqali shu UID’ga o‘rnating.
  • Ishlab chiqishda konteynerni o‘z UID’ingiz bilan ishga tushirish mumkin: --user "$(id -u):$(id -g)".
  • O‘z Dockerfile’ingizda foydalanuvchi va ma’lumotlar papkalarini oldindan to‘g‘ri egasi bilan yarating.
  • Muammoni chmod 777 bilan hal qilmang — bu fayllarni hammaga ochib qo‘yadi.

Volume bekapini qanday qilish kerak

Universal usul — volume tarkibini xost papkasiga arxivlaydigan vaqtinchalik konteyner:

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

Yangi volume’ga tiklash:

docker run --rm \
  -v pgdata_restored:/data \
  -v "$(pwd)":/backup \
  alpine tar xzf /backup/pgdata.tar.gz -C /data

Ma’lumotlar bazalari uchun muhim: ishlayotgan baza fayllarining nusxasi nomuvofiq bo‘lib chiqishi mumkin. Ular uchun standart vositalar — pg_dump, mysqldump — yoki nusxalash vaqtida konteynerni to‘xtatish ishonchliroq. Eng asosiysi — bekapdan haqiqatan tiklash mumkinligini muntazam tekshiring.

Qanday tanlash kerak

  • Prodakshnda saqlanishi kerak bo‘lgan ma’lumotlar — named volume.
  • Lokal ishlab chiqishda kod va konfiglar — bind mount.
  • Vaqtinchalik fayllar, kesh, xotiradagi sirlar — tmpfs.
  • Konteynerning yoziladigan qatlamida muhim hech narsa bo‘lmasin.

Ko‘p beriladigan savollar

Yo‘q, oddiy docker compose down konteynerlar va tarmoqni o‘chiradi, named volume’larni esa qoldiradi. Ma’lumotlar faqat -v bayrog‘ini qo‘shsangiz yoki volume’ni qo‘lda o‘chirsangiz yo‘qoladi.

Bunda yordam beramiz

O‘zingiz shug‘ullanmasdan natija olishni istasangiz — biz har kuni shu bilan shug‘ullanamiz.

Loyihani muhokama qilish

Yana o‘qing

G‘oya yoki vazifangiz bormi? Bizga aytib bering

Ish kuni davomida javob beramiz va yechim taklif qilamiz. Konsultatsiya bepul.