Technologie i infrastruktura → Docker Kompozyt i Dev Środowisko
Środowisko Docker Compose i Dev
1) Dlaczego komponować
Docker Compose to szybki sposób na podniesienie repliki stosu produkcyjnego w lokalizacjach/CI: aplikacje, bazy danych, kolejki, bufory, odwrotny proxy, usługi ioc. Cele:- Parytet ze sprzedażą (obrazy, zmienne, sieci) → mniej „działa dla mnie”.
- Szybki start dla początkujących → 'makijaż' i do walki.
- Pojedyncze stoiska per developer/branch → równoległa praca bez konfliktów.
- Testy integracyjne na rzeczywistych zależnościach.
2) Podstawowa struktura repozytorium
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 (опционально)
Zalecenia:
- komponować. yaml - opisuje „szkielet” (usługi, sieci, woluminy) ten sam dla dev/CI.
- override - tylko edycje lokalne: mapowania katalogów, porty, flagi debug.
- .env. przykład → programista kopiuje do '.env' i zastępuje wartości.
3) Ramy komponować. yaml (przykład)
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: {}
Najważniejsze punkty:
- Traefik/NGINX jako brama: przybliża schemat routingu do sprzedaży.
- Healthcheck i depends_on with 'condition: service_healthy' (w v3 za pośrednictwem czekających skryptów) - uporządkowany start.
- Woluminy trwałości (DB/cache) i mocowania wiązanego do kodu (hot-reload).
4) Profile i wiele plików
Profile ("profile: [dev, ci, extras]") obejmują/wyłączają usługi ("docker compose --profile extras up -d').
Wiele plików:- 'docker komponować -f komponować. yaml -f komponować. dev. yaml up '- scalanie konfiguracji.
- "towarzysz. yaml' jest podstawowy.
- "towarzysz. dev. yaml' - oprawy wiążące, debagi, ficheflagi.
- "towarzysz. dodatki. yaml' - instrumentalny (Grafana, pgAdmin, Kafdrop).
- "towarzysz. ci. yaml' - „głowa bez grafiki”, bez mocowań wiązanych.
5) Zmienne, sekrety i ustawienia
.env - wspólne źródło zmiennych: hosty, testowe kredyty bazy danych, flagi.
Nie utrzymujemy wyraźnie tajemnic w dev; używamy:- lokalne sekrety manekinów (klucze kijowe),
- integracja z chudym skarbcem/sops dla wyjątkowo wrażliwych.
- Zasada: minimalne wymagane dane. PAN/PII - żetony/poprawki.
6) Zespoły i prędkość
6. 1 wielostopniowy zestaw +
Dockerfile z celami 'base', 'dev', 'prod'; wspólna warstwa pamięci podręcznej dla zależności.
Dodaj do zestawu: 'DOCKER _ BUILDKIT = 1' (lub w konfiguracji).
Buforowanie: '--mount = type = cache, target =/root/.cache/...' dla pip/npm/maven.
6. 2 Szybki cykl
Bind-mount кода + hot-reload (nodemon, uvicorn --reload, Spring Devtools).
Osobny cel dev z montażem tylko pożądanego.
Makefмела: „makijaż”, „zrób w dół”, „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, migracje, bocznica
Migracje (Flyway/Liquibase/Alembic/Prisma) uruchamiane są za pomocą skryptu haka po rozpoczęciu 'db' (czekając na kontrolę zdrowia).
bocznica: oddzielny pojemnik na „nasiona” z oprawami; powtarzalne i idempotentne.
Migawki danych: wolumin 'pgdata' można zresetować/przywrócić za pomocą skryptu 'reset-db'. sh '.
8) Brokerzy, bufory, CDC
Kafka/Królik/Redpanda - jak w prod (minimalne konfiguracje).
Redis z AOF włączone do realizmu.
Złącza CDC (opcjonalnie): Debezium w osobnej usłudze do testów analizy integracji.
9) Zewnętrzne kpiny dostawcy
WireMock/Prism for REST, MockServer dla skomplikowanych scenariuszy.
Mailhog/SMTP4Dev za listy.
Localstack/MinIO dla sklepów w chmurze i kompatybilności S3.
Polityka: wszystkie zewnętrzne PSP/KYC/KMS - za pośrednictwem mock hub w ramach umów (OpenAPI), a nie „w Internecie”.
10) Reverse proxy i TLS
Traefik/NGINX dystrybuuje usługi do domen lokalnych ('.test', '.local'):- 'api. lokalne. test „,” mokpsp. lokalne. test ".
- TLS: mkcert do wydania zaufanego certyfikatu lokalnego w celu przetestowania plików HSTS/secure-cookies.
- Włącz sesje lepkie tylko w przypadkach, w których jest to naprawdę ważne.
11) Profile deweloperskie: Węzeł/Python/Java
Węzeł: zamontować 'węzeł _ moduły' jako pamięć podręczną (objętość), aby przyspieszyć instalację; „CHOKIDAR _ USEPOLLING = 1” w systemie Windows/WSL.
Python: 'pip cache' кай volume, 'watchfiles '/' uvicorn --reload'.
Java: JRebel/Devtools, 'mvn -T 1C -o' + warstwa z zależnościami.
12) Badania i jakość
Wyścig testów integracyjnych wewnątrz sieci Compose: 'docker compose run test'.
Testcontainers (dla JVM/Node/Python/.NET) jest dobrą opcją do integracji jednostek bez pełnego stosu.
Testy kontraktowe z → brama mock hub w CI.
Linters/Pre-commit: uruchom w kontenerze dla powtarzalności.
13) Devcontainers i „IDE-as-code”
"devcontainer. json 'naprawia obraz dewelopera (CLI, SDK, lintery), montuje projekt, uruchamia' Post 'Command'.
Zysk: te same narzędzia, nie „zatkać” host, nowa maszyna jest gotowa w kilka minut.
14) Bezpieczeństwo w dev
Bez korzenia w obrazach aplikacji; „w miarę możliwości” w trybie readMRootFilesystem.
Brak kluczy bitewnych/tajemnic, nawet tymczasowo.
Kłody - bez PII/PAN; maskowanie na poziomie formatera.
Segregacja portów i sieci: dostęp zewnętrzny tylko przez bramę.
15) FinOps/wydajność w lokalnym
Zasoby limitu: "wdrożyć. zasoby. limity "(Kompozycja czyta częściowo, ale pomaga dyscypliny).
Zmniejszenie wentylacji (mniejsza liczba usług domyślnych; dodatki - profile).
Pamięć podręczna i pamięć podręczną dla menedżerów pakietów.
16) CI Komponuj
Użyj tego samego 'kompose. yaml' + 'komponować. ci. yaml' bez mocowania wiązanego.
Bufory zależności są jak woluminy przyłączane między zadaniami/warstwami.
Równoległe jabs: 'name:' w Compose jest inny (lub przedrostek według gałęzi) tak, że stoiska nie kolidują.
17) Handel towarami
'docker compose ps'/' logs -f '/' exec' - podstawowa diagnostyka.
Sprawdź DNS w sieci Compose (usługa po nazwie).
Jeśli mocowanie wiązania „zwalnia” w systemie macOS/Windows - ': buforowane '/': delegowane' lub Mutagen/virtiofs.
Healthcheck jest „zielony”, ale usługa jest „martwy”: sprawdź „gotowość” uppka i kolejność migracji.
18) Lista kontrolna wdrażania
1. Stos bazowy (brama, api, db, cache, kolejka) w kompozycji. yaml.
2. Edycje lokalne - in override (v.gitignore).
3. .env. przykład pełny i aktualny; 'make bootstrap' kopiuje go do '.env'.
4. Sprawdzanie stanu zdrowia i skrypt czekania bazy danych/migracji.
5. WireMock/Localstack/MinIO dla zewnętrznych dostawców.
6. boczne i migracyjne jako „sprawiają, że nasiona/migrują”.
7. Zestaw + wielostopniowe, bufory zależności.
8. Devcontainers/Makefile na szybki start.
9. Profile „dodatkowych” do narzędzi (Grafana/pgAdmin/Kafdrop).
10. CI używa tego samego kompozytu (+ ci-overlide).
19) Anty-wzory
„Monster-compose” dla 40 usług, zawsze działa: włącz profile.
Ciężko przybite porty, które konflikty między deweloperami.
Sekrety/klucze w Git lub '.env. przykład ".
Zależność od „Internetu” dla testów (real PSP/KYC).
Brak kontroli zdrowia/oczekiwania - migracja i start wyścigów.
Brak bocznicy → testy integracji płatków.
20) Sedno sprawy
Kompozyt jest silnikiem prędkości rozwoju: jeden plik opisuje Twój świat usług, a profile/nadrzędne dają elastyczność. Utrzymuj parytet ze sprzedażą, zautomatyzuj bocznicę i migracje, utrzymuj moki i TLS „jak w walce”, przyspiesz budowanie Kit - i masz lokalne środowisko, w którym wygodnie jest pracować, łatwo testować i bezpiecznie odtwarzać scenariusze sprzedaży iGaming/fintech.