3-bo‘lim
Obrazlar va qatlamlar
Obraz nimadan tuzilgan, qatlamlar qanday ishlaydi, teg va digest farqi, obrazlarni boshqarish.
Ushbu bo‘lim mundarijasi
Konteyner obrazdan tug'iladi. Endi obrazning ichiga qaraymiz - chunki Dockerfile yozishdan oldin uning tuzilishini tushunish kerak.
Obraz - qatlamlar to'plami #
Obraz bitta katta fayl emas. U qatlamlardan iborat va har bir qatlam oldingisining ustiga tushadigan o'zgarishlar to'plami.
Bu tuzilish ikkita katta foyda beradi:
| Foyda | Qanday |
|---|---|
| Joy tejash | Bir xil qatlam diskda bir marta yotadi |
| Tez yuklash | Faqat yetishmayotgan qatlam tortiladi |
| Tez qurish | O'zgarmagan qatlam keshdan olinadi |
Obrazni tortib olish #
docker pull alpine:3.20
3.20: Pulling from library/alpine
25f1d6b1951a: Pulling fs layer
25f1d6b1951a: Download complete
d4050d56ebf2: Download complete
25f1d6b1951a: Pull complete
3a030ca3f633: Download complete
Digest: sha256:d9e853e87e55526f6b2917df91a2115c36dd7c696a35be12163d44e6e2a4b6bc
Status: Downloaded newer image for alpine:3.20
docker.io/library/alpine:3.20
Oxirgi qator to'liq nomni ko'rsatadi: docker.io/library/alpine:3.20.
Siz alpine:3.20 deb yozdingiz, Docker esa registry (docker.io) va
egasi (library) ni o'zi to'ldirdi.
docker images alpine --format 'table {{.Repository}}\t{{.Tag}}\t{{.Size}}'
REPOSITORY TAG SIZE
alpine 3.20 12.2MB
alpine 3.21 12.2MB
Teg - shunchaki ko'rsatkich #
Teg obrazning nomi emas, balki unga ishora qiluvchi yorliq. Bir obrazga bir nechta teg osish mumkin:
docker tag alpine:3.21 dokon-asos:1.0
docker images --format '{{.Repository}}:{{.Tag}}\t{{.ID}}' alpine:3.21
docker images --format '{{.Repository}}:{{.Tag}}\t{{.ID}}' dokon-asos:1.0
alpine:3.21 48b0309ca019
dokon-asos:1.0 48b0309ca019
Identifikator bir xil. Yangi obraz yaratilmadi, nusxa ham olinmadi - faqat yangi yorliq osildi.
latest - eng xavfli teglatest "eng so'nggi" degani emas. U shunchaki standart teg
nomi - obraz egasi uni istalgan versiyaga ko'chirishi mumkin.
Bugun nginx:latest 1.31 ni, bir oydan keyin 1.33 ni
ko'rsatishi mumkin. Sizning docker pull ingiz esa xabar
bermaydi.
Ishlab chiqarishda hech qachon latest ishlatmang. Aniq
versiya yozing: nginx:1.31-alpine.
Qatlamlarni ko'rish #
docker history obraz qanday qurilganini ko'rsatadi:
docker history alpine:3.21 --no-trunc \
--format 'table {{.Size}}\t{{.CreatedBy}}'
SIZE CREATED BY
0B CMD ["/bin/sh"]
8.5MB ADD alpine-minirootfs-3.21.7-x86_64.tar.gz / # buildkit
Ikki qadam, lekin faqat bittasi hajmga ega. CMD - metama'lumot:
u fayl tizimini o'zgartirmaydi, shuning uchun 0B.
Bu farq muhim. Tarixdagi yozuvlar soni va haqiqiy fayl qatlamlari soni bir xil emas:
echo "nginx tarix yozuvlari : $(docker history nginx:alpine -q | wc -l)"
docker inspect nginx:alpine \
-f 'nginx fayl qatlamlari : {{len .RootFS.Layers}}'
docker inspect alpine:3.21 -f 'alpine fayl qatlamlari: {{len .RootFS.Layers}}'
nginx tarix yozuvlari : 20
nginx fayl qatlamlari : 8
alpine fayl qatlamlari: 1
Nginx obrazida 20 ta qurish qadami bor, lekin diskda 8 ta
qatlam yotadi. Qolgan 12 tasi ENV, LABEL, EXPOSE kabi
metama'lumot qadamlari.
docker history nginx:alpine --format 'table {{.Size}}\t{{.CreatedBy}}' \
| cut -c1-70 | head -12
SIZE CREATED BY
52.3MB RUN /bin/sh -c set -x && apkArch="$(cat …
0B ENV ACME_VERSION=0.4.1
0B ENV NJS_RELEASE=1
0B ENV NJS_VERSION=1.0.1
0B CMD ["nginx" "-g" "daemon off;"]
0B STOPSIGNAL SIGQUIT
0B EXPOSE map[80/tcp:{}]
0B ENTRYPOINT ["/docker-entrypoint.sh"]
16.4kB COPY 30-tune-worker-processes.sh /docker-ent…
12.3kB COPY 20-envsubst-on-templates.sh /docker-ent…
12.3kB COPY 15-local-resolvers.envsh /docker-entryp…
docker history eng yangi qadamni yuqorida ko'rsatadi. Ro'yxat
oxiridagi ADD alpine-minirootfs… - bu eng birinchi, asos qatlam.
Ya'ni ro'yxatni pastdan yuqoriga o'qing.
Mazmun manzili #
Qatlam nomi tasodifiy emas - u qatlam mazmunining SHA-256 xeshi. Mazmun bir bayt farq qilsa, digest butunlay boshqacha bo'ladi:
docker inspect alpine:3.21 -f '3.21: {{index .RootFS.Layers 0}}'
docker inspect alpine:3.20 -f '3.20: {{index .RootFS.Layers 0}}'
3.21: sha256:7211d01aba8fa2e9eb71ad34395cd313df5fc51a6b69b92d2dfad32cc37759cb
3.20: sha256:08bc4e534116aa76b16015484b82eac51f9a593416feae9296c8a2d4bb7aa4a2
Ikkalasi ham "alpine", ikkalasi ham 12.2 MB - lekin mazmuni boshqa, demak digest ham boshqa. Ular hech narsani baham ko'rmaydi.
Qatlam baham ko'rilishi uchun mazmun aynan bir xil bo'lishi kerak. Bu odatda bir xil asos obrazdan qurilgan obrazlarda yuz beradi - 6-bobda buni o'z ko'zimiz bilan ko'ramiz.
Disk qancha band? #
docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 3 0 127.4MB 127.4MB (99%)
Containers 0 0 0B 0B
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B
RECLAIMABLE - hech bir konteyner ishlatmayotgan, ya'ni bo'shatish mumkin bo'lgan joy. Bu yerda uchala obraz ham ishlatilmayapti.
Har bir qurish yangi qatlam qoldiradi. Bir necha oy ishlangan ishlab chiqarish serverida Docker o'nlab gigabayt egallashi odatiy hol.
Tozalash buyruqlari:
docker image prune # tegsiz obrazlar
docker image prune -a # ishlatilmayotgan hammasi
docker system prune -a # obraz, konteyner, tarmoq, kesh
-a bilan ehtiyot bo'ling - u ishlatilmayotgan hamma narsani
o'chiradi.
Digest bilan qotirish #
Teg ko'chishi mumkin, digest esa hech qachon. Aniq bir obrazni kafolatlash kerak bo'lsa, digest ishlatiladi:
docker inspect alpine:3.21 -f '{{index .RepoDigests 0}}'
alpine@sha256:48b0309ca019d89d40f670aa1bc06e426dc0931948452e8491e3d65087abc07d
Endi Dockerfile da shunday yozish mumkin:
FROM alpine@sha256:48b0309ca019d89d40f670aa1bc06e426dc0931948452e8491e3d65087a
Bu satr bir yildan keyin ham aynan o'sha obrazni beradi.
| Usul | Barqarorlik | Qulaylik |
|---|---|---|
alpine | Yo'q - latest ko'chadi | Yuqori |
alpine:3.21 | O'rtacha - yamoq versiyalari kelishi mumkin | Yuqori |
alpine:3.21.7 | Yaxshi | O'rtacha |
alpine@sha256:... | To'liq kafolat | Past - qo'lda yangilanadi |
Ko'p loyihalar uchun alpine:3.21 ko'rinishidagi kichik
versiya yetarli - xavfsizlik yamoqlari avtomatik keladi.
Digest esa ta'minot zanjiri xavfsizligi muhim bo'lgan joyda ishlatiladi: bank, tibbiyot, davlat tizimlari.
Renovate yoki Dependabot digestni sizning o'rningizga yangilab turishi mumkin.
Obrazni o'chirish #
docker rmi avval tegni o'chiradi. Obrazning o'zi boshqa teg
bilan bog'langan bo'lsa, u joyida qoladi:
docker rmi dokon-asos:1.0
docker images alpine:3.21 --format '{{.Repository}}:{{.Tag}}\t{{.ID}}'
Untagged: dokon-asos:1.0
alpine:3.21 48b0309ca019
Untagged - Deleted emas. Obraz alpine:3.21 sifatida turibdi.
Ishlatilayotgan obrazni esa o'chirib bo'lmaydi:
docker run -d --name band alpine:3.21 sleep 60 >/dev/null
docker rmi alpine:3.21 2>&1 | fold -sw 74
Error response from daemon: conflict: unable to delete alpine:3.21 (must
be forced) - container 10d9fcee272d is using its referenced image
48b0309ca019
Docker sizni himoya qildi: obraz o'chsa, konteyner ishlay olmay qolardi.
Xulosa #
- Obraz - qatlamlar to'plami; har bir qatlam oldingisining ustiga tushadigan o'zgarishlar.
- Faqat eng yuqoridagi yozish qatlami o'zgaradi va u konteyner bilan birga yo'qoladi; qolgani faqat o'qish uchun.
- Teg - ko'rsatkich, nom emas:
docker tagnusxa olmaydi, ikkala teg bir xil identifikatorga ishora qiladi. latestishlatmang - u "eng so'nggi" degani emas, shunchaki standart teg nomi va istalgan vaqtda ko'chishi mumkin.docker historyqurish qadamlarini teskari tartibda ko'rsatadi - pastdan yuqoriga o'qing.ENV,LABEL,CMDkabi qadamlar 0B: ular metama'lumot, fayl qatlami emas. Nginx da 20 ta qadam bor, lekin 8 ta qatlam.- Qatlam nomi - uning mazmunining SHA-256 xeshi; mazmun boshqacha bo'lsa, baham ko'rish ham bo'lmaydi.
docker system dfRECLAIMABLE ustuni bo'shatish mumkin bo'lgan joyni ko'rsatadi.- Digest (
alpine@sha256:...) hech qachon ko'chmaydi - to'liq takrorlanuvchanlik kerak bo'lganda ishlatiladi. docker rmiavval tegni o'chiradi; ishlatilayotgan obrazni esa umuman o'chirmaydi.
alpinening ikki xil versiyasini torting va hajmlarini solishtiring.- Bitta obrazga uchta teg osing va
docker imagesda identifikatorlarini solishtiring. docker history nginx:alpineni to'liq ko'ring va 0B qadamlarni sanang.docker inspectbilanRootFS.Layerssonini uch xil obraz uchun solishtiring.docker system dfni ishga tushiring va RECLAIMABLE ni yozib oling.docker image prunedan keyin qancha joy bo'shaganini o'lchang.- Obrazning
RepoDigestsini toping va Dockerfile ga yozib ko'ring. - Ishlayotgan konteyner obrazini o'chirishga urinib, xatoni o'qing.
docker rmivadocker rmi -ffarqini tushuntiring.- Loyihangizdagi asos obrazni qaysi usulda qotirish kerakligini tanlang va sababini 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.