用 Docker Compose 搭建微服务本地环境需理清依赖、隔离网络、控制启动节奏:定义最小模块(gateway、user-service等),各服务独立目录;使用自定义网络 micro-net 实现服务名通信;用 healthcheck + condition: service_healthy 替代 depends_on;敏感配置通过 .env 管理,日志输出 stdout。

直接用 Docker Compose 搭建多容器微服务本地环境,关键不是堆服务,而是理清依赖、隔离网络、控制启动节奏。不需要 Kubernetes,一套 YAML 就能跑通开发全流程。
拆清楚服务边界再动手
别一上来就写 docker-compose.yml。先画出最小可用模块:比如 gateway(对外入口)、user-service(用户逻辑)、order-service(订单逻辑)、postgres(数据)、redis(缓存)。每个服务独立目录,自带 Dockerfile 和配置文件,互不嵌套。
- gateway 只暴露 80 或 443,其他服务不映射主机端口,只在内部网络通信
- postgres 和 redis 不写业务代码,专注用 environment 和 volume 控制初始化与数据落盘
- 服务间调用用服务名(如 jdbc:postgresql://postgres:5432/userdb),不是 localhost 或 IP
用自定义网络打通服务通信
Docker 默认 bridge 网络不支持服务名解析。必须声明一个专用网络,所有 service 都显式加入:
- 在 docker-compose.yml 里定义 networks: 块,比如名为 micro-net
- 每个 service 下加 networks: [micro-net]
- 这样 user-service 就能直接 ping order-service,无需额外配置 DNS 或 hosts
靠 healthcheck 替代 depends_on
depends_on 只等容器启动,不等服务就绪——数据库可能容器起来了,但 pgsql 还没完成初始化。真正可靠的做法是加健康检查:
- 给 postgres 加 healthcheck,检测 5432 端口是否可连 + 执行简单 SQL
- 在 user-service 的 depends_on 后加条件:condition: service_healthy
- 这样 gateway 才会等到 user-service 真正 ready 后才启动,避免 502 错误
敏感配置和日志别硬编码
密码、密钥、数据库地址这些不能写死在 YAML 里:
- 用 .env 文件管理变量,docker-compose.yml 中引用 ${DB_PASSWORD},启动时自动加载
- 日志统一输出到 stdout,别挂载宿主机路径;需要持久化时用 logging.driver + options 控制轮转
- 临时调试可加 volumes 把配置文件或日志目录映射出来,上线前删掉


















