docker compose和docker-compose的區(qū)別及使用說明
1. 概述
| 項目 | V1 | V2 |
|---|---|---|
| 命令 | docker-compose | docker compose |
| 實現(xiàn)語言 | Python | Go |
| 安裝方式 | 獨立二進制 | Docker CLI 插件 |
| 維護狀態(tài) | 已停止維護 | 官方主推 |
| 本機版本 | - | 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 模式(開發(fā)熱重載)
場景: 前端/后端開發(fā)時,修改代碼自動重建容器。
# 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 流程中,確保服務完全啟動后再執(zhí)行測試。
# 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 # 需要自己寫循環(huán)等待 while ! docker-compose exec db pg_isready; do sleep 1; done npm test
V2 方式(簡潔):
docker compose up -d --wait # 命令會阻塞,直到所有服務健康檢查通過 npm test
3.3 Profiles 環(huán)境隔離
場景: 同一個 compose 文件,區(qū)分開發(fā)/測試/調試環(huán)境。
# 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"]
# 性能監(jiān)控 - 僅監(jiān)控時啟動
prometheus:
image: prom/prometheus
profiles: ["monitoring"]
grafana:
image: grafana/grafana
profiles: ["monitoring"]
# 測試服務 - 僅測試時啟動
test-runner:
build: ./tests
profiles: ["test"]
volumes:
db_data:
使用方式:
# 日常開發(fā) - 只啟動核心服務 docker compose up -d # 啟動: web, api, db # 需要調試數(shù)據(jù)庫 docker compose --profile debug up -d # 啟動: web, api, db, pgadmin # 性能監(jiān)控 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 服務必須等數(shù)據(jù)庫和 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 構建優(yōu)勢:
# 并行構建所有服務 docker compose build --parallel # 顯示構建進度 docker compose build --progress=plain # 不使用緩存 docker compose build --no-cache # 只構建指定服務 docker compose build frontend backend
BuildKit 特性(V2 默認啟用):
- 并行執(zhí)行無依賴的構建步驟
- 智能緩存(只重建變化的層)
- 構建密鑰安全傳遞(–secret)
- 多平臺構建(–platform)
3.6 Dry Run 模式
場景: 執(zhí)行命令前預覽會發(fā)生什么。
# 預覽 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 對比: 無此功能,只能直接執(zhí)行。
3.7 多文件合并
場景: 基礎配置 + 環(huán)境差異配置。
project/ ├── docker-compose.yml # 基礎配置 ├── docker-compose.override.yml # 本地開發(fā)覆蓋(自動加載) ├── docker-compose.prod.yml # 生產(chǎn)環(huán)境 └── docker-compose.test.yml # 測試環(huán)境
docker-compose.yml(基礎):
services:
api:
image: myapi:latest
environment:
- DB_HOST=db
docker-compose.override.yml(開發(fā),自動加載):
services:
api:
build: .
volumes:
- ./src:/app/src
environment:
- DEBUG=true
docker-compose.prod.yml(生產(chǎn)):
services:
api:
deploy:
replicas: 3
resources:
limits:
cpus: '0.5'
memory: 512M
environment:
- DEBUG=false
使用方式:
# 開發(fā)環(huán)境(自動合并 override) docker compose up # 生產(chǎn)環(huán)境 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 |
| 環(huán)境隔離 | 多文件 | --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. 文檔信息
| 項目 | 值 |
|---|---|
| 創(chuàng)建時間 | 2026-01-10 |
| Docker Compose 版本 | v5.0.1 |
| 參考文檔 | https://docs.docker.com/compose/ |
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
docker安裝Elasticsearch7.6集群并設置密碼
這篇文章主要介紹了docker安裝Elasticsearch7.6集群并設置密碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-06-06
docker容器在uos-12038.101上啟動報錯的解決辦法
這篇文章主要介紹了docker容器在uos-12038.101上啟動報錯的問題,解決方案是需要在/etc/systemd/system/或者 /usr/lib/systemd/system/2024-03-03
找到docker.service文件,在ExecStart=/usr/bin/dockerd后面添加 --default-ulimit nofile=65536:65536參數(shù),需要的朋友可以參考下

