编写多服务 Docker Compose 文件的关键是将各服务定义为独立单元,通过统一网络、环境和依赖协同工作;服务名小写短横线分隔,用作内部 DNS 主机名;优先使用 version '3.8' 或 '3.9',services 为核心,image 或 build 指定镜像,端口仅暴露必要服务,敏感配置移入 .env 或 secrets,依赖 healthcheck 而非 depends_on 保障就绪,显式定义 networks 和 volumes 实现数据持久化与配置分离。

编写多服务的 Docker Compose 文件,关键是把每个服务当作独立单元来定义,再通过统一的网络、环境和依赖关系让它们协同工作。不需要写脚本或手动启动多个容器,一个 docker-compose.yml 就能管住整个应用栈。
明确服务划分与命名
每个服务对应一个职责清晰的组件,比如网关、用户服务、数据库、缓存。服务名就是它在内部网络中的主机名,其他服务用这个名字通信(如 db、redis)。
- 服务名全小写,用短横线分隔,例如
api-gateway、user-service - 避免在服务名里用下划线,Docker 内部 DNS 解析可能出问题
- 数据库、Redis 等基础设施服务不放业务代码,只专注配置和数据持久化
合理组织 docker-compose.yml 结构
文件以 version 开头,推荐使用 '3.8' 或 '3.9';核心是 services 块,其他如 networks 和 volumes 按需声明。
-
image用于直接拉取镜像(如postgres:13),build用于本地构建(如build: ./order-service) - 端口只对外暴露必要服务,比如网关开
80,其他服务不映射到宿主机,仅限内部通信 - 用
environment传配置,敏感信息(密码、密钥)应移入.env文件或secrets,别硬编码
配置服务间通信与健康保障
容器默认在同一个自定义网络里自动互通,靠服务名就能访问,但启动顺序和就绪状态要靠机制保障。
- 别依赖
depends_on控制“是否启动完成”,它只管容器是否创建,不管服务是否就绪 - 给关键服务加
healthcheck,比如 PostgreSQL 可检查pg_isready,再配合restart: on-failure - 用
networks显式定义桥接网络(如app-network),所有服务加入它,避免用默认网络
管理数据持久化与配置分离
数据库和缓存的数据必须落盘,配置要方便切换环境,不能混在 YAML 里。
- 用
volumes声明命名卷(如postgres_data:),挂载到容器内对应路径(如/var/lib/postgresql/data) - 把配置文件(如
nginx.conf、application.yml)通过volumes挂载,而不是打包进镜像 - 用
.env文件存放开发环境变量(如DB_HOST=db),Compose 会自动加载,不同环境换文件即可


















