Технология жана инфраструктура → Docker Compose жана Dev-чөйрө
Docker Compose жана Dev-чөйрө
1) Эмне үчүн Compose
Docker Compose - жергиликтүү/CI прод-стек репликасын көтөрүүнүн тез жолу: тиркемелер, DD, кезектер, кэштер, тескери прокси, мок кызматтары. Максаттары:- Азык-түлүк менен паритет (сүрөттөр, өзгөрмөлүүлөр, тармактар) → азыраак "мен үчүн иштейт".
- Тез башталгыч → 'make up' жана согушка баштоо.
- Иштеп чыгуучу/бутагы боюнча изоляцияланган стенддер → чыр-чатактар жок параллелдүү иштөө.
- чыныгы көз карандылык боюнча интеграциялык тесттер.
2) Репозиторийдин базалык түзүмү
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 (опционально)
Сунуштар:
- compose. yaml - dev/CI үчүн бирдей "скелетти" (кызматтарды, тармактарды, томдорду) сүрөттөйт.
- override - бир гана жергиликтүү түзөтүүлөр: каталогдордун mappings, порттор, debug-желектери.
- .env. example → иштеп '.env' көчүрүп жана баалуулуктарды койду.
3) каркас compose. yaml (мисал)
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: {}
Негизги пункттар:
- Traefik/NGINX gateway катары: азык-түлүк багыттоо схемасын жакындатат.
- Healthcheck жана depends_on менен 'condition: service_healthy' (waiting скрипттери аркылуу v3) - иреттүү башталышы.
- Туруктуу үчүн Volumes (DB/кэш) жана код үчүн bind-mount (hot-reload).
4) Профилдер жана бир нече файлдар
Profiles ('profiles: [dev, ci, extras]') кызматтарды камтыйт/жокко чыгарат ('docker compose --profile extras up -d').
Бир нече файлдар:- `docker compose -f compose. yaml -f compose. dev. yaml up '- конфигурацияларды бириктирүү.
- `compose. yaml '- негизги.
- `compose. dev. yaml '- bind-mounty, debag, phicheflagy.
- `compose. extras. yaml '- аспаптык (Grafana, pgAdmin, Kafdrop).
- `compose. ci. yaml '- "графикасыз баш", bind-mount жок.
5) Өзгөрмөлүү, сырлар жана жөндөөлөрү
.env - өзгөрмөлөрдүн жалпы булагы: хосттар, тесттик маалымат каражаттары, желектер.
Биз дөө сырларды ачык сактабайбыз; колдонобуз:- жергиликтүү dummy-сырлар (баскычтар),
- өзгөчө сезимтал үчүн skinny-Vault/SOPS менен бириктирүү.
- Принцип: минималдуу зарыл маалыматтар. PAN/PII - токендер/фикстуралар.
6) чогултуу жана ылдамдыгы
6. 1 Multi-stage + BuildKit
Dockerfile 'base', 'dev', 'prod' максаттары менен; көз карандылык үчүн жалпы cache-layer.
BuildKit киргизүү: 'DOCKER _ BUILDKIT = 1' (же config).
Кэш: '--mount = type = cache, target =/root/.cache/...' үчүн pip/npm/maven.
6. 2 Тез айлампа
Bind-mount кода + hot-reload (nodemon, uvicorn --reload, Spring Devtools).
гана керектүү чогултуу менен өзүнчө максаты dev.
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) БД, миграция, сидинг
Миграциялар (Flyway/Liquibase/Alembic/Prisma) 'db' (healthcheck күтүү) башталгандан кийин хук-скрипт менен башталат.
Siding: бекиткичтер менен өзүнчө контейнер 'seed'; кайталануучу жана идемпотенттик.
Snapshot берилиштер: том 'pgdata' 'reset-db скрипти менен кайра/калыбына келтирилиши мүмкүн. sh`.
8) Брокерлер, кэш, CDC
Kafka/Rabbit/Redpanda - тамак-аш сыяктуу (минималдуу config).
Redis AOF реалдуулук үчүн киргизилген.
CDC Connectors (кошумча): Debezium интеграциялык аналитикалык тесттер үчүн өзүнчө кызматта.
9) Моки тышкы берүүчүлөр
WireMock/Prism үчүн REST, MockServer үчүн татаал жагдайлар.
Mailhog/SMTP4Dev каттар үчүн.
Cloud Stores жана S3 шайкештиги үчүн Localstack/MinIO.
Саясат: бардык тышкы PSP/KYC/KMS - "Интернетке" эмес, контракттар боюнча мок-хаб (OpenAPI) аркылуу.
10) тескери прокси жана TLS
Traefik/NGINX жергиликтүү домендер боюнча кызматтарды бөлүштүрөт ('.test', '.local'):- `api. local. test`, `mockpsp. local. test`.
- TLS: mkcert HSTS/secure-cookies сыноо үчүн ишенимдүү жергиликтүү күбөлүк берүү.
- Sticky сессияларын бул чындап маанилүү болгон учурларда гана киргизиңиз.
11) Иштеп профилдери: Node/Python/Java
Node: mount 'node _ modules' орнотууну тездетүү үчүн кэш катары (volume); 'CHOKIDAR _ USEPOLLING = 1' Windows/WSL боюнча.
Python: `pip cache` как volume, `watchfiles`/`uvicorn --reload`.
Java: JRebel/Devtools, 'mvn -T 1C -o' + көз каранды катмар.
12) тесттер жана сапаты
Интеграциялык тесттер тармак Compose ичинде кууп: 'docker compose run test'.
Testcontainers (JVM/Node/Python/.NET үчүн) - толук топтому жок бирдиктүү интеграция үчүн жакшы вариант.
Контракты-тесттер менен МОК-хаб → СИде gate.
Linters/Pre-commit: кайталоо үчүн контейнерге баштоо.
13) Devcontainers жана "IDE-сыяктуу-код"
`devcontainer. json 'кен сүрөтүн (CLI, SDK, linters), монтаждоо долбоорун, кууп' postCreateCommand '.
Пайда: бирдей куралдар, "таштанды" хост эмес, жаңы машина - бир мүнөттө даяр.
14) Коопсуздук боюнча dev
Колдонмо сүрөттөрүндө root жок; 'readOnlyRootFilesystem' мүмкүн болгондо.
Аскердик ачкычтар/сырлар жок, ал тургай убактылуу.
Логи - PII/PAN жок; Форматтын деңгээлинде жашыруу.
Портторду жана тармактарды сегрегациялоо: тышкы кирүү gateway аркылуу гана.
15) FinOps/жергиликтүү аткаруу
Ресурстарды чектөө: 'deploy. resources. limits '(Compose жарым-жартылай окуйт, бирок тартипке жардам берет).
Күйөрман чыгууну азайтыңыз (демейки боюнча азыраак кызматтар; extras - профилдер).
BuildKit кэш жана пакет менеджерлери үчүн көлөмдүү кэш.
16) CI с Compose
Ошол эле 'compose' колдонуңуз. yaml` + `compose. ci. yaml 'bind-mountes жок.
Caches көз карандылыгы - джобдор/катмарларынын ортосундагы attachable volumes сыяктуу.
Параллель Jobs: 'name:' ар түрдүү Compose (же бутагы боюнча префикс), ошондуктан стенддер карама-каршы келбейт.
17) Трабшутинг
'docker compose ps '/' logs -f '/' exec' - негизги диагностика.
Compose тармагында DNS текшерүү (аты-жөнү боюнча кызмат).
Эгерде bind-mount macOS/Windows боюнча "тормозит" - ': cached '/': delegated' же Mutagen/virtiofs.
Healthcheck "жашыл", ал эми кызмат "өлгөн": текшерүү 'readiness' сиздин appki жана көчүрүү тартиби.
18) Киргизүү чек-тизмеси
1. Негизги стек (gateway, api, db, cache, queue) compose. yaml.
2. Жергиликтүү өзгөрүүлөр - override (.gitignore).
3..env. example толук жана актуалдуу; 'make bootstrap' аны '.env' ге көчүрүп алат.
4. Healthchecks жана күтүү скрипт DD/көчүрүү.
5. тышкы провайдерлер үчүн WireMock/Localstack/MinIO.
6. Командлеттер катары Siding жана көчүрүү 'make seed/migrate'.
7. BuildKit + multi-этап, көз карандылык кэш.
8. Devcontainers/Makefile тез баштоо үчүн.
9. Инструменттер үчүн 'extras' профилдери (Grafana/pgAdmin/Kafdrop).
10. CI ошол эле compose (+ ci-оверрайд) колдонот.
19) Анти-үлгүлөрү
"Monster compose" боюнча 40 кызматтар, ар дайым иштеп жатат: Profiles киргизүү.
Иштеп чыгуучулардын ортосунда карама-каршы келген катуу чөмүлгөн порттор.
Сырлар/Git же '.env. example`.
тесттер үчүн "Интернет" көз карандылык (чыныгы PSP/KYC).
Healthcheck/күтүүнүн жоктугу - миграция жана баштоо жарышы.
Сидинг жоктугу → flaky интеграциялык тесттер.
20) Жыйынтык
Compose иштеп чыгуу ылдамдыгы кыймылдаткычы болуп саналат: бир файл сиздин кызмат дүйнөсүн сүрөттөйт, ал эми профилдер/оверрайддар ийкемдүүлүктү берет. Азык-түлүк менен паритетти сактаңыз, сидингди жана миграцияны автоматташтырыңыз, мокторду жана TLSди "согушкандай" сактаңыз, BuildKit 'тин жыйындыларын тездетиңиз - жана сиз иштөөгө ыңгайлуу, тестирлөө оңой жана iGaming/Fintech азык-түлүк сценарийлерин коопсуз ойнотуучу жергиликтүү чөйрөгө ээ болосуз.