docker compose和docker-compose的区别及使用说明

 更新时间:2026年01月12日 16:07:04   作者:techzhi  
Docker Compose V2 是 Docker Compose V1 的替代品,使用 Go 语言编译,性能更好,资源占用更低,新特性包括 Watch 模式、等待服务就绪、环境隔离、更好的依赖控制、并行构建和 DryRun 模式,V2 兼容 V1 的 compose 文件格式,迁移简单

1. 概述

项目V1V2
命令docker-composedocker compose
实现语言PythonGo
安装方式独立二进制Docker CLI 插件
维护状态已停止维护官方主推
本机版本-v5.0.1

2. 性能对比

2.1 启动速度

场景V1V2提升
命令冷启动~1.5s~0.3s5x
启动 10 个服务~8s~2s4x
构建镜像串行为主并行 + BuildKit2-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. 命令对比速查

功能V1V2
启动服务docker-compose updocker compose up
后台启动docker-compose up -ddocker compose up -d
等待就绪需脚本docker compose up --wait
热重载需第三方docker compose watch
预览变更docker compose up --dry-run
查看日志docker-compose logsdocker compose logs
进入容器docker-compose execdocker compose exec
停止服务docker-compose downdocker 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目录的区别介绍

    这篇文章主要介绍了Docker aufs存储驱动layer、diff、mnt目录的区别,需要的朋友可以参考下
    2017-04-04
  • docker多个容器的相互通信实现步骤

    docker多个容器的相互通信实现步骤

    本文介绍了在宿主机上运行多个Docker容器时的几种通信方式,包括默认的桥接网络、自定义网络、--link参数、Host网络、Docker-compose和共享数据卷等,每种方式都有其特点和适用场景,感兴趣的朋友跟随小编一起看看吧
    2025-02-02
  • 浅谈Docker consul的容器服务更新与发现

    浅谈Docker consul的容器服务更新与发现

    本文主要介绍了浅谈Docker consul的容器服务更新与发现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • docker-compose:数据卷volumes挂载规则说明

    docker-compose:数据卷volumes挂载规则说明

    这篇文章主要介绍了docker-compose:数据卷volumes挂载规则说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Spring Cloud中使用jib进行docker部署的步骤详解

    Spring Cloud中使用jib进行docker部署的步骤详解

    这篇文章主要介绍了Spring Cloud中使用jib进行docker部署的步骤详解,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Docker Desktop启动失败的解决(Docker failed to initialize Docker Desktop is shutting down)

    Docker Desktop启动失败的解决(Docker failed to i

    本文主要介绍了Docker Desktop启动失败的解决(Docker failed to initialize Docker Desktop is shutting down),文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Docker+selenium实现自动化健康报备的方法

    Docker+selenium实现自动化健康报备的方法

    这篇文章主要介绍了Docker+selenium实现自动化健康报备的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Docker部署及使用压测神器sysbench的方法

    Docker部署及使用压测神器sysbench的方法

    sysbench 是一个开源跨平台的多线程性能测试工具,这篇文章主要介绍了Docker部署及使用压测神器sysbench的相关知识,需要的朋友可以参考下
    2022-08-08
  • 分享8个基本的Docker容器管理命令

    分享8个基本的Docker容器管理命令

    本文给大家分享8个基本的Docker容器管理命令,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-06-06
  • 更换k8s容器运行时环境为docker的过程

    更换k8s容器运行时环境为docker的过程

    这篇文章主要介绍了更换k8s容器运行时环境为docker的过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-10-10

最新评论