docker compose和docker-compose的區(qū)別及使用說(shuō)明
1. 概述
| 項(xiàng)目 | V1 | V2 |
|---|---|---|
| 命令 | docker-compose | docker compose |
| 實(shí)現(xiàn)語(yǔ)言 | Python | Go |
| 安裝方式 | 獨(dú)立二進(jìn)制 | Docker CLI 插件 |
| 維護(hù)狀態(tài) | 已停止維護(hù) | 官方主推 |
| 本機(jī)版本 | - | v5.0.1 |
2. 性能對(duì)比
2.1 啟動(dòng)速度
| 場(chǎng)景 | V1 | V2 | 提升 |
|---|---|---|---|
| 命令冷啟動(dòng) | ~1.5s | ~0.3s | 5x |
| 啟動(dòng) 10 個(gè)服務(wù) | ~8s | ~2s | 4x |
| 構(gòu)建鏡像 | 串行為主 | 并行 + BuildKit | 2-3x |
原因: V1 依賴 Python 解釋器啟動(dòng),V2 是 Go 編譯的原生二進(jìn)制。
2.2 資源占用
V1: docker-compose up └── Python 進(jìn)程 ~50-80MB 內(nèi)存 V2: docker compose up └── Go 二進(jìn)制 ~15-25MB 內(nèi)存
3. 新功能詳解與案例
3.1 Watch 模式(開發(fā)熱重載)
場(chǎng)景: 前端/后端開發(fā)時(shí),修改代碼自動(dòng)重建容器。
# docker-compose.yml
services:
web:
build: .
ports:
- "3000:3000"
develop:
watch:
# 修改源碼 -> 同步到容器
- path: ./src
action: sync
target: /app/src
# 修改 package.json -> 重新構(gòu)建鏡像
- path: ./package.json
action: rebuild
# 修改配置 -> 重啟容器
- path: ./config
action: sync+restart
target: /app/config
使用:
docker compose watch
效果:
- 修改
src/下文件 → 自動(dòng)同步到容器,無(wú)需重啟 - 修改
package.json→ 自動(dòng)重新 build 鏡像并重啟 - 修改
config/→ 同步文件并重啟容器
V1 對(duì)比: 需要借助第三方工具(nodemon、air)或手動(dòng)重啟。
3.2 --wait 等待服務(wù)就緒
場(chǎng)景: CI/CD 流程中,確保服務(wù)完全啟動(dòng)后再執(zhí)行測(cè)試。
# 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 方式(簡(jiǎn)潔):
docker compose up -d --wait # 命令會(huì)阻塞,直到所有服務(wù)健康檢查通過(guò) npm test
3.3 Profiles 環(huán)境隔離
場(chǎng)景: 同一個(gè) compose 文件,區(qū)分開發(fā)/測(cè)試/調(diào)試環(huán)境。
# docker-compose.yml
services:
# 核心服務(wù) - 始終啟動(dòng)
web:
image: nginx
ports:
- "80:80"
api:
build: ./api
ports:
- "8080:8080"
db:
image: postgres:15
volumes:
- db_data:/var/lib/postgresql/data
# 調(diào)試工具 - 僅調(diào)試時(shí)啟動(dòng)
pgadmin:
image: dpage/pgadmin4
ports:
- "5050:80"
profiles: ["debug"]
# 性能監(jiān)控 - 僅監(jiān)控時(shí)啟動(dòng)
prometheus:
image: prom/prometheus
profiles: ["monitoring"]
grafana:
image: grafana/grafana
profiles: ["monitoring"]
# 測(cè)試服務(wù) - 僅測(cè)試時(shí)啟動(dòng)
test-runner:
build: ./tests
profiles: ["test"]
volumes:
db_data:
使用方式:
# 日常開發(fā) - 只啟動(dòng)核心服務(wù) docker compose up -d # 啟動(dòng): web, api, db # 需要調(diào)試數(shù)據(jù)庫(kù) docker compose --profile debug up -d # 啟動(dòng): web, api, db, pgadmin # 性能監(jiān)控 docker compose --profile monitoring up -d # 啟動(dòng): web, api, db, prometheus, grafana # 運(yùn)行測(cè)試 docker compose --profile test up -d # 啟動(dòng): web, api, db, test-runner # 組合多個(gè) profile docker compose --profile debug --profile monitoring up -d # 啟動(dòng): web, api, db, pgadmin, prometheus, grafana
V1 對(duì)比: 需要維護(hù)多個(gè) compose 文件(docker-compose.yml, docker-compose.debug.yml 等)。
3.4 更好的依賴控制
場(chǎng)景: API 服務(wù)必須等數(shù)據(jù)庫(kù)和 Redis 都就緒才能啟動(dòng)。
# 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 健康檢查通過(guò)
restart: true # db 重啟時(shí) api 也重啟
redis:
condition: service_healthy
ports:
- "8080:8080"
worker:
build: ./worker
depends_on:
api:
condition: service_started # api 啟動(dòng)即可,不等健康檢查
redis:
condition: service_healthy
依賴條件:
| condition | 說(shuō)明 |
|---|---|
| service_started | 容器啟動(dòng)即滿足(默認(rèn)) |
| service_healthy | 健康檢查通過(guò)才滿足 |
| service_completed_successfully | 容器成功退出(exit 0) |
V1 對(duì)比: 只支持 service_started,無(wú)法等待健康檢查。
3.5 并行構(gòu)建與 BuildKit
場(chǎng)景: 多服務(wù)項(xiàng)目,加速鏡像構(gòu)建。
# docker-compose.yml
services:
frontend:
build:
context: ./frontend
cache_from:
- frontend:cache
backend:
build:
context: ./backend
cache_from:
- backend:cache
worker:
build: ./worker
V2 構(gòu)建優(yōu)勢(shì):
# 并行構(gòu)建所有服務(wù) docker compose build --parallel # 顯示構(gòu)建進(jìn)度 docker compose build --progress=plain # 不使用緩存 docker compose build --no-cache # 只構(gòu)建指定服務(wù) docker compose build frontend backend
BuildKit 特性(V2 默認(rèn)啟用):
- 并行執(zhí)行無(wú)依賴的構(gòu)建步驟
- 智能緩存(只重建變化的層)
- 構(gòu)建密鑰安全傳遞(–secret)
- 多平臺(tái)構(gòu)建(–platform)
3.6 Dry Run 模式
場(chǎng)景: 執(zhí)行命令前預(yù)覽會(huì)發(fā)生什么。
# 預(yù)覽 up 會(huì)做什么 docker compose up --dry-run # 預(yù)覽 down 會(huì)刪除什么 docker compose down --dry-run # 預(yù)覽構(gòu)建過(guò)程 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 對(duì)比: 無(wú)此功能,只能直接執(zhí)行。
3.7 多文件合并
場(chǎng)景: 基礎(chǔ)配置 + 環(huán)境差異配置。
project/ ├── docker-compose.yml # 基礎(chǔ)配置 ├── docker-compose.override.yml # 本地開發(fā)覆蓋(自動(dòng)加載) ├── docker-compose.prod.yml # 生產(chǎn)環(huán)境 └── docker-compose.test.yml # 測(cè)試環(huán)境
docker-compose.yml(基礎(chǔ)):
services:
api:
image: myapi:latest
environment:
- DB_HOST=db
docker-compose.override.yml(開發(fā),自動(dòng)加載):
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)境(自動(dòng)合并 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. 命令對(duì)比速查
| 功能 | V1 | V2 |
|---|---|---|
| 啟動(dòng)服務(wù) | docker-compose up | docker compose up |
| 后臺(tái)啟動(dòng) | docker-compose up -d | docker compose up -d |
| 等待就緒 | 需腳本 | docker compose up --wait |
| 熱重載 | 需第三方 | docker compose watch |
| 預(yù)覽變更 | 無(wú) | docker compose up --dry-run |
| 查看日志 | docker-compose logs | docker compose logs |
| 進(jìn)入容器 | docker-compose exec | docker compose exec |
| 停止服務(wù) | docker-compose down | docker compose down |
| 環(huán)境隔離 | 多文件 | --profile |
| 并行構(gòu)建 | 有限 | docker compose build --parallel |
5. 遷移建議
5.1 命令別名(可選)
如果有舊腳本依賴 docker-compose 命令:
# 添加到 ~/.bashrc 或 ~/.zshrc alias docker-compose='docker compose'
5.2 compose 文件兼容性
V2 完全兼容 V1 的 compose 文件格式,無(wú)需修改。
5.3 版本聲明
# 不再需要 version 字段(V2 會(huì)忽略)
# version: "3.8" # 可刪除
services:
web:
image: nginx
6. 文檔信息
| 項(xiàng)目 | 值 |
|---|---|
| 創(chuàng)建時(shí)間 | 2026-01-10 |
| Docker Compose 版本 | v5.0.1 |
| 參考文檔 | https://docs.docker.com/compose/ |
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
docker安裝Elasticsearch7.6集群并設(shè)置密碼
這篇文章主要介紹了docker安裝Elasticsearch7.6集群并設(shè)置密碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Docker項(xiàng)目部署之從后端到前端部署詳細(xì)流程
在當(dāng)今的軟件開發(fā)領(lǐng)域,容器化技術(shù)已經(jīng)成為了部署和管理應(yīng)用程序的重要手段,下面這篇文章主要給大家介紹了關(guān)于Docker項(xiàng)目部署之從后端到前端部署的相關(guān)資料,需要的朋友可以參考下2024-08-08
Docker開啟遠(yuǎn)程訪問(wèn)的實(shí)現(xiàn)方式
這篇文章主要介紹了Docker開啟遠(yuǎn)程訪問(wèn)的實(shí)現(xiàn)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
Docker自定義網(wǎng)絡(luò)的實(shí)現(xiàn)步驟
本文詳細(xì)介紹了Docker網(wǎng)絡(luò)的基礎(chǔ)概念、自定義網(wǎng)絡(luò)的重要性及其類型bridge、overlay、macvlan等,具有一定的參考價(jià)值,感興趣的可以了解一下2026-04-04
docker容器在uos-12038.101上啟動(dòng)報(bào)錯(cuò)的解決辦法
這篇文章主要介紹了docker容器在uos-12038.101上啟動(dòng)報(bào)錯(cuò)的問(wèn)題,解決方案是需要在/etc/systemd/system/或者 /usr/lib/systemd/system/2024-03-03
找到docker.service文件,在ExecStart=/usr/bin/dockerd后面添加 --default-ulimit nofile=65536:65536參數(shù),需要的朋友可以參考下

