用 Docker Compose 编排本地开发环境

团队里每个人本地配环境的痛苦大家都懂:版本不一致、依赖冲突、装了卸卸了装。自从用 Docker Compose 统一开发环境后,新人入职第一天就能跑起来项目。分享一套我用了两年的实践。

核心思路

一个 docker-compose.yml 定义所有依赖服务(数据库、缓存、队列),应用代码本身在容器外用 IDE 跑,通过 Docker 网络访问容器内的服务。这样既保证了依赖统一,又不影响调试体验。

一个典型配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
version: "3.9"
services:
  postgres:
    image: postgres:16
    ports: ["5432:5432"]
    environment:
      POSTGRES_PASSWORD: dev123
    volumes:
      - pgdata:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql

  redis:
    image: redis:7-alpine
    ports: ["6379:6379"]

  mailhog:
    image: mailhog/mailhog
    ports: ["1025:1025", "8025:8025"]

volumes:
  pgdata:

几个要点:

  • 数据卷持久化pgdata 卷保证容器重建后数据还在
  • 初始化脚本init.sql 挂到 docker-entrypoint-initdb.d/,首次启动自动执行
  • 邮件测试:Mailhog 拦截所有发信,UI 在 8025 端口查看

一组好用的 Makefile 命令

1
2
3
4
5
6
7
8
9
.PHONY: up down logs reset
up:
	docker compose up -d
down:
	docker compose down
logs:
	docker compose logs -f --tail=100
reset:
	docker compose down -v && docker compose up -d

新人 clone 下来,make up 就齐活了。

性能小坑

macOS 上挂载代码到容器内会很慢,但我们的方案是应用不进容器,所以没这个问题。如果非要把代码也挂进容器,建议用命名卷或者 :cached 选项。

写在最后

这套方案最大的好处是确定性 —— 在我机器上能跑,在你机器上也一定能跑。节省下来的扯皮时间,足够多写几个 feature 了。