16-bo‘lim

Registry va obrazni nashr qilish

Obraz nomining to'liq shakli, xususiy registry, push va pull, teg strategiyasi hamda OCI yorliqlari.

🕑 15 daqiqa o‘qish 📄 750 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Obraz nomining to'liq shakli
  2. O'z registry ingizni ko'tarish
  3. Obrazni tayyorlash
  4. Yuborish
  5. Qaytadan tortish
  6. Teg strategiyasi
  7. OCI yorliqlari
  8. Digest bilan qotirish
  9. Registry ni tanlash
  10. Xulosa

Obraz mahalliy kompyuterda qurildi. Uni serverga yetkazish uchun registry kerak - obrazlar saqlanadigan omborxona.

Obraz nomining to'liq shakli #

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

alpine:3.21 - qisqartirilgan shakl. To'lig'i shunday tuzilgan:

Natija
docker.io  /  library  /  alpine  :  3.21
    ^            ^           ^         ^
    |            |           |         +-- teg
    |            |           +------------ omborxona nomi
    |            +------------------------ egasi (namespace)
    +--------------------------------------- registry

Registry yozilmasa, Docker docker.io deb tushunadi. Egasi yozilmasa - library (rasmiy obrazlar).

Shuning uchun xususiy registry ishlatish uchun uni nomga qo'shish kifoya: reyestr.dokon.uz/jamoa/ilova:1.0.

O'z registry ingizni ko'tarish #

Registry ning o'zi ham konteyner:

Natija
docker run -d --name reyestr -p 5001:5000 registry:2
Terminal
curl -s http://127.0.0.1:5001/v2/_catalog
Natija
{"repositories":[]}

Bo'sh. Endi unga obraz yuboramiz.

Obrazni tayyorlash #

DOCKERFILE
FROM alpine:3.21
LABEL org.opencontainers.image.title="Dokon ilovasi"
LABEL org.opencontainers.image.version="1.0"
CMD ["echo", "Dokon 1.0"]

Obraz registry manzili bilan teglanishi kerak - docker push manzilni nomdan oladi:

Terminal
docker images '127.0.0.1:5001/dokon/ilova' --format '{{.Repository}}:{{.Tag}}'
Natija
127.0.0.1:5001/dokon/ilova:1.0

Yuborish #

Natija
docker push 127.0.0.1:5001/dokon/ilova:1.0

Chiqish shunday ko'rinadi (identifikatorlar sizda boshqacha):

Natija
b3ee1c069dce: Pushed
44136fa355b3: Pushed
1.0: digest: sha256:a57b09cc7b66a4afee214fe14b47e6174a9a2547... size: 855

Identifikatorlar va digest har qurishda yangilanadi, shuning uchun ularni yod olishning hojati yo'q. Muhimi - yuborish o'tdimi:

Terminal
docker push 127.0.0.1:5001/dokon/ilova:1.0 >/dev/null 2>&1 \
    && echo "yuborildi"
Natija
yuborildi

Oxirgi qator - manifest digesti: aynan shu obrazni keyinchalik nomi bilan emas, digest bilan chaqirish mumkin.

Qatlamlarning muhim xususiyati ham shu yerda ko'rinadi: bir xil qatlam registry ga bir marta yuklanadi. Yigirmata obraz bir xil asosdan qurilgan bo'lsa, asos qatlami bitta nusxada yotadi - shuning uchun ikkinchi push deyarli bir zumda tugaydi.

Terminal
curl -s http://127.0.0.1:5001/v2/_catalog
curl -s http://127.0.0.1:5001/v2/dokon/ilova/tags/list
Natija
{"repositories":["dokon/ilova"]}
{"name":"dokon/ilova","tags":["1.0"]}

Qaytadan tortish #

Mahalliy nusxani o'chirib, registry dan olamiz:

Terminal
docker rmi -f 127.0.0.1:5001/dokon/ilova:1.0 >/dev/null 2>&1
docker pull -q 127.0.0.1:5001/dokon/ilova:1.0
docker run --rm 127.0.0.1:5001/dokon/ilova:1.0
Natija
127.0.0.1:5001/dokon/ilova:1.0
Dokon 1.0

Bu - yetkazib berishning butun mohiyati: obraz bir joyda qurildi, boshqa joyda aynan o'sha holicha ishga tushdi.

Obraz yo'li: quruvchidan serverlargacha CI quruvchi docker build Registry dokon/ilova:1.0 push server-1 server-2 server-3 pull Bir marta quriladi, ko'p marta ishlatiladi Har bir serverda qayta qurilmaydi - demak "bir serverda ishladi, boshqasida yo'q" muammosi yo'q.
Registry - qurish va ishga tushirish orasidagi ko'prik

Teg strategiyasi #

Bitta obrazga bir nechta teg beriladi:

Terminal
docker tag 127.0.0.1:5001/dokon/ilova:1.0 127.0.0.1:5001/dokon/ilova:1
docker tag 127.0.0.1:5001/dokon/ilova:1.0 127.0.0.1:5001/dokon/ilova:latest
docker push -q 127.0.0.1:5001/dokon/ilova:1 >/dev/null 2>&1
docker push -q 127.0.0.1:5001/dokon/ilova:latest >/dev/null 2>&1
curl -s http://127.0.0.1:5001/v2/dokon/ilova/tags/list \
    | sed 's/.*\[//; s/\].*//; s/"//g; s/,/\n/g' | sort
Natija
1
1.0
latest

Uchala teg bitta obrazga ishora qiladi.

TegMaqsadi
1.0.3Aniq versiya - hech qachon o'zgarmaydi
1.0Oxirgi yamoq versiyasi
1Oxirgi kichik versiya
latestOxirgi barqaror (faqat qulaylik uchun)
sha-a1b2c3dKommit xeshi - CI uchun ideal
2026-09-16Sana bo'yicha
CI da kommit xeshini teg qiling
Natija
docker build -t reyestr/dokon:sha-$(git rev-parse --short HEAD) .

Shunda har bir obraz qaysi koddan qurilganini aniq bilasiz. Ishlab chiqarishda muammo chiqsa, obrazdan kommitga bir qadamda o'tasiz.

Qo'shimcha ravishda 1.2.3 kabi versiya tegini ham qo'shing - u odamlar uchun.

OCI yorliqlari #

LABEL obrazga metama'lumot qo'shadi:

Terminal
docker inspect 127.0.0.1:5001/dokon/ilova:1.0 \
    -f '{{range $k,$v := .Config.Labels}}{{printf "%s=%s\n" $k $v}}{{end}}' \
    | sort
Natija

org.opencontainers.image.title=Dokon ilovasi
org.opencontainers.image.version=1.0

Standart yorliqlar org.opencontainers.image.* bilan boshlanadi:

YorliqNima yoziladi
.titleObraz nomi
.versionVersiya
.revisionGit kommit xeshi
.sourceRepozitoriy manzili
.createdQurish sanasi
.licensesLitsenziya
.descriptionQisqa tavsif

Bularni CI avtomatik to'ldiradi:

Natija
docker build \
    --label org.opencontainers.image.revision=$(git rev-parse HEAD) \
    --label org.opencontainers.image.created=$(date -u +%Y-%m-%dT%H:%M:%SZ) \
    -t dokon:1.0 .

Digest bilan qotirish #

Terminal
DIG=$(docker inspect 127.0.0.1:5001/dokon/ilova:1.0 \
    -f '{{index .RepoDigests 0}}')
docker rmi -f 127.0.0.1:5001/dokon/ilova:1.0 >/dev/null 2>&1
docker pull -q "$DIG" >/dev/null 2>&1 && echo "digest bo'yicha tortildi"
Natija
digest bo'yicha tortildi

3-bobda aytilgan qoida shu yerda amalda: teg ko'chishi mumkin, digest - hech qachon.

Ishlab chiqarishga digest bilan chiqing

Teg bilan chiqsangiz, docker pull bugun bir obrazni, ertaga boshqasini olishi mumkin - va siz buni sezmaysiz.

Tavsiya etiladigan oqim:

  1. CI obrazni quradi va tegga yuboradi
  2. CI push natijasidan digestni oladi
  3. Yetkazishda aynan shu digest ishlatiladi

Shunda "qaysi versiya ishlayapti?" degan savolga aniq javob bo'ladi.

Registry ni tanlash #

VariantQachon
Docker HubOchiq obrazlar, kichik jamoa
GitHub / GitLab registryKod o'sha yerda bo'lsa - eng qulay
Bulut registry (ECR, GCR, ACR)Bulutda ishlayotgan bo'lsangiz
O'z serveringiz (registry:2, Harbor)Ma'lumot ichkarida qolishi kerak
Registry ga kirish - ta'minot zanjiri xavfi

Registry ga yozish huquqi bo'lgan har kim sizning ishlab chiqarish muhitingizga kod joylashtira oladi.

Shuning uchun:

  • Yozish huquqini faqat CI ga bering, odamlarga emas
  • Teglarni o'zgarmas qiling (Harbor, ECR da bunday sozlama bor)
  • Obrazlarni imzolang (cosign) va yetkazishdan oldin tekshiring
  • Digest bilan qotiring

Bu 15-bobdagi skanerlash bilan birgalikda ishlaydi: skanerlash "nima ichida" degan savolga, imzo esa "kim qurgan" degan savolga javob beradi.

Xulosa #

  • To'liq nom: registry/egasi/omborxona:teg; yozilmaganini Docker docker.io/library deb to'ldiradi.
  • Xususiy registry ishlatish uchun uni nomga qo'shish kifoya.
  • registry:2 obrazi bilan o'z registry ingizni bir buyruqda ko'tarish mumkin.
  • docker push manzilni obraz nomidan oladi - shuning uchun teg to'g'ri bo'lishi kerak.
  • Push chiqishidagi oxirgi qator - manifest digesti.
  • Bitta obrazga bir nechta teg beriladi; ular bir xil obrazga ishora qiladi.
  • CI da kommit xeshini teg qiling - obrazdan kodga yo'l ochiladi.
  • LABEL bilan OCI metama'lumotini qo'shing; CI uni avtomatik to'ldirsin.
  • Ishlab chiqarishga digest bilan chiqing, teg bilan emas.
  • Registry ga yozish huquqi - ta'minot zanjiri xavfi; uni faqat CI ga bering.
Amaliy topshiriq
  1. registry:2 bilan mahalliy registry ko'taring.
  2. Obraz qurib, unga registry manzilini teg qiling.
  3. docker push qiling va katalogda ko'ring.
  4. Mahalliy nusxani o'chirib, qaytadan torting.
  5. Bitta obrazga uchta teg berib, hammasini yuboring.
  6. tags/list orqali ro'yxatni tekshiring.
  7. LABEL bilan OCI yorliqlarini qo'shing.
  8. docker inspect bilan ularni o'qing.
  9. Digest bo'yicha torting va teg bilan farqini tushuntiring.
  10. CI uchun teg strategiyasini yozing (versiya + kommit xeshi).

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.