Docker Compose V2 vs V1 对比指南
-
- [1. 概述](#1. 概述)
- [2. 性能对比](#2. 性能对比)
-
- [2.1 启动速度](#2.1 启动速度)
- [2.2 资源占用](#2.2 资源占用)
- [3. 新功能详解与案例](#3. 新功能详解与案例)
-
- [3.1 Watch 模式(开发热重载)](#3.1 Watch 模式(开发热重载))
- [3.2 --wait 等待服务就绪](#3.2 --wait 等待服务就绪)
- [3.3 Profiles 环境隔离](#3.3 Profiles 环境隔离)
- [3.4 更好的依赖控制](#3.4 更好的依赖控制)
- [3.5 并行构建与 BuildKit](#3.5 并行构建与 BuildKit)
- [3.6 Dry Run 模式](#3.6 Dry Run 模式)
- [3.7 多文件合并](#3.7 多文件合并)
- [4. 命令对比速查](#4. 命令对比速查)
- [5. 迁移建议](#5. 迁移建议)
-
- [5.1 命令别名(可选)](#5.1 命令别名(可选))
- [5.2 compose 文件兼容性](#5.2 compose 文件兼容性)
- [5.3 版本声明](#5.3 版本声明)
- [6. 文档信息](#6. 文档信息)
1. 概述
| 项目 | V1 | V2 |
|---|---|---|
| 命令 | docker-compose |
docker compose |
| 实现语言 | Python | Go |
| 安装方式 | 独立二进制 | Docker CLI 插件 |
| 维护状态 | 已停止维护 | 官方主推 |
| 本机版本 | - | v5.0.1 |
2. 性能对比
2.1 启动速度
| 场景 | V1 | V2 | 提升 |
|---|---|---|---|
| 命令冷启动 | ~1.5s | ~0.3s | 5x |
| 启动 10 个服务 | ~8s | ~2s | 4x |
| 构建镜像 | 串行为主 | 并行 + BuildKit | 2-3x |
原因: V1 依赖 Python 解释器启动,V2 是 Go 编译的原生二进制。
2.2 资源占用
V1: docker-compose up
└── Python 进程 ~50-80MB 内存
V2: docker compose up
└── Go 二进制 ~15-25MB 内存
3. 新功能详解与案例
3.1 Watch 模式(开发热重载)
场景: 前端/后端开发时,修改代码自动重建容器。
yaml
# docker-compose.yml
services:
web:
build: .
ports:
- "3000:3000"
develop:
watch:
# 修改源码 -> 同步到容器
- path: ./src
action: sync
target: /app/src
# 修改 package.json -> 重新构建镜像
- path: ./package.json
action: rebuild
# 修改配置 -> 重启容器
- path: ./config
action: sync+restart
target: /app/config
使用:
bash
docker compose watch
效果:
- 修改
src/下文件 → 自动同步到容器,无需重启 - 修改
package.json→ 自动重新 build 镜像并重启 - 修改
config/→ 同步文件并重启容器
V1 对比: 需要借助第三方工具(nodemon、air)或手动重启。
3.2 --wait 等待服务就绪
场景: CI/CD 流程中,确保服务完全启动后再执行测试。
yaml
# docker-compose.yml
services:
db:
image: postgres:15
healthcheck:
test: ["CMD", "pg_isready", "-U", "postgres"]
interval: 5s
timeout: 5s
retries: 5
api:
build: .
depends_on:
db:
condition: service_healthy
V1 方式(繁琐):
bash
docker-compose up -d
# 需要自己写循环等待
while ! docker-compose exec db pg_isready; do sleep 1; done
npm test
V2 方式(简洁):
bash
docker compose up -d --wait
# 命令会阻塞,直到所有服务健康检查通过
npm test
3.3 Profiles 环境隔离
场景: 同一个 compose 文件,区分开发/测试/调试环境。
yaml
# docker-compose.yml
services:
# 核心服务 - 始终启动
web:
image: nginx
ports:
- "80:80"
api:
build: ./api
ports:
- "8080:8080"
db:
image: postgres:15
volumes:
- db_data:/var/lib/postgresql/data
# 调试工具 - 仅调试时启动
pgadmin:
image: dpage/pgadmin4
ports:
- "5050:80"
profiles: ["debug"]
# 性能监控 - 仅监控时启动
prometheus:
image: prom/prometheus
profiles: ["monitoring"]
grafana:
image: grafana/grafana
profiles: ["monitoring"]
# 测试服务 - 仅测试时启动
test-runner:
build: ./tests
profiles: ["test"]
volumes:
db_data:
使用方式:
bash
# 日常开发 - 只启动核心服务
docker compose up -d
# 启动: web, api, db
# 需要调试数据库
docker compose --profile debug up -d
# 启动: web, api, db, pgadmin
# 性能监控
docker compose --profile monitoring up -d
# 启动: web, api, db, prometheus, grafana
# 运行测试
docker compose --profile test up -d
# 启动: web, api, db, test-runner
# 组合多个 profile
docker compose --profile debug --profile monitoring up -d
# 启动: web, api, db, pgadmin, prometheus, grafana
V1 对比: 需要维护多个 compose 文件(docker-compose.yml, docker-compose.debug.yml 等)。
3.4 更好的依赖控制
场景: API 服务必须等数据库和 Redis 都就绪才能启动。
yaml
# docker-compose.yml
services:
db:
image: postgres:15
healthcheck:
test: ["CMD", "pg_isready", "-U", "postgres"]
interval: 5s
timeout: 5s
retries: 5
redis:
image: redis:7
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 5
api:
build: ./api
depends_on:
db:
condition: service_healthy # 等 db 健康检查通过
restart: true # db 重启时 api 也重启
redis:
condition: service_healthy
ports:
- "8080:8080"
worker:
build: ./worker
depends_on:
api:
condition: service_started # api 启动即可,不等健康检查
redis:
condition: service_healthy
依赖条件:
| condition | 说明 |
|---|---|
service_started |
容器启动即满足(默认) |
service_healthy |
健康检查通过才满足 |
service_completed_successfully |
容器成功退出(exit 0) |
V1 对比: 只支持 service_started,无法等待健康检查。
3.5 并行构建与 BuildKit
场景: 多服务项目,加速镜像构建。
yaml
# docker-compose.yml
services:
frontend:
build:
context: ./frontend
cache_from:
- frontend:cache
backend:
build:
context: ./backend
cache_from:
- backend:cache
worker:
build: ./worker
V2 构建优势:
bash
# 并行构建所有服务
docker compose build --parallel
# 显示构建进度
docker compose build --progress=plain
# 不使用缓存
docker compose build --no-cache
# 只构建指定服务
docker compose build frontend backend
BuildKit 特性(V2 默认启用):
- 并行执行无依赖的构建步骤
- 智能缓存(只重建变化的层)
- 构建密钥安全传递(--secret)
- 多平台构建(--platform)
3.6 Dry Run 模式
场景: 执行命令前预览会发生什么。
bash
# 预览 up 会做什么
docker compose up --dry-run
# 预览 down 会删除什么
docker compose down --dry-run
# 预览构建过程
docker compose build --dry-run
输出示例:
DRY-RUN MODE - No changes will be made
[+] Running 3/0
✔ Network myapp_default Created
✔ Container myapp-db-1 Created
✔ Container myapp-api-1 Created
V1 对比: 无此功能,只能直接执行。
3.7 多文件合并
场景: 基础配置 + 环境差异配置。
project/
├── docker-compose.yml # 基础配置
├── docker-compose.override.yml # 本地开发覆盖(自动加载)
├── docker-compose.prod.yml # 生产环境
└── docker-compose.test.yml # 测试环境
docker-compose.yml(基础):
yaml
services:
api:
image: myapi:latest
environment:
- DB_HOST=db
docker-compose.override.yml(开发,自动加载):
yaml
services:
api:
build: .
volumes:
- ./src:/app/src
environment:
- DEBUG=true
docker-compose.prod.yml(生产):
yaml
services:
api:
deploy:
replicas: 3
resources:
limits:
cpus: '0.5'
memory: 512M
environment:
- DEBUG=false
使用方式:
bash
# 开发环境(自动合并 override)
docker compose up
# 生产环境
docker compose -f docker-compose.yml -f docker-compose.prod.yml up
# 查看合并后的完整配置
docker compose -f docker-compose.yml -f docker-compose.prod.yml config
4. 命令对比速查
| 功能 | V1 | V2 |
|---|---|---|
| 启动服务 | docker-compose up |
docker compose up |
| 后台启动 | docker-compose up -d |
docker compose up -d |
| 等待就绪 | 需脚本 | docker compose up --wait |
| 热重载 | 需第三方 | docker compose watch |
| 预览变更 | 无 | docker compose up --dry-run |
| 查看日志 | docker-compose logs |
docker compose logs |
| 进入容器 | docker-compose exec |
docker compose exec |
| 停止服务 | docker-compose down |
docker compose down |
| 环境隔离 | 多文件 | --profile |
| 并行构建 | 有限 | docker compose build --parallel |
5. 迁移建议
5.1 命令别名(可选)
如果有旧脚本依赖 docker-compose 命令:
bash
# 添加到 ~/.bashrc 或 ~/.zshrc
alias docker-compose='docker compose'
5.2 compose 文件兼容性
V2 完全兼容 V1 的 compose 文件格式,无需修改。
5.3 版本声明
yaml
# 不再需要 version 字段(V2 会忽略)
# version: "3.8" # 可删除
services:
web:
image: nginx
6. 文档信息
| 项目 | 值 |
|---|---|
| 创建时间 | 2026-01-10 |
| Docker Compose 版本 | v5.0.1 |
| 参考文档 | https://docs.docker.com/compose/ |