Տեխնոլոգիան և ենթակառուցվածքը Docker Compose և Dev-միջավայրը
Docker Compose և Dev-միջավայրը
1) Ինչու՞ Compose-ը
Docker Compose-ը արագ միջոց է բարձրացնելու prod-ապակու կրկնօրինակը locali/CI-ում 'ծրագրեր, BD, հերթեր, cashi, հակառակը։ Նպատակները
Հավասարումը երկարությամբ (պատկերներ, կոդեր, ցանցեր) ավելի քիչ «աշխատում է իմ հետ»։
Արագ մեկնարկը նորեկների համար «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 - միայն տեղական ուղղություններ 'ածխաջրածինների մապինգներ, 108, debug դրոշներ։
.env. example ռուսական մշակողը պատճենում է «.env» և սահմանում է արժեքները։
3) Campose-ը։ 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-ը 'condect: բանաձև _ healthy "(v3-ի միջոցով waiting-ջութակի միջոցով) - պատվիրված սկիզբը։
Volumes-ի համար (BD/kash) և bind-mount կոդի համար (hot-reload)։
4) Պրոֆիլներ և մի քանի ֆայլեր
Profiles («profiles: [dev, ci, extras]») ներառում են/բացառում ծառայություններ («docker compose ---- profile extras up-d»)։
Մի քանի ֆայլեր
`docker compose -f compose. yaml -f compose. dev. yamp up '- բողոքարկման։
Տիպիկ հավաքածու
`compose. yaml '- հիմնականը։
`compose. dev. yaml '- bind-mounta, deble, ficheflagy։
`compose. extras. yaml '- գործիքային (Grafana, pgAdmin, Kafdrop)։
`compose. ci. yaml '- «գլուխ առանց գրաֆիկայի», առանց bind-mounts։
5) Մոսկվա, գաղտնիքներ և բանալիներ։
.env - փոփոխականների ընդհանուր աղբյուրը 'հոստեր, թեստային BD, դրոշներ։
Dev-ի գաղտնիքները հստակ չեն պահում։ օգտագործում ենք
տեղական dummy գաղտնիքները (հալման բանալիներ),
ինտեգրումը skinny-Vox/SOPS-ի հետ հատկապես զգայուն համար։
Սկզբունքը 'նվազագույն անհրաժեշտ տվյալները։ PAN/PII - հոսանքներ/ֆիքսթեր։
6) Հավաքում և արագություն
6. 1 Multi-stage + BuildKit
Dockerfile նպատակներով 'big', «dev», «dev», «dockerfile»; ընդհանուր cache-layer կախվածության համար։
Միացրեք BuildKit: «DODKER _ BUILDKIT = 1» (կամ եզրին)։
Քեշինգը '--mount = type = cache, target =/root/.cache/... "pip/npm/maven համար։
6. 2 Արագ ցիկլ
Առանձին target dev, որը միայն անհրաժեշտ է հավաքելու համար։
Bind-mount кода + hot-reload (nodemon, uvicorn --reload, Spring Devtools).
Makefile цели: `make up`, `make down`, `make logs`, `make rebuild`, `make seed`.
Makefile-ի օրինակ
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) ԲԴ, 108, սիդինգ
Express (Flyway/Liquib.ru/Alembic/Prisma) սկսում են հուկ-ջութակը «db» (սպասելով healtheck) սկսելուց հետո։
Սիդինգը 'առանձին «seed» բեռնարկղը ֆիքսթուրներով։ կրկնվող և համակցված։
Տվյալների դիպուկահարները 'tom' pgdata 'կարելի է նետել/վերականգնել ջութակը' reset-db։ sh`.
8) Բրոկերներ, քաշներ, CDC
Kafka/Rabbit/Redpanda - ինչպես վաճառքում (նվազագույն եզրերը)։
Redis-ի հետ AOF-ը ներառվել է իրատեսության համար։
CDC կոնեկտորները (oporations) 'Debez.ru առանձին ծառայության մեջ վերլուծության ինտեգրալ թեստերի համար։
9) Արտաքին մոծակները
WireMock/Prism-ի համար, MockServer-ը բարդ գործողությունների համար։
Mailhog/SMTP4Dev նամակների համար։
Altalstack/MinIO ամպային հոսքերի և S3-2019 համար։
Քաղաքականությունը 'բոլոր արտաքին PFC/KYC/KTS-ը' պայմանագրերով (OpenAPI), ոչ թե «ինտերնետում»։
10) Հակադարձ ֆորումը և TFC-ը
Traefik/NGINX-ը բաժանում է տեղական ծառայություններ («test», «.local»)
`api. local. test`, `mockpsp. local. test`.
TFC: mkc.ru-ը վստահելի ռուսական ձեռնարկության համար փորձարկելու HSTS/secure-cookies-ը։
Sticky-նստաշրջանները միացրեք միայն այն դեպքերի համար, որտեղ դա իսկապես կարևոր է։
11) Զարգացողի պրոֆիլները ՝ Node/Python/Java
Node: mount 'node _ modules' ինչպես cash (volume), որպեսզի արագացնի install; Python: `pip cache` как volume, `watchfiles`/`uvicorn --reload`. Java: JRebel/Devtoope, «mvn-T 1C -o» + շերտը կախվածությամբ։ 12) Թեստեր և որակներ Testcontainers (JVM/Node/Python/.NET) - լավ տարբերակ unit կոդերի համար առանց ամբողջական ապակու։ Linters/Pre-commit: Նորից սկսել բեռնարկղում։ 13) Devcontainers և «IDE-ի կոդը» `devcontainer. Json '- ը գրանցում է ստրուկի պատկերը (CLI, SDK, linters), տեղադրում է նախագիծը, քշում է «PostCrement Command»։ Podit: Նույն գործիքները, մենք չենք «սայթաքում», նոր մեքենան պատրաստ է րոպեում։ 14) Dev-ի անվտանգությունը Ոչ մի ռազմական գործողություն/գաղտնիքներ, նույնիսկ ժամանակավորապես։ Ցանցերի և ցանցերի սեգրեգացիան 'արտաքին հասանելիությունը միայն gateway-ի միջոցով։ 15) FinOps/լոկալի արտադրողականությունը Սահմանափակեք ռեսուրսները 'deploy։ resources. limits '(Compose կարդում է մասամբ, բայց օգնում է կարգապահությանը)։ Քաշ BuildKit-ը և volume-cashi-ը ձեռնարկության ղեկավարների համար։ 16) CI с Compose Կախվածության քեշները որպես attachable volumes ջոբների/շերտերի միջև։ Զուգահեռ ջոբները ՝ «name: » Compose-ում տարբեր (կամ նախածանց ճյուղով), որպեսզի սթենդները չանդրադառնան։ 17) Տրաբլշուտինգը Ստուգեք RF-ը Compose ցանցում (անունով ծառայություն)։ Եթե bind-mount-ը «դանդաղեցնում» է OS/Windows-ի վրա '«: cached ': winegated» կամ Mutagen/virtiom։ Healthcheck-ը «կանաչ» է, բայց ծառայությունը «մեռած» է 'wwww.readiness' ձեր գլխարկը և միգրացիայի կարգը։ 18) Ներդրման թուղթ 1. Հիմնական հոսքը (gateway, api, db, cache, queue) compose-ում։ yaml. 2. Տեղական աջերը override (v.gitignore)։ 3..env. example ամբողջական և իրական, «make bootstrap» -ը պատճենում է այն «.env» -ում։ 4. Healthchecks-ը և BD/խմբակցությունների սպասման ջութակը։ 5. WireMock/Winalstack/MinIO արտաքին պրովայդերների համար։ 6. Սիդինգը և կոմպոզիցիան որպես «make seed/migrate» թիմեր։ 7. BuildKit + multi-stage, կախվածության քեշներ։ 8. Devcontainers/Makefile արագ սկսելու համար։ 9. Ավելցուկ «extras» գործիքների համար (Grafana/pgaDmin/Kafdrop)։ 10. CI-ն օգտագործում է նույն compose (+ ci-verraid)։ 19) Anti-patterna «Monstr-compose» -ը 40 ծառայությունների վրա, միշտ գործարկվել է 'միացրեք պրոֆիլները։ «Ինտերնետից» կախվածությունը թեստերի համար (իրական PFC/KYC)։ Գաղտնիքները/բանալիները Git-ում կամ '.env. example`. Սիդինգի բացակայությունը flaky ինտեգրացիոն թեստեր է։ 20) Արդյունքը Compose-ը զարգացող արագության շարժիչ է, մի ֆայլ նկարագրում է ձեր ծառայության աշխարհը, իսկ պրոֆիլները/werraids տալիս են ճկունություն։ Աջակցեք պարիտետին վաճառքով, ավտոմատիզացրեք նստատեղը, պահեք կամուրջները և TRC-ը «ինչպես մարտում», արագացրեք BuildKit-ի հավաքումները, և դուք կունենաք տեղական միջավայր, որտեղ հարմար է աշխատել, հեշտությամբ փորձարկել և անվտանգ վերարտադրել iGaming/fintech-ը։
Ինտեգրացիոն թեստերը հետապնդում ենք Compose-ի ցանցում '«docker compose run test»։
Պայմանագիր-թեստերը թոքթ-հի հետ CI-ում։
Առանց root դիմումների պատկերներում; «readOnlyRootem System», երբ հնարավոր է։
Լոգները 'առանց PII/PAN; դիմակավորում կերամիկական մակարդակում։
Նվազեցրեք ֆան-աուտը (ավելի քիչ ծառայություններ լռելյայն; extras - պրոֆիլներ)։
Օգտագործեք նույն «compose» -ը։ yaml` + `compose. ci. yaml 'առանց bind-mounts։
«docker compose pose ps »/« logs -f/' exec» - ռուսական ախտորոշիչ։
Կոպիտ ստեղնաշարեր, որոնք բախվում են զարգացողների միջև։
Healthcheck/սպասման բացակայությունը միգրացիաների և սկսնակների մրցավազքն է։