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 的子字段示例:
常用命令表
所有命令都在
docker-compose.yml 所在目录执行,Compose 以目录名作为项目名。
完整示例:Web + Redis + MySQL
下面是一个三服务应用的完整docker-compose.yml:
.env 环境变量文件
Compose 会自动读取同目录下的.env 文件,用于替换 YAML 中的变量占位符(见上方完整示例)。注意把 .env 加入 .gitignore,不要把密码提交进版本库。
常用工作流
开发环境热挂载
把本地代码目录挂载进容器,改代码即时生效:重建镜像
代码或依赖变化后,先重建再启动。也可以加--build 合并成一步:
延伸阅读
- Docker 基础:单容器的基本操作
- Docker 网络:理解 Compose 自动创建的网络
- Docker 存储:数据卷的更多用法
- Kubernetes 基础:从 Compose 走向集群编排