Texnologiyalar va infratuzilma → Docker Compose va Dev-muhit
Docker Compose va Dev-muhit
1) Nima uchun Compose
Docker Compose - prod-stek nusxasini lokal/CI: ilovalar, DD, navbatlar, keshlar, teskari proksi, mok-xizmatlarga oshirishning tezkor usuli. Maqsadlar:- Oziq-ovqat pariteti (tasvirlar, oʻzgaruvchilar, tarmoqlar) → kamroq «men uchun ishlaydi».
- Yangi boshlanuvchilar uchun tezkor start →’make up’va jangga.
- Ishlab chiquvchi/filial uchun izolyatsiya qilingan stendlar → ziddiyatsiz parallel ish.
- Haqiqiy qaramliklarda integratsiya testlari.
2) Repozitoriyning bazaviy tuzilmasi
project/
docker/
app/ # Dockerfile, скрипты web/ # Nginx/Traefik конфиги seed/ # сидеры/фикстуры compose.yaml # общий базовый стек compose.override.yaml # локальные оверрайды (в.gitignore)
compose.ci.yaml # для CI
.env.example # шаблон окружения
Makefile # удобные цели devcontainer.json # VS Code Dev Containers (опционально)
Tavsiyalar:
- compose. yaml - dev/CI uchun bir xil «skelet» (servislar, tarmoqlar, jildlar) ni tavsiflaydi.
- override - faqat lokal tuzatishlar: kataloglar mappinglari, portlar, debug-bayroqlar.
- .env. example → ishlab chiquvchi’.env’ga nusxa olib, qiymatlarni qoʻyadi.
3) compose. yaml (misol)
yaml name: project services:
gateway:
image: traefik:v3 command:
- "--providers.docker=true"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.dev.acme.tlschallenge=true"
ports: ["80:80", "443:443"]
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro networks: [edge, core]
api:
build:
context:.
dockerfile: docker/app/Dockerfile target: dev env_file: [.env]
command:./scripts/dev-start.sh volumes:
-./:/app:cached depends_on: [db, redis, kafka]
labels:
- "traefik.http.routers.api.rule=Host(`${API_HOST}`)"
- "traefik.http.services.api.loadbalancer.server.port=8080"
networks: [core]
db:
image: postgres:16 environment:
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASS}
POSTGRES_DB: ${DB_NAME}
volumes:
- pgdata:/var/lib/postgresql/data healthcheck: {test: ["CMD-SHELL","pg_isready -U $$POSTGRES_USER"], interval: 5s, timeout: 3s, retries: 20}
networks: [core]
redis:
image: redis:7 command: ["redis-server","--appendonly","yes"]
volumes: [ "redisdata:/data" ]
networks: [core]
kafka:
image: bitnami/kafka:3 environment:
KAFKA_ENABLE_KRAFT: "yes"
KAFKA_CFG_PROCESS_ROLES: "controller,broker"
KAFKA_CFG_NODE_ID: 1
KAFKA_CFG_LISTENERS: PLAINTEXT://:9092
KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092 networks: [core]
mailhog:
image: mailhog/mailhog ports: ["8025:8025"]
networks: [core]
mock-psp:
image: wiremock/wiremock:3 command: ["--verbose","--global-response-templating"]
volumes: ["./docker/mocks/psp:/home/wiremock"]
labels:
- "traefik.http.routers.mockpsp.rule=Host(`${PSP_HOST}`)"
networks: [core]
volumes:
pgdata: {}
redisdata: {}
networks:
edge: {}
core: {}
Asosiy jihatlar:
- Traefik/NGINX gateway sifatida: routing sxemasini oziq-ovqat sxemasiga yaqinlashtiradi.
- Healthcheck va depends_on s’condition: service_healthy' (v3 da waiting skriptlari orqali) - tartibli start.
- Persistentlik uchun volumes (BD/kesh) va kod uchun bind-mount (hot-reload).
4) Profillar va bir nechta fayllar
Profiles (’profiles: [dev, ci, extras]’) (’docker compose --profile extras up -d’) xizmatlarini oʻz ichiga oladi/chiqaradi.
Bir nechta fayllar:- `docker compose -f compose. yaml -f compose. dev. yaml up’- konfiguratsiyalarni quyish.
- `compose. yaml’- bazaviy.
- `compose. dev. yaml’- bind-mountlar, debag, ficheflaglar.
- `compose. extras. yaml’- instrumental (Grafana, pgAdmin, Kafdrop).
- `compose. ci. yaml’- «grafiksiz bosh», bind-mountsiz.
5) O’zgaruvchilar, sirlar va sozlamalar
.env - o’zgaruvchanlarning umumiy manbai: xostlar, test ma’lumotlari, bayroqlar.
Dev sirlarini ochiq saqlamaymiz; foydalanamiz:- mahalliy dummy-sirlar (qulflash kalitlari),
- o’ta sezgir uchun skinny-Vault/SOPS bilan integratsiya qilish.
- Printsip: minimal zarur ma’lumotlar. PAN/PII - tokenlar/fiksturalar.
6) Yig’ilishlar va tezlik
6. 1 Multi-stage + BuildKit
Dockerfile’base’,’dev’,’prod’maqsadlarida; bogʻliqlik uchun umumiy cache-layer.
BuildKit qoʻshish:’DOCKER _ BUILDKIT = 1’(yoki konfigada).
Kesh:’--mount = type = cache, target =/root/.cache/...’uchun pip/npm/maven.
6. 2 Tezkor sikl
Bind-mount кода + hot-reload (nodemon, uvicorn --reload, Spring Devtools).
Alohida target dev, faqat kerakli target.
Makefile цели: `make up`, `make down`, `make logs`, `make rebuild`, `make seed`.
make
ENV?= dev up:
docker compose --profile $(ENV) up -d down:
docker compose down -v logs:
docker compose logs -f --tail=200 rebuild:
DOCKER_BUILDKIT=1 docker compose build --pull --no-cache api seed:
docker compose run --rm api./scripts/seed.sh migrate:
docker compose run --rm api./scripts/migrate.sh test:
docker compose -f compose.yaml -f compose.ci.yaml run --rm api./scripts/test.sh
7) DB, migratsiya, siding
Migratsiyalar (Flyway/Liquibase/Alembic/Prisma)’db’(healthcheck kutish) boshlanganidan keyin xuk-skript tomonidan ishga tushiriladi.
Siding: fiksturali alohida’seed’konteyneri; takroriy va idempotent.
Maʼlumot snapshotlari: tom’pgdata’’reset-db’skripti bilan qayta/qayta tiklanishi mumkin. sh`.
8) Brokerlar, keshlar, CDC
Kafka/Rabbit/Redpanda - nasldagi kabi (minimal konfiglar).
Realistik uchun kiritilgan AOF bilan Redis.
CDC-konnektorlar (ixtiyoriy): Debezium analitikaning integratsiyalashgan testlari uchun alohida xizmatda.
9) Tashqi yetkazib beruvchilarning moxlari
REST uchun WireMock/Prism, murakkab skriptlar uchun MockServer.
Xatlar uchun Mailhog/SMTP4Dev.
Bulutli storlar va S3 mosligi uchun Localstack/MinIO.
Siyosat: barcha tashqi PSP/KYC/KMS - «Internetga» emas, balki kontraktlar bo’yicha mok-hub (OpenAPI) orqali.
10) Teskari proksi va TLS
Traefik/NGINX lokal domenlar (’.test’,’.local’) bo’yicha xizmatlarni tarqatadi:- `api. local. test`, `mockpsp. local. test`.
- TLS: mkcert - HSTS/secure-cookies sertifikatini olish uchun.
- Sticky sessiyalarini faqat bu haqiqatan ham muhim boʻlgan holatlar uchun yoqing.
11) Ishlab chiquvchi profillar: Node/Python/Java
Node: mount’node _ modules’install tezlashtirish uchun kesh (volume) sifatida;’CHOKIDAR _ USEPOLLING = 1’Windows/WSL uchun.
Python: `pip cache` как volume, `watchfiles`/`uvicorn --reload`.
Java: JRebel/Devtools,’mvn -T 1C -o’+ bogʻliqlik qatlami.
12) Testlar va sifat
Integratsiya testlarini Compose:’docker compose run test’tarmog’i ichida o’tkazamiz.
Testcontainers (JVM/Node/Python/.NET uchun) - to’liq steksiz unit integratsiyasi uchun yaxshi variant.
CIdagi mok-hub → gate bilan kontrakt-testlar.
Linterlar/Pre-commit: takrorlash uchun konteynerda ishga tushirish.
13) Devcontainers va «IDE-kod sifatida»
`devcontainer. json’rasm tasvirini (CLI, SDK, linters) qayd etadi, loyihani montaj qiladi,’postCreateCommand’ni haydaydi.
Foyda: bir xil vositalar, xostni «to’kib tashlamang», yangi mashina - bir necha daqiqada tayyor.
14) Gigandagi xavfsizlik
Ilovalarda root yoʻq;’readOnlyRootFilesystem’iloji boricha.
Jangovar kalitlar/sirlar yo’q, hatto vaqtinchalik.
Logi - PII/PANsiz; formatter darajasida niqoblash.
Portlar va tarmoqlarni ajratish: tashqi kirish faqat gateway orqali.
15) FinOps/lokal ishlash
Resurslarni cheklang:’deploy. resources. limits’(Compose qisman o’qiydi, lekin fanga yordam beradi).
Fan-autni kamaytiring (andoza xizmatlar kamroq; extras - profillar).
Paket menejerlari uchun BuildKit va volume-keshlar.
16) CI с Compose
Xuddi shu’compose’dan foydalaning. yaml` + `compose. ci. yaml’bind-mountsiz.
Bogʻliqlik keshlari - job/qatlamlar orasidagi attachable volumes kabi.
Parallel joblar:’name:’Komposeda stendlar toʻqnashmasligi uchun har xil (yoki shoxobcha boʻyicha prefiks).
17) Trablshuting
’docker compose ps ’/’ logs -f ’/’ exec’ - bazaviy diagnostika.
Kompose tarmog’idagi DNS’ni tekshiring.
Agar bind-mount macOS/Windows -’: cached ’/’: delegated’yoki Mutagen/virtiofsda «sekinlashsa».
Healthcheck «yashil», lekin «o’lgan» xizmati: appka’readiness’va migratsiya tartibini tekshiring.
18) Joriy etish chek-varaqasi
1. Kompose tarkibidagi asosiy stek (gateway, api, db, cache, queue). yaml.
2. Lokal tuzatishlar - override (v.gitignore) da.
3..env. example to’liq va dolzarbdir;’make bootstrap’uni’.env’ga ko’chiradi.
4. Healthchecks va DB/migratsiyani kutish skripti.
5. Tashqi provayderlar uchun WireMock/Localstack/MinIO.
6. ’make seed/migrate’ buyruqlari sifatida siding va migratsiya.
7. BuildKit + multi-stage, giyohvandlik keshlari.
8. Tezda boshlash uchun Devcontainers/Makefile.
9. Asboblar uchun’extras’profillari (Grafana/pgAdmin/Kafdrop).
10. CI bir xil compose (+ ci-overrayd) dan foydalanadi.
19) Anti-patternlar
«Monster-compose» 40 ta xizmatga ega, har doim ishga tushirilgan: profillarni yoqing.
Ishlab chiquvchilar o’rtasida ziddiyatli portlar.
Git yoki’.envdagi sirlar/kalitlar. example`.
Testlar uchun «Internet» ga bog’liqlik (real PSP/KYC).
Healthcheck/kutish yo’qligi - migratsiya va start poygalari.
Siding yo’qligi → flaky integratsiya testlari.
20) Jami
Kompose - bu ishlab chiqish tezligining dvigateli: bitta fayl sizning xizmat olamingizni tasvirlaydi va profillar/overradlar moslashuvchanlikni beradi. Oziq-ovqat bilan paritetni saqlang, siding va migratsiyani avtomatlashtiring, moki va TLSni «jangda bo’lgani kabi» saqlang, BuildKit’ning yig’ilishini tezlashtiring - va siz iGaming/fintech oziq-ovqat stsenariylarini ishlash, sinovdan o’tkazish va xavfsiz ravishda takrorlash uchun qulay bo’lgan mahalliy muhitga ega bo’lasiz.