Tehnologii și infrastructură → Docker Compune și Dev Mediu
Docker Compune și Dev mediu
1) De ce compune
Docker Compose este o modalitate rapidă de a ridica o replică a stivei de producție în locații/CI: aplicații, baze de date, cozi, cache-uri, proxy inversă, servicii ioc. Obiective:- Paritatea cu vânzările (imagini, variabile, rețele) → mai puțin „funcționează pentru mine”.
- Start rapid pentru începători → „machiaj” și în luptă.
- Standuri izolate per dezvoltator/ramură → muncă paralelă fără conflicte.
- Teste de integrare pe dependențe reale.
2) Structura depozitului de bază
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 (опционально)
Recomandări:
- compune. yaml - descrie „scheletul” (servicii, rețele, volume) la fel pentru dev/CI.
- suprascriere - numai editări locale: cartografieri, porturi, steaguri de depanare.
- .env. exemplu → dezvoltatorul copiază la „.env” și înlocuiește valorile.
3) Compune cadru. yaml (exemplu)
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: {}
Puncte cheie:
- Traefik/NGINX ca gateway: aduce schema de rutare mai aproape de cea de vânzări.
- Healthcheck și depends_on with 'condiție: service_healthy' (în v3 prin scripturi de așteptare) - un început ordonat.
- Volume pentru persistență (DB/cache) și bind-mount pentru cod (reîncărcare la cald).
4) Profiluri și mai multe fișiere
Profilurile ('profiluri: [dev, ci, figuras]') includ/exclud serviciile ('docker compose --profile extras up -d').
Mai multe fișiere:- "cocker compose -f compose. yaml -f compune. dev. yaml up '- fuzionarea configurațiilor.
- "compose. yaml' este de bază.
- "compose. dev. yaml' - bind-mounts, debags, phicheflags.
- "compose. extras. yaml' - instrumental (Grafana, pgAdmin, Kafdrop).
- "compose. ci. yaml' - „cap fără grafică”, fără bind-mounts.
5) Variabile, secrete și setări
.env - sursă comună de variabile: gazde, credite de baze de date de testare, steaguri.
Nu păstrăm secrete în dev în mod explicit; folosim:- secrete locale inactive (chei ciot),
- integrare cu skinny-seif/sops pentru extra sensibile.
- Principiu: date minime necesare. PAN/PII - jetoane/remedieri.
6) Ansambluri și viteză
6. 1 Multi-etapa + BuildKit
Dockerfile cu ținte "bază", "dev", "prod'; cache-strat comun pentru dependențe.
Includeți BuildKit: 'DOCKER _ BUILDKIT = 1' (sau în configurație).
Caching: '--mount = type = cache, target =/root/.cache/...' pentru pip/npm/maven.
6. 2 ciclu rapid
Bind-mount кода + fierbinte-reîncărcare (nodemon, uvicorn --reload, Spring Devtools).
O țintă separată dev cu un ansamblu de numai cel dorit.
Makefile цели: "make up", "make down'," make busteni "," make reconstrui "," 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, migrații, siding
Migrațiile (Flyway/Liquibase/Alembic/Prisma) sunt lansate de un script de cârlig după începerea 'db' (așteptare pentru healthcheck).
Siding: un recipient separat de „semințe” cu corpuri; repetabil și idempotent.
Instantanee de date: volumul 'pgdata' poate fi resetat/restaurat cu scriptul 'reset-db. sh ".
8) Brokeri, Caches, CDC
Kafka/Iepure/Redpanda - ca în prod (configurații minime).
Redis cu AOF inclus pentru realism.
Conectori CDC (opțional): Debezium într-un serviciu separat pentru teste de analiză a integrării.
9) Mocks furnizor extern
WireMock/Prism for REST, MockServer pentru scenarii complexe.
Mailhog/SMTP4Dev pentru scrisori.
Localstack/MinIO pentru magazinele cloud și compatibilitatea S3.
Politică: toate PSP/KYC/KMS externe - prin hub-ul mock în cadrul contractelor (OpenAPI), și nu „pe Internet”.
10) proxy inversă și TLS
Traefik/NGINX distribuie servicii către domenii locale ('.test', '.local'):- "api. local. test ',' mockpsp. local. test ".
- TLS: mkcert să emită un certificat local de încredere pentru a testa HSTS/secure-cookies.
- Activați sesiuni lipicioase numai pentru cazurile în care este cu adevărat important.
11) Profiluri dezvoltator: Node/Python/Java
Nod: montați 'node _ modules' ca memorie cache (volum) pentru a accelera instalarea; 'CHOKIDAR _ USEPOLLING = 1' pe Windows/WSL.
Python: 'pip cache' как volum, 'watchfiles '/' uvicorn --reload'.
Java: JRebel/Devtools, 'mvn -T 1C -o' + strat cu dependențe.
12) Încercări și calitate
Testele de integrare se desfășoară în interiorul rețelei Compose: „docker compose run test”.
Testcontainere (pentru JVM/Node/Python/.NET) este o opțiune bună pentru integrarea unității fără o stivă completă.
Teste de contract cu hub-ul de → poarta mock în CI.
Linters/Pre-comite: rulați în container pentru repetabilitate.
13) Devcontainere și „IDE-as-code”
"devcontainer. json "stabilește imaginea dezvoltatorului (CLI, SDK, linters), montează proiectul, rulează 'postCreateCommand'.
Profit: aceleași instrumente, nu „înfunda” gazda, noua mașină este gata în câteva minute.
14) Securitate în dev
Fără rădăcină în imaginile aplicației; 'readOnlyRootFilesystem' atunci când este posibil.
Fără chei de luptă/secrete, chiar şi temporar.
Jurnale - fără PII/PAN; mascarea la nivel de formatare.
Portul și segregarea rețelei: acces extern numai prin gateway.
15) FinOps/performanță în locale
Resurse limită: "implementare. resurse. limite "(Compune citește parțial, dar ajută la disciplină).
Reducerea fan-out (mai puține servicii implicite; extras - profiluri).
BuildKit cache și cache-uri de volum pentru managerii de pachete.
16) CI с compune
Utilizați același "compose. yaml '+' compune. ci. yaml "fără a lega mounts.
Cache-urile de dependență sunt ca volume atașabile între locuri de muncă/straturi.
Jabs paralel: „nume:” în Compose este diferit (sau prefix după ramură), astfel încât standurile să nu intre în conflict.
17) Trableshooting
'docker compose ps '/' logs -f '/' dev' - basic diagnostics.
Verificați DNS în rețeaua Compose (serviciu după nume).
Dacă bind-mount' încetinește "pe macOS/Windows -": cached "/": delegat "sau Mutagen/virtiofs.
Healthcheck este „verde”, dar serviciul este „mort”: verificați „pregătirea” uppka și ordinea migrațiilor.
18) Lista de verificare a implementării
1. Stiva de bază (gateway, api, db, cache, coadă) în compune. yaml.
2. Editări locale - în suprascriere (v.gitignore).
3.env. exemplu complet și curent; 'make bootstrap' o copiază în '.env'.
4. Healthchecks și baza de date/migrație așteptați script.
5. WireMock/Localstack/MinIO pentru furnizorii externi.
6. Siding și migrații ca „face semințe/migra” cmdlets.
7. BuildKit + cache în mai multe etape, dependență.
8. Devcontainers/Makefile pentru un început rapid.
9. Profiluri „Extras” pentru instrumente (Grafana/pgAdmin/Kafdrop).
10. CI folosește aceeași compunere (+ ci-overlide).
19) Anti-modele
„Monster-compose” pentru 40 de servicii, care rulează întotdeauna: activați profilurile.
Porturi greu bătute în cuie care intră în conflict între dezvoltatori.
Secrete/chei în Git sau '.env. exemplu ".
Dependența de „Internet” pentru teste (real PSP/KYC).
Lipsa de healthcheck/așteptare - migrație și start curse.
Nu siding → teste de integrare flaky.
20) Linia de jos
Compuneți este motorul vitezei de dezvoltare: un fișier descrie lumea dvs. de servicii, iar profilurile/suprascrie oferă flexibilitate. Mențineți paritatea cu vânzările, automatizați siding și migrațiile, păstrați moki și TLS „ca în luptă”, accelerați construirea BuildKit - și aveți un mediu local în care este convenabil să lucrați, ușor de testat și să reproduceți în siguranță scenariile de vânzări iGaming/fintech.