GH GambleHub

技术和基础设施→ 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的销售场景。

Contact

联系我们

如需任何咨询或支持,请随时联系我们。我们随时准备提供帮助!

开始集成

Email — 必填。Telegram 或 WhatsApp — 可选

您的姓名 可选
Email 可选
主题 可选
消息内容 可选
Telegram 可选
@
如果填写 Telegram,我们也会在 Telegram 回复您。
WhatsApp 可选
格式:+国家代码 + 号码(例如:+86XXXXXXXXX)。

点击按钮即表示您同意数据处理。