docker compose和docker-compose的区别及使用说明
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 模式(开发热重载)
场景: 前端/后端开发时,修改代码自动重建容器。
# 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
使用:
docker compose watch
效果:
- 修改
src/下文件 → 自动同步到容器,无需重启 - 修改
package.json→ 自动重新 build 镜像并重启 - 修改
config/→ 同步文件并重启容器
V1 对比: 需要借助第三方工具(nodemon、air)或手动重启。
3.2 --wait 等待服务就绪
场景: CI/CD 流程中,确保服务完全启动后再执行测试。
# 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 方式(繁琐):
docker-compose up -d # 需要自己写循环等待 while ! docker-compose exec db pg_isready; do sleep 1; done npm test
V2 方式(简洁):
docker compose up -d --wait # 命令会阻塞,直到所有服务健康检查通过 npm test
3.3 Profiles 环境隔离
场景: 同一个 compose 文件,区分开发/测试/调试环境。
# 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:
使用方式:
# 日常开发 - 只启动核心服务 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 都就绪才能启动。
# 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
场景: 多服务项目,加速镜像构建。
# docker-compose.yml
services:
frontend:
build:
context: ./frontend
cache_from:
- frontend:cache
backend:
build:
context: ./backend
cache_from:
- backend:cache
worker:
build: ./worker
V2 构建优势:
# 并行构建所有服务 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 模式
场景: 执行命令前预览会发生什么。
# 预览 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(基础):
services:
api:
image: myapi:latest
environment:
- DB_HOST=db
docker-compose.override.yml(开发,自动加载):
services:
api:
build: .
volumes:
- ./src:/app/src
environment:
- DEBUG=true
docker-compose.prod.yml(生产):
services:
api:
deploy:
replicas: 3
resources:
limits:
cpus: '0.5'
memory: 512M
environment:
- DEBUG=false
使用方式:
# 开发环境(自动合并 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 命令:
# 添加到 ~/.bashrc 或 ~/.zshrc alias docker-compose='docker compose'
5.2 compose 文件兼容性
V2 完全兼容 V1 的 compose 文件格式,无需修改。
5.3 版本声明
# 不再需要 version 字段(V2 会忽略)
# version: "3.8" # 可删除
services:
web:
image: nginx
6. 文档信息
| 项目 | 值 |
|---|---|
| 创建时间 | 2026-01-10 |
| Docker Compose 版本 | v5.0.1 |
| 参考文档 | https://docs.docker.com/compose/ |
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Docker aufs存储驱动layer、diff、mnt目录的区别介绍
这篇文章主要介绍了Docker aufs存储驱动layer、diff、mnt目录的区别,需要的朋友可以参考下2017-04-04
docker-compose:数据卷volumes挂载规则说明
这篇文章主要介绍了docker-compose:数据卷volumes挂载规则说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-03-03
Spring Cloud中使用jib进行docker部署的步骤详解
这篇文章主要介绍了Spring Cloud中使用jib进行docker部署的步骤详解,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-09-09
Docker Desktop启动失败的解决(Docker failed to i
本文主要介绍了Docker Desktop启动失败的解决(Docker failed to initialize Docker Desktop is shutting down),文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2022-03-03


最新评论