docker compose和docker-compose的区别

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/
相关推荐
vortex59 小时前
Linux 用户组查询命令详解
linux·运维·服务器
打不了嗝 ᥬ᭄9 小时前
网易 UU 远程 2026年1月 新春升级深度测评:免登录破局 + 安全加码 + 运维专属,重新定义远程协助体验
运维·安全
小杜今天学AI了吗9 小时前
如何配置 linux 系统的conda 环境
linux·运维·conda
christine-rr9 小时前
linux常用命令(9)——查看系统与硬件信息
linux·运维·服务器·网络·后端
oMcLin9 小时前
如何在CentOS Stream 9上通过配置Hyper‑V虚拟化实现高效的资源隔离与虚拟机管理?
linux·运维·centos
草莓熊Lotso10 小时前
Linux系统进程调度优化:优先级策略与切换机制深度实践
linux·运维·服务器·c++·人工智能·经验分享·其他
xflySnail12 小时前
nas服务域名高速访问-DNS+ESA
运维·服务器·esa·无端口访问
Kendra91918 小时前
Kubernetes 常用命令
云原生·容器·kubernetes
Rabbit_QL18 小时前
【网络设置】Docker 自定义网络深度解析:从踩坑到工程实践
网络·docker·容器