3-bo‘lim

Obrazlar va qatlamlar

Obraz nimadan tuzilgan, qatlamlar qanday ishlaydi, teg va digest farqi, obrazlarni boshqarish.

🕑 15 daqiqa o‘qish 📄 838 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Obraz - qatlamlar to'plami
  2. Obrazni tortib olish
  3. Teg - shunchaki ko'rsatkich
  4. Qatlamlarni ko'rish
  5. Mazmun manzili
  6. Disk qancha band?
  7. Digest bilan qotirish
  8. Obrazni o'chirish
  9. Xulosa

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.

Obraz qatlamlari va konteyner yozish qatlami Yozish qatlami (konteyner) o'zgaruvchan - konteyner bilan yo'qoladi COPY ilova fayllari RUN bog'liqliklarni o'rnatish RUN tizim paketlari Asos obrazi (alpine) faqat o'qish uchun yoziladigan yagona qatlam bu qatlamlar faqat o'qiladi va konteynerlar orasida baham ko'riladi quyidan yuqoriga Union fayl tizimi hamma qatlamni bitta ildizga birlashtiradi
Faqat eng yuqorigi yoziladi - qolgani baham ko'riladi

Bu tuzilish ikkita katta foyda beradi:

FoydaQanday
Joy tejashBir xil qatlam diskda bir marta yotadi
Tez yuklashFaqat yetishmayotgan qatlam tortiladi
Tez qurishO'zgarmagan qatlam keshdan olinadi

Obrazni tortib olish #

Terminal
docker pull alpine:3.20
Natija
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.

Terminal
docker images alpine --format 'table {{.Repository}}\t{{.Tag}}\t{{.Size}}'
Natija
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:

Terminal
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
Natija
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 teg

latest "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:

Terminal
docker history alpine:3.21 --no-trunc \
    --format 'table {{.Size}}\t{{.CreatedBy}}'
Natija
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:

Terminal
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}}'
Natija
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.

Terminal
docker history nginx:alpine --format 'table {{.Size}}\t{{.CreatedBy}}' \
    | cut -c1-70 | head -12
Natija
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…
Tarix teskari tartibda

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:

Terminal
docker inspect alpine:3.21 -f '3.21: {{index .RootFS.Layers 0}}'
docker inspect alpine:3.20 -f '3.20: {{index .RootFS.Layers 0}}'
Natija
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? #

Terminal
docker system df
Natija
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.

Disk sekin, lekin ishonchli to'ladi

Har bir qurish yangi qatlam qoldiradi. Bir necha oy ishlangan ishlab chiqarish serverida Docker o'nlab gigabayt egallashi odatiy hol.

Tozalash buyruqlari:

Natija
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:

Terminal
docker inspect alpine:3.21 -f '{{index .RepoDigests 0}}'
Natija
alpine@sha256:48b0309ca019d89d40f670aa1bc06e426dc0931948452e8491e3d65087abc07d

Endi Dockerfile da shunday yozish mumkin:

DOCKERFILE
FROM alpine@sha256:48b0309ca019d89d40f670aa1bc06e426dc0931948452e8491e3d65087a

Bu satr bir yildan keyin ham aynan o'sha obrazni beradi.

UsulBarqarorlikQulaylik
alpineYo'q - latest ko'chadiYuqori
alpine:3.21O'rtacha - yamoq versiyalari kelishi mumkinYuqori
alpine:3.21.7YaxshiO'rtacha
alpine@sha256:...To'liq kafolatPast - qo'lda yangilanadi
Amaliy tanlov

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:

Terminal
docker rmi dokon-asos:1.0
docker images alpine:3.21 --format '{{.Repository}}:{{.Tag}}\t{{.ID}}'
Natija
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:

Terminal
docker run -d --name band alpine:3.21 sleep 60 >/dev/null
docker rmi alpine:3.21 2>&1 | fold -sw 74
Natija
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 tag nusxa olmaydi, ikkala teg bir xil identifikatorga ishora qiladi.
  • latest ishlatmang - u "eng so'nggi" degani emas, shunchaki standart teg nomi va istalgan vaqtda ko'chishi mumkin.
  • docker history qurish qadamlarini teskari tartibda ko'rsatadi - pastdan yuqoriga o'qing.
  • ENV, LABEL, CMD kabi 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 df RECLAIMABLE ustuni bo'shatish mumkin bo'lgan joyni ko'rsatadi.
  • Digest (alpine@sha256:...) hech qachon ko'chmaydi - to'liq takrorlanuvchanlik kerak bo'lganda ishlatiladi.
  • docker rmi avval tegni o'chiradi; ishlatilayotgan obrazni esa umuman o'chirmaydi.
Amaliy topshiriq
  1. alpine ning ikki xil versiyasini torting va hajmlarini solishtiring.
  2. Bitta obrazga uchta teg osing va docker images da identifikatorlarini solishtiring.
  3. docker history nginx:alpine ni to'liq ko'ring va 0B qadamlarni sanang.
  4. docker inspect bilan RootFS.Layers sonini uch xil obraz uchun solishtiring.
  5. docker system df ni ishga tushiring va RECLAIMABLE ni yozib oling.
  6. docker image prune dan keyin qancha joy bo'shaganini o'lchang.
  7. Obrazning RepoDigests ini toping va Dockerfile ga yozib ko'ring.
  8. Ishlayotgan konteyner obrazini o'chirishga urinib, xatoni o'qing.
  9. docker rmi va docker rmi -f farqini tushuntiring.
  10. Loyihangizdagi asos obrazni qaysi usulda qotirish kerakligini tanlang va sababini 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.