20-bo‘lim
Amaliy loyiha - to'liq yetkazish
Dokon ilovasini noldan konteynerga joylash, test qilish, nashr etish, yetkazish, tekshirish va zaxiralash.
Ushbu bo‘lim mundarijasi
Yigirma bob davomida o'rgangan hamma narsani bitta loyihada yig'amiz: dokon ilovasini qurib, sinab, nashr etib, yetkazamiz va har bir qadamni tekshiramiz.
Loyiha tuzilishi #
loyiha/
├── compose.yaml
├── .dockerignore
└── ilova/
├── Dockerfile
├── boshla.sh # ilova
└── sinov.sh # testlar
Ilova #
Ilova bazaga ulanadi, jadval yaratadi va soddagina HTTP javob beradi. Eng muhimi - SIGTERM ni ushlaydi (6-bob):
#!/bin/sh
trap 'echo "SIGTERM - toza toxtaymiz"; exit 0' TERM
echo "dokon: ishga tushdi, versiya ${DOKON_VERSIYA}"
psql "$BAZA_URL" -q -c "
CREATE TABLE IF NOT EXISTS buyurtma (id serial PRIMARY KEY, nomi text);
INSERT INTO buyurtma (nomi) SELECT 'Olma'
WHERE NOT EXISTS (SELECT 1 FROM buyurtma);"
while true; do
printf 'HTTP/1.1 200 OK\r\n\r\nOK\n' \
| nc -l -p 8080 >/dev/null 2>&1 || sleep 1
done &
wait
Testlar oddiy, lekin haqiqiy tekshiruv qiladi:
#!/bin/sh
test -x /boshla.sh || { echo "TEST XATO: boshla.sh bajarilmaydi"; exit 1; }
grep -q 'trap' /boshla.sh \
|| { echo "TEST XATO: SIGTERM ishlovchisi yo'q"; exit 1; }
echo "TEST OK: barcha tekshiruv o'tdi"
Ikkinchi tekshiruv qiziq: u ilovada SIGTERM ishlovchisi borligini majburiy qiladi. Kimdir uni olib tashlasa, qurish yiqiladi.
Dockerfile #
FROM alpine:3.21 AS asos
RUN apk add --no-cache postgresql-client netcat-openbsd \
&& adduser -D -u 10001 dokon
COPY --chmod=755 boshla.sh /boshla.sh
ENV DOKON_VERSIYA=1.0
FROM asos AS sinov
COPY --chmod=755 sinov.sh /sinov.sh
RUN /sinov.sh
FROM asos AS yakuniy
USER dokon
EXPOSE 8080
CMD ["/boshla.sh"]
| Qator | Qaysi bobdan |
|---|---|
--no-cache va bitta RUN | 5 |
Uch bosqich (asos, sinov, yakuniy) | 7, 17 |
COPY --chmod=755 | 19 |
USER dokon | 15 |
CMD exec shaklda | 6 |
Testlar #
docker build -q --target sinov -t dokon-sinov:1 ./ilova >/dev/null \
&& echo "testlar o'tdi"
testlar o'tdi
Obraz va nashr #
docker images 127.0.0.1:5001/dokon/ilova:1.0 --format '{{.Size}}'
docker inspect 127.0.0.1:5001/dokon/ilova:1.0 \
-f 'Foydalanuvchi: {{.Config.User}}'
20.1MB
Foydalanuvchi: dokon
20 megabayt - bazaga ulanadigan, HTTP javob beradigan to'liq ilova. Va u root sifatida ishlamaydi.
Skanerlash #
docker run --rm -v /tmp/trivy-cache:/root/.cache aquasec/trivy:latest \
image --quiet --severity CRITICAL --format json \
127.0.0.1:5001/dokon/ilova:1.0 2>/dev/null \
| grep -c '"VulnerabilityID"' || true
0
Kritik zaiflik yo'q. CI da bu qadam exit-code: "1" bilan
ishlaydi - topilsa quvur to'xtaydi.
Yetkazish #
name: dokon
services:
ilova:
image: 127.0.0.1:5001/dokon/ilova:1.0
environment:
BAZA_URL: postgres://postgres:sinov@baza:5432/dokon
depends_on:
baza: { condition: service_healthy }
networks: [old, orqa]
restart: unless-stopped
read_only: true
tmpfs: [/tmp]
cap_drop: [ALL]
security_opt: [no-new-privileges:true]
logging:
driver: json-file
options: { max-size: "10m", max-file: "3" }
deploy:
resources:
limits: { cpus: "0.5", memory: 128M, pids: 100 }
baza:
image: postgres:17-alpine
environment:
POSTGRES_PASSWORD: sinov
POSTGRES_DB: dokon
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres -d dokon"]
interval: 2s
retries: 20
volumes: [dokon-ma:/var/lib/postgresql/data]
networks: [orqa]
restart: unless-stopped
logging:
driver: json-file
options: { max-size: "10m", max-file: "3" }
networks:
old:
orqa:
volumes:
dokon-ma:
docker compose ps --format '{{.Service}} {{.State}}' | sort
docker compose logs ilova --no-log-prefix | head -2
baza running
ilova running
dokon: ishga tushdi, versiya 1.0
dokon: bazada 1 ta buyurtma
Ilova bazani topdi, jadval yaratdi va yozuvni qo'shdi.
Yetkazishdan keyingi tekshiruv #
Bu bo'lim - butun darslikning xulosasi. Har bir sozlama amalda ishlayotganini tasdiqlaymiz:
for f in ReadonlyRootfs CapDrop PidsLimit Memory SecurityOpt; do
printf '%-16s %s\n' "$f" \
"$(docker inspect dokon-ilova-1 -f "{{.HostConfig.$f}}")"
done
docker inspect dokon-ilova-1 -f 'Foydalanuvchi {{.Config.User}}'
ReadonlyRootfs true
CapDrop [ALL]
PidsLimit 100
Memory 134217728
SecurityOpt [no-new-privileges:true]
Foydalanuvchi dokon
Oltita qator, oltita himoya qatlami - va hammasi tekshirildi.
Tarmoq ajratish #
docker network inspect dokon_orqa \
-f '{{range .Containers}}{{.Name}}
{{end}}' | sort | grep .
dokon-baza-1
dokon-ilova-1
Faqat ikki konteyner orqa tarmoqda. Boshqa hech kim bazaga yaqinlasha olmaydi.
Ma'lumot saqlanishi #
To'plamni butunlay o'chirib, qaytadan ko'taramiz:
docker compose down >/dev/null 2>&1
docker compose up -d --wait >/dev/null 2>&1
sleep 2
docker compose exec -T baza psql -U postgres -d dokon -t -A -c \
'SELECT count(*) FROM buyurtma'
1
Yozuv joyida - dokon-ma hajmi ma'lumotni saqlab qoldi.
Zaxira #
docker run --rm -v dokon_dokon-ma:/ma -v /tmp/loyiha:/zaxira \
alpine:3.21 tar czf /zaxira/dokon-ma.tar.gz -C /ma . 2>/dev/null
test -s /tmp/loyiha/dokon-ma.tar.gz && echo "zaxira yaratildi"
zaxira yaratildi
Yuqoridagi usul umumiy hajmlar uchun to'g'ri: yuklangan rasmlar, hujjatlar.
Ishlayotgan baza uchun esa u xavfli - fayl nusxasi tranzaksiya o'rtasida olinishi mumkin. To'g'ri yo'l:
docker compose exec -T baza pg_dump -U postgres dokon \
| gzip > zaxira/dokon-$(date +%F).sql.gz
Tiklashni ham sinab ko'ring - sinalmagan zaxira zaxira emas.
Toza to'xtash #
Eng oxirgi tekshiruv - ilova SIGTERM ni to'g'ri ushlaydimi:
docker compose stop ilova >/dev/null 2>&1
docker inspect dokon-ilova-1 -f 'Chiqish kodi: {{.State.ExitCode}}'
Chiqish kodi: 0
Nol, 137 emas. Ilova signalni oldi, ishini tugatdi va o'zi chiqdi - 2-bobda boshlangan mavzu shu bilan yopiladi.
Yakuniy tekshiruv ro'yxati #
| Tekshiruv | Bob | Buyruq |
|---|---|---|
| Aniq versiya tegi | 3 | docker inspect -f '{{.Config.Image}}' |
| Qatlam tartibi to'g'ri | 5 | docker build ikkinchi marta - CACHED |
| Qurish vositalari yo'q | 7 | docker run ... which gcc |
| Ma'lumot hajmda | 8 | docker volume ls |
| Baza porti chiqmagan | 9 | docker ps --format '{{.Ports}}' |
| Sir tarixda yo'q | 10 | docker history --no-trunc |
| Salomatlik tekshiruvi bor | 12 | .State.Health.Status |
| Jurnal aylanishi | 13 | .HostConfig.LogConfig |
| Resurs chegaralari | 14 | .HostConfig.Memory |
| Norut foydalanuvchi | 15 | .Config.User |
| Imkoniyatlar tashlangan | 15 | .HostConfig.CapDrop |
| Obraz skanerlangan | 15 | Trivy CI da |
| Toza to'xtash | 6 | .State.ExitCode = 0 |
| Zaxira ishlaydi | 18 | Tiklashni sinang |
Bundan keyin nima? #
Bu darslik bitta mashinadagi konteynerlar haqida edi. Keyingi qadamlar:
| Mavzu | Nima beradi |
|---|---|
| Kubernetes | Ko'p serverga tarqatish, avtomatik tiklanish |
| Docker Swarm | Soddaroq orkestrator, Compose sintaksisiga yaqin |
| Infratuzilma kod sifatida | Terraform, Ansible |
| Kuzatuv | Prometheus, Grafana, Loki |
| Xizmat to'ri | Istio, Linkerd - xizmatlar orasidagi TLS |
Lekin ularning hammasi shu darslikdagi asoslarga tayanadi: obraz, qatlam, tarmoq, hajm, salomatlik tekshiruvi va signallar.
- O'lchang, taxmin qilmang. Bu darslikda
pingningCAP_NET_RAWsiz ishlashi ham, shell shaklningshni PID 1 qilmasligi ham taxminga zid chiqdi. - Tekshiring. Compose fayliga yozilgan sozlama amalda
ishlashini
docker inspectbilan tasdiqlang. - Kichik saqlang. Kichik obraz tez yuklanadi, kam zaiflik olib keladi va tushunish osonroq.
Xulosa #
- To'liq loyiha: uch bosqichli Dockerfile, testlar qurish ichida, registry ga nashr, Compose bilan yetkazish.
- Test SIGTERM ishlovchisi borligini majburiy qiladi - kimdir uni olib tashlasa qurish yiqiladi.
- Yakuniy obraz 20 MB va root sifatida ishlamaydi.
- Yetkazishdan keyin oltita himoya sozlamasi
docker inspectbilan tasdiqlandi. - Baza faqat orqa tarmoqda - tashqaridan ko'rinmaydi.
- To'plam butunlay o'chirilib qayta ko'tarilganda ham ma'lumot saqlandi.
- Umumiy hajmni
tarbilan, bazani esapg_dumpbilan zaxiralang. - Sinalmagan zaxira - zaxira emas.
- Toza to'xtash chiqish kodi 0 - 2-bobdagi 137 muammosi hal qilindi.
- Keyingi qadam - orkestrator, lekin u ham shu asoslarga tayanadi.
- Loyihani noldan yarating: Dockerfile, compose.yaml,
.dockerignore. sinovbosqichiga o'z tekshiruvingizni qo'shing.- Testni ataylab buzib, qurish to'xtashini ko'ring.
- Mahalliy registry ga nashr qiling.
- Trivy bilan skanerlang.
compose up -d --waitbilan yetkazing.- Oltita himoya sozlamasini
docker inspectbilan tasdiqlang. - Bazani
pg_dumpbilan zaxiralang va tiklang. compose stopdan keyin chiqish kodini tekshiring.- Butun tekshiruv ro'yxatini skriptga aylantirib, CI ga qo'shing.
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.