Skip to main content

Compose 解决什么问题

真实应用很少只有一个容器,一个典型项目可能同时包含 Web 应用、数据库和缓存。不用编排工具时,你需要手动执行多条 docker run,还要保证启动顺序、网络和挂载都正确,命令又长又容易出错。Docker Compose 把整套应用定义在一个 docker-compose.yml 文件里:一条 docker compose up -d 启动所有服务,一条 docker compose down 整体拆除。

安装

Compose 已经是 Docker 的内置子命令,不再需要单独安装。执行 docker compose version,能输出版本号即说明可用。
旧的独立命令是 docker-compose(带连字符)。新版本统一为 docker compose(空格分隔)。两者功能基本一致,本文全部使用新写法。

docker-compose.yml 结构总览

Compose 文件有三个顶层字段:
其中 services 的每个键是一个服务名;同一网络内的服务可以用服务名互相访问;命名数据卷用于数据持久化。

服务定义逐字段讲解

healthcheck 的子字段示例:
depends_on 只控制启动顺序,默认不等待依赖服务「就绪」。配合 condition: service_healthy 使用,可以等待依赖服务的健康检查通过后再启动。

常用命令表

所有命令都在 docker-compose.yml 所在目录执行,Compose 以目录名作为项目名。

完整示例:Web + Redis + MySQL

下面是一个三服务应用的完整 docker-compose.yml:

.env 环境变量文件

Compose 会自动读取同目录下的 .env 文件,用于替换 YAML 中的变量占位符(见上方完整示例)。注意把 .env 加入 .gitignore,不要把密码提交进版本库。
.env 文件只做变量替换,不会自动注入容器。要让容器内读到环境变量,仍需在 environmentenv_file 中显式声明。

常用工作流

开发环境热挂载

把本地代码目录挂载进容器,改代码即时生效:

重建镜像

代码或依赖变化后,先重建再启动。也可以加 --build 合并成一步:
排查问题时用 docker compose logs -f web 盯单个服务的日志,比看全部服务的混合输出更清晰。

延伸阅读