docker compose 编排微服务需按业务拆分为独立 service,通过 docker-compose.yml 统一定义网络、依赖与配置;各服务用服务名通信,敏感信息外置,健康检查替代 depends_on,日志与网络隔离保障稳定。

用 Docker Compose 编排多容器微服务,核心是把每个服务写成独立的 service,通过 docker-compose.yml 统一定义网络、依赖、挂载和启动顺序,让多个容器像一个应用一样协同工作。
明确服务拆分与职责边界
微服务不是越多越好,先理清业务模块:比如用户服务(user-service)、订单服务(order-service)、API 网关(gateway)、Redis 缓存、PostgreSQL 数据库。每个服务应有清晰接口和单一职责,避免强耦合。
建议做法:
- 每个服务单独放在一个子目录(如
./user-service/),含自己的Dockerfile和配置文件 - 对外暴露端口仅限必要端口(如 gateway 暴露 80,其他服务只在内部网络通信)
- 数据库、缓存等基础设施服务不写业务逻辑,专注可靠性和可配置性
编写可复用、易维护的 docker-compose.yml
不要把所有配置堆在一个大文件里。推荐分层管理:基础服务(db、redis)+ 核心业务服务 + 可选工具(如 pgadmin、kafka-ui)。使用 extends 或 profiles 控制启停组合。
关键配置示例:
version: '3.8'
services:
gateway:
build: ./gateway
ports: ["80:8080"]
depends_on:
- user-service
- order-service
environment:
- SPRING_PROFILES_ACTIVE=docker
networks: [micro-net]
<p>user-service:
build: ./user-service
environment:</p>
- SPRING_REDIS_HOST=redis
- SPRING_DATASOURCE_URL=jdbc:postgresql://postgres:5432/userdb networks: [micro-net] restart: on-failure
postgres: image: postgres:15-alpine environment:
- POSTGRES_DB=userdb
- POSTGRES_PASSWORD=devpass volumes: ["pg-data:/var/lib/postgresql/data"] networks: [micro-net]
redis: image: redis:7-alpine command: redis-server --appendonly yes volumes: ["redis-data:/data"] networks: [micro-net]
volumes: pg-data: redis-data:
networks: micro-net: driver: bridge
注意:depends_on 只控制启动顺序,不等待服务就绪;真正健康检查要用 healthcheck 配合 condition。
处理服务间通信与配置注入
容器内调用不用 localhost,而用服务名作为 DNS 名(Docker 内置 DNS 解析)——http://user-service:8080/api/users 是合法且推荐的写法。
配置管理建议:
- 敏感信息(密码、密钥)用
env_file或 Docker Secrets(生产环境) - 不同环境(dev/test/prod)用多份 yml 文件叠加:
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up - 服务发现靠 DNS + 健康检查,避免硬编码 IP 或端口
本地调试与日志协同排查
开发阶段快速验证:
- 启动全部服务:
docker-compose up -d - 看实时日志:
docker-compose logs -f gateway或-f user-service order-service - 进某个容器调试:
docker-compose exec user-service sh - 一键重启单个服务:
docker-compose restart user-service
常见问题定位点:
- 服务启动后立即退出 → 查
docker-compose logs <service></service>看错误栈 - 网关调不通下游 → 先
exec进 gateway 容器,curl -v http://user-service:8080/actuator/health - 数据库连不上 → 检查
depends_on是否生效 +healthcheck是否通过 + JDBC URL 中主机名是否为服务名
不复杂但容易忽略:网络隔离、健康检查、配置外置、日志统一输出路径,这些才是多容器长期稳定运行的关键。










