docker compose和docker-compose的区别及使用说明
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">1. 概述</a></li><li><a href="#_label1">2. 性能对比</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_0">2.1 启动速度</a></li><li><a href="#_lab2_1_1">2.2 资源占用</a></li></ul><li><a href="#_label2">3. 新功能详解与案例</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_2">3.1 Watch 模式(开发热重载)</a></li><li><a href="#_lab2_2_3">3.2 --wait 等待服务就绪</a></li><li><a href="#_lab2_2_4">3.3 Profiles 环境隔离</a></li><li><a href="#_lab2_2_5">3.4 更好的依赖控制</a></li><li><a href="#_lab2_2_6">3.5 并行构建与 BuildKit</a></li><li><a href="#_lab2_2_7">3.6 Dry Run 模式</a></li><li><a href="#_lab2_2_8">3.7 多文件合并</a></li></ul><li><a href="#_label3">4. 命令对比速查</a></li><ul class="second_class_ul"></ul><li><a href="#_label4">5. 迁移建议</a></li><ul class="second_class_ul"><li><a href="#_lab2_4_9">5.1 命令别名(可选)</a></li><li><a href="#_lab2_4_10">5.2 compose 文件兼容性</a></li><li><a href="#_lab2_4_11">5.3 版本声明</a></li></ul><li><a href="#_label5">6. 文档信息</a></li><ul class="second_class_ul"></ul><li><a href="#_label6">总结</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>1. 概述</h2><table><thead><tr><th>项目</th><th>V1</th><th>V2</th></tr></thead><tbody><tr><td>命令</td><td>docker-compose</td><td>docker compose</td></tr><tr><td>实现语言</td><td>Python</td><td>Go</td></tr><tr><td>安装方式</td><td>独立二进制</td><td>Docker CLI 插件</td></tr><tr><td>维护状态</td><td>已停止维护</td><td>官方主推</td></tr><tr><td>本机版本</td><td>-</td><td>v5.0.1</td></tr></tbody></table>
<p class="maodian"><a name="_label1"></a></p><h2>2. 性能对比</h2>
<p class="maodian"><a name="_lab2_1_0"></a></p><h3>2.1 启动速度</h3>
<table><thead><tr><th>场景</th><th>V1</th><th>V2</th><th>提升</th></tr></thead><tbody><tr><td>命令冷启动</td><td>~1.5s</td><td>~0.3s</td><td><strong>5x</strong></td></tr><tr><td>启动 10 个服务</td><td>~8s</td><td>~2s</td><td><strong>4x</strong></td></tr><tr><td>构建镜像</td><td>串行为主</td><td>并行 + BuildKit</td><td><strong>2-3x</strong></td></tr></tbody></table>
<p><strong>原因:</strong> V1 依赖 Python 解释器启动,V2 是 Go 编译的原生二进制。</p>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>2.2 资源占用</h3>
<div class="jb51code"><pre class="brush:bash;">V1: docker-compose up
└── Python 进程 ~50-80MB 内存
V2: docker compose up
└── Go 二进制 ~15-25MB 内存
</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>3. 新功能详解与案例</h2>
<p class="maodian"><a name="_lab2_2_2"></a></p><h3>3.1 Watch 模式(开发热重载)</h3>
<p><strong>场景:</strong> 前端/后端开发时,修改代码自动重建容器。</p>
<div class="jb51code"><pre class="brush: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
</pre></div>
<p><strong>使用:</strong></p>
<div class="jb51code"><pre class="brush:bash;">docker compose watch
</pre></div>
<p><strong>效果:</strong></p>
<ul><li>修改 <code>src/</code> 下文件 → 自动同步到容器,无需重启</li><li>修改 <code>package.json</code> → 自动重新 build 镜像并重启</li><li>修改 <code>config/</code> → 同步文件并重启容器</li></ul>
<p><strong>V1 对比:</strong> 需要借助第三方工具(nodemon、air)或手动重启。</p>
<p class="maodian"><a name="_lab2_2_3"></a></p><h3>3.2 --wait 等待服务就绪</h3>
<p><strong>场景:</strong> CI/CD 流程中,确保服务完全启动后再执行测试。</p>
<div class="jb51code"><pre class="brush: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
</pre></div>
<p><strong>V1 方式(繁琐):</strong></p>
<div class="jb51code"><pre class="brush:bash;">docker-compose up -d
# 需要自己写循环等待
while ! docker-compose exec db pg_isready; do sleep 1; done
npm test
</pre></div>
<p><strong>V2 方式(简洁):</strong></p>
<div class="jb51code"><pre class="brush:bash;">docker compose up -d --wait
# 命令会阻塞,直到所有服务健康检查通过
npm test
</pre></div>
<p class="maodian"><a name="_lab2_2_4"></a></p><h3>3.3 Profiles 环境隔离</h3>
<p><strong>场景:</strong> 同一个 compose 文件,区分开发/测试/调试环境。</p>
<div class="jb51code"><pre class="brush: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:
</pre></div>
<p><strong>使用方式:</strong></p>
<div class="jb51code"><pre class="brush: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
</pre></div>
<p><strong>V1 对比:</strong> 需要维护多个 compose 文件(docker-compose.yml, docker-compose.debug.yml 等)。</p>
<p class="maodian"><a name="_lab2_2_5"></a></p><h3>3.4 更好的依赖控制</h3>
<p><strong>场景:</strong> API 服务必须等数据库和 Redis 都就绪才能启动。</p>
<div class="jb51code"><pre class="brush: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
</pre></div>
<p><strong>依赖条件:</strong></p>
<table><thead><tr><th>condition</th><th>说明</th></tr></thead><tbody><tr><td>service_started</td><td>容器启动即满足(默认)</td></tr><tr><td>service_healthy</td><td>健康检查通过才满足</td></tr><tr><td>service_completed_successfully</td><td>容器成功退出(exit 0)</td></tr></tbody></table>
<p><strong>V1 对比:</strong> 只支持 <code>service_started</code>,无法等待健康检查。</p>
<p class="maodian"><a name="_lab2_2_6"></a></p><h3>3.5 并行构建与 BuildKit</h3>
<p><strong>场景:</strong> 多服务项目,加速镜像构建。</p>
<div class="jb51code"><pre class="brush:yaml;"># docker-compose.yml
services:
frontend:
build:
context: ./frontend
cache_from:
- frontend:cache
backend:
build:
context: ./backend
cache_from:
- backend:cache
worker:
build: ./worker
</pre></div>
<p><strong>V2 构建优势:</strong></p>
<div class="jb51code"><pre class="brush:bash;"># 并行构建所有服务
docker compose build --parallel
# 显示构建进度
docker compose build --progress=plain
# 不使用缓存
docker compose build --no-cache
# 只构建指定服务
docker compose build frontend backend
</pre></div>
<p><strong>BuildKit 特性(V2 默认启用):</strong></p>
<ul><li>并行执行无依赖的构建步骤</li><li>智能缓存(只重建变化的层)</li><li>构建密钥安全传递(–secret)</li><li>多平台构建(–platform)</li></ul>
<p class="maodian"><a name="_lab2_2_7"></a></p><h3>3.6 Dry Run 模式</h3>
<p><strong>场景:</strong> 执行命令前预览会发生什么。</p>
<div class="jb51code"><pre class="brush:bash;"># 预览 up 会做什么
docker compose up --dry-run
# 预览 down 会删除什么
docker compose down --dry-run
# 预览构建过程
docker compose build --dry-run
</pre></div>
<p><strong>输出示例:</strong></p>
<div class="jb51code"><pre class="brush:bash;">DRY-RUN MODE - No changes will be made
[+] Running 3/0
✔ Network myapp_defaultCreated
✔ Container myapp-db-1 Created
✔ Container myapp-api-1Created
</pre></div>
<p><strong>V1 对比:</strong> 无此功能,只能直接执行。</p>
<p class="maodian"><a name="_lab2_2_8"></a></p><h3>3.7 多文件合并</h3>
<p><strong>场景:</strong> 基础配置 + 环境差异配置。</p>
<div class="jb51code"><pre class="brush:bash;">project/
├── docker-compose.yml # 基础配置
├── docker-compose.override.yml # 本地开发覆盖(自动加载)
├── docker-compose.prod.yml # 生产环境
└── docker-compose.test.yml # 测试环境
</pre></div>
<p><strong>docker-compose.yml(基础):</strong></p>
<div class="jb51code"><pre class="brush:yaml;">services:
api:
image: myapi:latest
environment:
- DB_HOST=db
</pre></div>
<p><strong>docker-compose.override.yml(开发,自动加载):</strong></p>
<div class="jb51code"><pre class="brush:yaml;">services:
api:
build: .
volumes:
- ./src:/app/src
environment:
- DEBUG=true
</pre></div>
<p><strong>docker-compose.prod.yml(生产):</strong></p>
<div class="jb51code"><pre class="brush:yaml;">services:
api:
deploy:
replicas: 3
resources:
limits:
cpus: '0.5'
memory: 512M
environment:
- DEBUG=false
</pre></div>
<p><strong>使用方式:</strong></p>
<div class="jb51code"><pre class="brush: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
</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>4. 命令对比速查</h2>
<table><thead><tr><th>功能</th><th>V1</th><th>V2</th></tr></thead><tbody><tr><td>启动服务</td><td>docker-compose up</td><td>docker compose up</td></tr><tr><td>后台启动</td><td>docker-compose up -d</td><td>docker compose up -d</td></tr><tr><td>等待就绪</td><td>需脚本</td><td>docker compose up --wait</td></tr><tr><td>热重载</td><td>需第三方</td><td>docker compose watch</td></tr><tr><td>预览变更</td><td>无</td><td>docker compose up --dry-run</td></tr><tr><td>查看日志</td><td>docker-compose logs</td><td>docker compose logs</td></tr><tr><td>进入容器</td><td>docker-compose exec</td><td>docker compose exec</td></tr><tr><td>停止服务</td><td>docker-compose down</td><td>docker compose down</td></tr><tr><td>环境隔离</td><td>多文件</td><td>--profile</td></tr><tr><td>并行构建</td><td>有限</td><td>docker compose build --parallel</td></tr></tbody></table>
<p class="maodian"><a name="_label4"></a></p><h2>5. 迁移建议</h2>
<p class="maodian"><a name="_lab2_4_9"></a></p><h3>5.1 命令别名(可选)</h3>
<p>如果有旧脚本依赖 <code>docker-compose</code> 命令:</p>
<div class="jb51code"><pre class="brush:bash;"># 添加到 ~/.bashrc 或 ~/.zshrc
alias docker-compose='docker compose'
</pre></div>
<p class="maodian"><a name="_lab2_4_10"></a></p><h3>5.2 compose 文件兼容性</h3>
<p>V2 完全兼容 V1 的 compose 文件格式,无需修改。</p>
<p class="maodian"><a name="_lab2_4_11"></a></p><h3>5.3 版本声明</h3>
<div class="jb51code"><pre class="brush:yaml;"># 不再需要 version 字段(V2 会忽略)
# version: "3.8"# 可删除
services:
web:
image: nginx
</pre></div>
<p class="maodian"><a name="_label5"></a></p><h2>6. 文档信息</h2>
<table><thead><tr><th>项目</th><th>值</th></tr></thead><tbody><tr><td>创建时间</td><td>2026-01-10</td></tr><tr><td>Docker Compose 版本</td><td>v5.0.1</td></tr><tr><td>参考文档</td><td>https://docs.docker.com/compose/</td></tr></tbody></table>
<p class="maodian"><a name="_label6"></a></p><h2>总结</h2>
<p>以上为个人经验,希望能给大家一个参考,也希望大家多多支持琼殿技术社区。</p>
頁:
[1]