技術和基礎設施→ Docker Compose和Dev環境
Docker Compose和Dev環境
1)為什麼Compose
Docker Compose是一種快速的方法,可以將prod堆棧復制副本提升到local/CI:應用程序、DB、隊列、緩存、反向代理、海運服務。目標是:- 與銷售(圖像,變量,網絡)的平價→少於「對我有效」。
- 新手的快速起步→ 「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相同的「骨架」(服務、網絡、卷)。
- 超級-僅本地編輯:目錄映射、端口、debug標誌。
- .env.example →開發人員復制「.env」並替換值。
3)骨架合成。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作為網關:使路由方案更接近於銷售。
- Healthcheck和depends_on condition: service_healthy'(通過waiting腳本在v3中)是一個有序的開始。
- 用於持久性的Volumes (DB/cache)和用於代碼的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-mounts,debag,ficheflagi。
- `compose.extras.yaml'-樂器(Grafana,pgAdmin,Kafdrop)。
- `compose.ci.yaml'是「沒有圖形的頭」,沒有彎腰。
5)變量,秘密和設置
.env是變量的常見來源:主機,測試DB信條,標誌。
Dev中的秘密不是顯而易見的。使用:- 本地dummy秘密(存根鍵),
- 與skinny-Vault/SOPS集成,特別敏感。
- 原則:最低要求的數據。PAN/PII是令牌/偽造品。
6)裝配和速度
6.1 Multi-stage + BuildKit
具有「基礎」,「dev」,「prod」目標的Dockerfile;相關性的通用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).
一個單獨的開發目標,只有合適的組件。
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)DB,遷移,坐下
遷移(Flyway/Liquibase/Alembic/Prisma)在「db」(等待健康)開始後由鉤形腳本觸發。
坐下:帶有填充物的單獨容器「種子」;可重復且偶然。
數據快照: 「pgdata」卷可以通過「reset-db」腳本重置/恢復。sh`.
8)經紀人,緩存,CDC
Kafka/Rabbit/Redpanda-如銷售(最小configi)。
Redis帶有AOF,用於現實主義。
CDC連接器(可選):Debezium在單獨的服務中用於集成分析測試。
9)外部供應商的洗手
用於REST的WireMock/Prism,用於復雜腳本的MockServer。
Mailhog/SMTP4Dev信件。
Localstack/MinIO用於雲堆棧和S3兼容性。
政策:所有外部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
Python: `pip cache` как volume, `watchfiles`/`uvicorn --reload`.
Node: mount 'node_modules'作為緩存(卷)加速安裝;Windows/WSL上的'CHOKIDAR_USEPOLLING=1'。
Java:JRebel/Devtools,「mvn -T 1C -o」+依賴圖層。
12)測試和質量
集成測試在Compose網絡內運行:「docker compose run測試」。
Testcontainers(用於JVM/Node/Python/.NET)是用於沒有完整堆棧的單元集成的串聯變體。
與CI的→門莫克中心進行合同測試。
Linters/Pre-commit:在容器中運行以實現重復性。
13) Devcontainers和「IDE-Acode」
`devcontainer.json"捕獲分區映像(CLI,SDK,linters),安裝項目,並運行'postCreateCommand'。
Profit:相同的工具,不是「堵塞」主機,新機器-在幾分鐘內準備就緒。
14)安全在dev
應用程序映像中沒有root; 「readOnlyRootFilesystem」。
沒有戰鬥鑰匙/秘密,甚至是暫時的。
Logi-沒有PII/PAN;格式化器級別的掩碼。
端口和網絡隔離:僅通過網關進行外部訪問。
15) FinOps/本地性能
限制資源:'deploy。resources.limits'(作品部分閱讀,但有助於紀律)。
減少風扇關閉(減少默認服務;extras-配置文件)。
用於軟件包管理器的BuildKit緩存和卷緩存。
16) CI с Compose
使用相同的'compose。yaml` + `compose.ci.yaml'沒有彎腰的山。
依存緩存-作為喬布/層之間的可連接卷。
並行的jobs:Compose中的「name:」是不同的(或分支上的前綴),因此看臺不會發生沖突。
17) Trablshuting
「docker compose ps」/「logs -f」/「exec」-基本診斷。
在Compose網絡(按名稱服務)中檢查DNS。
如果bind mount在macOS/Windows上「制動」為「:cached」/「: delegated」或Mutagen/virtiofs。
Healthcheck「綠色」,但服務「已死」:檢查您的Apps的「準備就緒」和遷移順序。
18)實施支票
1.編譯中的基本堆棧(網關,api,db,cache,queue)。yaml.
2.本地編輯-在override (v.gitignore)中。
3..env.example完整且最新;「make bootstrap」將其復制到「.env」中。
4.Healthchecks和DB/遷移等待腳本。
5.面向外部提供商的WireMock/Localstack/MinIO。
6.坐下來並遷移為「make seed/migrate」命令。
7.BuildKit+多階段,依賴性緩存。
8.Devcontainers/Makefile快速啟動。
9.工具的「extras」配置文件(Grafana/pgAdmin/Kafdrop)。
10.CI使用相同的復制(+ci-override)。
19)反模式
Git或'.env中的秘密/密鑰。example`.
40個服務上的「怪物復合」,始終運行:包括配置文件。
硬釘端口在開發人員之間發生沖突。
測試依賴「互聯網」(實際PSP/KYC)。
缺乏健康/等待-遷移和啟動競賽。
缺席→靜止集成測試。
20)結果
Compose是一個開發速度引擎:一個文件描述了您的服務世界,並且配置文件/覆蓋提供了靈活性。保持銷售平價,自動化座位和遷移,保持洗滌和TLS「像戰鬥一樣」,加快BuildKit的構建速度-並且您將擁有一個本地環境,可以方便地工作,輕松測試和安全地播放iGaming/fintech的銷售場景。