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.
Ushbu bo‘lim mundarijasi
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.
Nomlangan hajm #
docker volume create dokon-ma
dokon-ma
Endi uni konteynerga ulaymiz:
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
buyurtma 1
Birinchi konteyner yozdi va o'chdi. Ikkinchisi - butunlay boshqa konteyner - o'sha faylni o'qidi.
Uchinchisi qo'shimcha yozadi:
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
buyurtma 1
buyurtma 2
Hajm konteynerlardan uzoq yashaydi.
docker volume ls --filter name=dokon-ma \
--format 'table {{.Driver}}\t{{.Name}}'
docker volume inspect dokon-ma -f 'Mountpoint: {{.Mountpoint}}'
DRIVER VOLUME NAME
local dokon-ma
Mountpoint: /home/husanboy/.local/share/docker/volumes/dokon-ma/_data
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:
docker run --rm -v /tmp/bogla:/tashqi alpine:3.21 cat /tashqi/salom.txt
hostdan kelgan matn
Bog'lanish ikki tomonlama:
docker run --rm -v /tmp/bogla:/tashqi alpine:3.21 \
sh -c 'echo "konteynerdan" > /tashqi/javob.txt'
cat /tmp/bogla/javob.txt
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:
docker run --rm -v test-nusxa:/etc/ssl alpine:3.21 ls /etc/ssl | head -3
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:
docker run --rm -v /tmp/bogla:/etc/ssl alpine:3.21 ls /etc/ssl
javob.txt
salom.txt
Sertifikatlar g'oyib bo'ldi. Ular obrazda turibdi, lekin ustiga hostdagi papka yopishtirildi.
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:
-v $(pwd):/ilova -v ilova-modullar:/ilova/node_modules
Ichkaridagi ulanish tashqaridagisini bosadi.
Faqat o'qish uchun ulash #
docker run --rm -v /tmp/bogla:/tashqi:ro alpine:3.21 \
sh -c 'echo x > /tashqi/yangi.txt' 2>&1 | head -2
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 #
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'
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 #
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
muhim
Konteyner o'chirildi, ma'lumot qoldi. Aynan shuni xohlagan edik.
--mount sintaksisi #
-v qisqa, lekin o'qishga qiyin. Uzun shakl aniqroq:
docker run --rm --mount type=volume,source=dokon-ma,target=/ma \
alpine:3.21 ls /ma
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 #
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
2
0
docker volume prune - ehtiyot bo'lingU 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_moduleskabi papkalarni jimgina yo'q qiladi. - Ichkaridagi ulanish tashqaridagisini bosadi - shu bilan muammoni hal qilasiz.
- Sozlama fayllarini
:robilan ulang. - Hajm konteyner o'chirilganda ham qoladi -
docker volume rmbilan alohida o'chiriladi. --mountuzunroq, lekin xatoni erta ko'rsatadi:-vmavjud bo'lmagan host papkasini o'zi yaratib yuboradi.
- Nomlangan hajm yarating va ikki konteyner orqali unga yozing.
- Konteynerni o'chirib, ma'lumot qolganini tekshiring.
docker volume inspectbilan hajm qayerda yotganini toping.- Bind mount bilan hostdagi faylni konteynerda o'qing.
- Konteynerdan yozib, hostda paydo bo'lganini ko'ring.
- Bo'sh hajmni
/etcga ulab, obraz mazmuni ko'chganini tekshiring. - O'sha yo'lga bind mount ulab, mazmun yashirilganini ko'ring.
:robilan ulab, yozishga urinib xatoni o'qing.--tmpfsbilan fayl yaratib,df -hbilan turini tekshiring.-vva--mountshakllarini bir xil ulanish uchun yozing.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
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.