8-bo‘lim

Hajmlar va ma'lumot saqlash

Nomlangan hajm, bog'lanadigan papka va tmpfs - qaysi biri qachon, hamda ular obraz mazmuniga qanday ta'sir qiladi.

🕑 15 daqiqa o‘qish 📄 652 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Nomlangan hajm
  2. Bog'lanadigan papka (bind mount)
  3. Muhim farq: bo'sh hajm va bog'lanadigan papka
  4. Faqat o'qish uchun ulash
  5. tmpfs - xotiradagi papka
  6. Hajm konteynerdan uzoq yashaydi
  7. --mount sintaksisi
  8. Tozalash
  9. Xulosa

1-bobda konteynerga yozilgan fayl u o'chirilganda yo'qolishini ko'rgan edik. Baza uchun bu falokat.

Docker uchta yechim beradi va ular bir-birini almashtirmaydi - har biri o'z vazifasi uchun.

Ma'lumotni qayerda saqlash Nomlangan hajm -v nomi:/yo'l Docker boshqaradi Konteynerdan uzoq yashaydi Ko'chirish oson Baza, yuklangan fayllar ishlab chiqarish uchun Bog'lanadigan papka -v /host/yo'l:/yo'l Siz boshqarasiz Host yo'liga bog'liq Ikki tomonlama Manba kod, sozlama ishlab chiqish uchun tmpfs --tmpfs /yo'l Faqat xotirada Diskka yozilmaydi To'xtaganda yo'qoladi Sirlar, vaqtinchalik diskda iz qoldirmaslik Konteynerning o'z yozish qatlami - to'rtinchi variant, lekin u konteyner bilan yo'qoladi va sekin ishlaydi. Saqlanishi kerak bo'lgan narsani unga yozmang.
Uchtasi uch xil vazifa uchun - biri ikkinchisini almashtirmaydi

Nomlangan hajm #

Terminal
docker volume create dokon-ma
Natija
dokon-ma

Endi uni konteynerga ulaymiz:

Terminal
docker run --rm -v dokon-ma:/ma alpine:3.21 \
    sh -c 'echo "buyurtma 1" > /ma/buyurtmalar.txt'
docker run --rm -v dokon-ma:/ma alpine:3.21 cat /ma/buyurtmalar.txt
Natija
buyurtma 1

Birinchi konteyner yozdi va o'chdi. Ikkinchisi - butunlay boshqa konteyner - o'sha faylni o'qidi.

Uchinchisi qo'shimcha yozadi:

Terminal
docker run --rm -v dokon-ma:/ma alpine:3.21 \
    sh -c 'echo "buyurtma 2" >> /ma/buyurtmalar.txt'
docker run --rm -v dokon-ma:/ma alpine:3.21 cat /ma/buyurtmalar.txt
Natija
buyurtma 1
buyurtma 2

Hajm konteynerlardan uzoq yashaydi.

Terminal
docker volume ls --filter name=dokon-ma \
    --format 'table {{.Driver}}\t{{.Name}}'
docker volume inspect dokon-ma -f 'Mountpoint: {{.Mountpoint}}'
Natija
DRIVER    VOLUME NAME
local     dokon-ma
Mountpoint: /home/husanboy/.local/share/docker/volumes/dokon-ma/_data
Mountpoint qayerda?

Bu darslik rootless Docker da yozilgan, shuning uchun hajmlar uy papkasida yotibdi.

Oddiy (root) o'rnatishda yo'l /var/lib/docker/volumes/... bo'ladi.

Har ikkala holatda ham bu yo'lga qo'lda tegmaslik kerak - hajm bilan faqat Docker orqali ishlang.

Bog'lanadigan papka (bind mount) #

Bu yerda siz aniq host yo'lini ko'rsatasiz:

Terminal
docker run --rm -v /tmp/bogla:/tashqi alpine:3.21 cat /tashqi/salom.txt
Natija
hostdan kelgan matn

Bog'lanish ikki tomonlama:

Terminal
docker run --rm -v /tmp/bogla:/tashqi alpine:3.21 \
    sh -c 'echo "konteynerdan" > /tashqi/javob.txt'
cat /tmp/bogla/javob.txt
Natija
konteynerdan

Konteyner yozgan fayl hostda paydo bo'ldi. Aynan shuning uchun bind mount ishlab chiqish uchun qulay: kodni tahrirlaysiz, konteyner darhol yangi versiyani ko'radi.

Muhim farq: bo'sh hajm va bog'lanadigan papka #

Bu ikkisi ulanish nuqtasidagi obraz mazmuni bilan boshqacha muomala qiladi. Ko'pchilik shu yerda adashadi.

Bo'sh nomlangan hajm - obrazdagi mazmun hajmga ko'chiriladi:

Terminal
docker run --rm -v test-nusxa:/etc/ssl alpine:3.21 ls /etc/ssl | head -3
Natija
cert.pem
certs
ct_log_list.cnf

Hajm bo'sh edi, lekin /etc/ssl ichidagi fayllar joyida - Docker ularni hajmga nusxaladi.

Bog'lanadigan papka - obrazdagi mazmun yashiriladi:

Terminal
docker run --rm -v /tmp/bogla:/etc/ssl alpine:3.21 ls /etc/ssl
Natija
javob.txt
salom.txt

Sertifikatlar g'oyib bo'ldi. Ular obrazda turibdi, lekin ustiga hostdagi papka yopishtirildi.

Bu farq ilovani jimgina buzadi

Klassik xato: -v $(pwd):/ilova deb ishlab chiqish uchun kodni ulash. Obraz ichida /ilova/node_modules bo'lsa - u yo'qoladi, chunki hostdagi papkada bunday narsa yo'q.

Ilova "modul topilmadi" deb xato beradi va siz sababini uzoq qidirasiz.

Yechim - ichki papkani alohida nomlangan hajm bilan qoplash:

Natija
-v $(pwd):/ilova  -v ilova-modullar:/ilova/node_modules

Ichkaridagi ulanish tashqaridagisini bosadi.

Faqat o'qish uchun ulash #

Terminal
docker run --rm -v /tmp/bogla:/tashqi:ro alpine:3.21 \
    sh -c 'echo x > /tashqi/yangi.txt' 2>&1 | head -2
Natija
sh: can't create /tashqi/yangi.txt: Read-only file system

:ro qo'shimchasi yozishni taqiqlaydi. Sozlama fayllarini ulaganda buni odat qiling - konteyner buzilsa ham sozlamangizni o'zgartira olmaydi.

tmpfs - xotiradagi papka #

Terminal
docker run --rm --tmpfs /vaqtinchalik alpine:3.21 sh -c \
    'echo sir > /vaqtinchalik/f; cat /vaqtinchalik/f
     df -h /vaqtinchalik | tail -1 | tr -s " " | cut -d" " -f1'
Natija
sir
tmpfs

Fayl tizimi turi - tmpfs, ya'ni operativ xotira. Diskka hech narsa yozilmaydi.

Bu sirlar uchun foydali: konteyner to'xtagach ular diskda iz qoldirmaydi.

Hajm konteynerdan uzoq yashaydi #

Terminal
docker run --name yozuvchi -v dokon-baza:/ma alpine:3.21 \
    sh -c 'echo "muhim" > /ma/m.txt' >/dev/null
docker rm -f yozuvchi >/dev/null
docker run --rm -v dokon-baza:/ma alpine:3.21 cat /ma/m.txt
Natija
muhim

Konteyner o'chirildi, ma'lumot qoldi. Aynan shuni xohlagan edik.

--mount sintaksisi #

-v qisqa, lekin o'qishga qiyin. Uzun shakl aniqroq:

Terminal
docker run --rm --mount type=volume,source=dokon-ma,target=/ma \
    alpine:3.21 ls /ma
Natija
buyurtmalar.txt
-v shakli--mount shakli
-v nom:/ma--mount type=volume,source=nom,target=/ma
-v /host:/ma--mount type=bind,source=/host,target=/ma
-v /host:/ma:ro--mount type=bind,source=/host,target=/ma,readonly
--tmpfs /ma--mount type=tmpfs,target=/ma
--mount xatoni erta ko'rsatadi

-v /mavjud/emas/yol:/ma yozsangiz, Docker host papkasini o'zi yaratadi - va siz xatoni sezmaysiz.

--mount type=bind esa papka yo'q bo'lsa darhol xato beradi.

Skript va Compose fayllarida --mount ni afzal ko'ring.

Tozalash #

Terminal
docker volume ls -q --filter name=dokon | wc -l
docker volume rm -f dokon-ma dokon-baza test-nusxa >/dev/null
docker volume ls -q --filter name=dokon | wc -l
Natija
2
0
docker volume prune - ehtiyot bo'ling

U hech bir konteyner ishlatmayotgan hajmlarni o'chiradi.

Konteyner vaqtincha to'xtatilgan bo'lsa ham, uning hajmi "ishlatilmayotgan" hisoblanmaydi - lekin konteyner o'chirilgan bo'lsa, hajmi prune ga tushadi.

Ishlab chiqarish serverida uni avtomatlashtirmang. Bazangiz shu yerda yotgan bo'lishi mumkin.

Xulosa #

  • Konteynerning yozish qatlami vaqtinchalik; saqlanishi kerak bo'lgan ma'lumot uchun hajm kerak.
  • Nomlangan hajm - Docker boshqaradi, ishlab chiqarish uchun asosiy tanlov.
  • Bog'lanadigan papka - aniq host yo'li, ikki tomonlama; ishlab chiqishda kodni ulash uchun.
  • tmpfs - faqat xotirada, diskka yozilmaydi; sirlar uchun.
  • Bo'sh nomlangan hajm ulanganda obraz mazmuni unga ko'chiriladi.
  • Bog'lanadigan papka esa obraz mazmunini yashiradi - bu node_modules kabi papkalarni jimgina yo'q qiladi.
  • Ichkaridagi ulanish tashqaridagisini bosadi - shu bilan muammoni hal qilasiz.
  • Sozlama fayllarini :ro bilan ulang.
  • Hajm konteyner o'chirilganda ham qoladi - docker volume rm bilan alohida o'chiriladi.
  • --mount uzunroq, lekin xatoni erta ko'rsatadi: -v mavjud bo'lmagan host papkasini o'zi yaratib yuboradi.
Amaliy topshiriq
  1. Nomlangan hajm yarating va ikki konteyner orqali unga yozing.
  2. Konteynerni o'chirib, ma'lumot qolganini tekshiring.
  3. docker volume inspect bilan hajm qayerda yotganini toping.
  4. Bind mount bilan hostdagi faylni konteynerda o'qing.
  5. Konteynerdan yozib, hostda paydo bo'lganini ko'ring.
  6. Bo'sh hajmni /etc ga ulab, obraz mazmuni ko'chganini tekshiring.
  7. O'sha yo'lga bind mount ulab, mazmun yashirilganini ko'ring.
  8. :ro bilan ulab, yozishga urinib xatoni o'qing.
  9. --tmpfs bilan fayl yaratib, df -h bilan turini tekshiring.
  10. -v va --mount shakllarini bir xil ulanish uchun yozing.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.