Docker?Compose入門指南之一條命令啟動多服務
在上一篇文章的末尾,我留了一個問題:每次啟動 Flask + Redis 應用都要敲七八條命令,太累了。有沒有更優(yōu)雅的方式?
有。這就是我們今天的主角——Docker Compose。
如果你跟著第 10 篇親手敲過那幾十條命令,一定能感受到手動管理的痛苦:要先創(chuàng)建網絡、創(chuàng)建數據卷、啟動 Redis、等待 Redis 就緒、啟動 Flask……順序不能錯,參數不能漏,換一臺機器又得重來一遍。Docker Compose 的目標就是把這些步驟寫進一個 YAML 文件,然后一條命令搞定一切。這篇就來帶你入門 Compose,把 Flask + Redis 計數器應用的啟動過程從"手動敲 8 條命令"變成"一條 docker compose up"。
一、Compose 是什么?解決什么問題?
Docker Compose 是 Docker 官方推出的多容器應用編排工具,核心價值就是用聲明式的 YAML 文件描述整個應用棧,包括服務、網絡、數據卷的配置,然后通過一條命令統一管理所有服務的生命周期。
看一下我們第 10 篇手動操作的痛點,以及 Compose 是如何一一解決的:
二、V1 vs V2 vs V3:我該用哪個?
在開始寫配置文件之前,有必要弄清楚版本號的問題。
Docker Compose 文件格式經歷了多次演變:V1 格式(docker-compose.yml,無 version 字段)是早期版本,已經徹底廢棄;V2 格式引入了 version: '2.x',支持命名卷和網絡;V3 格式(version: '3.x')增加了 Swarm 部署相關配置。
但現在(2024 年起)Docker 官方已棄用version 字段。使用 docker compose(V2 命令,中間是空格,不是橫杠)時,直接編寫不帶 version 的 YAML 文件即可,Docker 會自動使用 Compose Specification 規(guī)范解析。如果你看到一些教程還在使用 version: '3',那是歷史遺留寫法,功能上仍然可用,但官方推薦不再寫 version。
本系列全部采用最新的 Compose Specification 格式(無 version 字段),命令使用 docker compose(空格版)。
三、編寫第一個 docker-compose.yml
把第 10 篇的啟動流程"翻譯"成 Compose 文件。在項目根目錄下新建 docker-compose.yml:
# ============================================================
# Flask + Redis 計數器應用 —— Docker Compose 配置文件
# 系列貫穿案例
# ============================================================
services:
# ---- Redis 服務 ----
redis:
image: redis:alpine
container_name: redis
restart: unless-stopped
command: redis-server --appendonly yes
volumes:
- redis-data:/data
networks:
- app-net
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 3s
retries: 3
start_period: 5s
# ---- Flask 應用服務 ----
flask-app:
image: flask-redis-counter:2.0
# 如果鏡像不在本地,可以改為 build: . 來從 Dockerfile 構建
container_name: flask-app
restart: unless-stopped
ports:
- "5000:5000"
volumes:
- flask-logs:/app/logs
networks:
- app-net
depends_on:
redis:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:5000/health"]
interval: 30s
timeout: 3s
start_period: 5s
retries: 3
# ---- 數據卷 ----
volumes:
redis-data:
flask-logs:
# ---- 網絡 ----
networks:
app-net:
driver: bridge3.1 文件結構拆解
Compose 文件包含三個頂級元素:
services:定義應用棧中每個服務的配置。每個服務相當于一個 docker run 命令的完整參數集合。當前定義了兩個服務——redis 和 flask-app。在 Compose 管理的網絡中,服務名(redis、flask-app)會自動作為 DNS 記錄,其他服務可以通過服務名直接訪問。這就是為什么 app.py 里寫的 host='redis' 能直接工作——Compose 自動創(chuàng)建了 DNS 解析。
volumes:聲明命名卷。與手動執(zhí)行 docker volume create 創(chuàng)建的效果完全一致,但由 Compose 統一管理生命周期。docker compose down 時默認不會刪除 volumes(防止誤刪數據),如需刪除需加 -v 參數。
networks:聲明網絡。driver: bridge 表示創(chuàng)建自定義 bridge 網絡,與第 8 篇手動執(zhí)行 docker network create app-net 的效果完全一致。
3.2 depends_on 的兩種寫法
depends_on 有兩種用法,效果差異很大:
簡單寫法(僅控制啟動順序):
這種寫法只保證 redis 容器先啟動,但不等待 Redis 服務就緒——redis 容器可能處于 “Up” 狀態(tài)但 Redis 進程還在加載數據,此時 Flask 連接 Redis 會失敗。
條件寫法(等待健康檢查通過):
depends_on:
redis:
condition: service_healthy這是我們現在用的寫法:condition: service_healthy 表示不僅要等 redis 容器啟動,還要等它的健康檢查通過(redis-cli ping 返回 PONG),才會啟動 flask-app。這個 service_healthy 條件引入了 Compose v2.1+ 規(guī)范,到 Compose v3 曾被標記為 deprecated,但在最新的 Compose Specification 中又正式回歸。使用 docker compose 命令即可正常使用,完全不需要 version 字段。
四、核心命令:從 up 到 down
4.1 docker compose up:一鍵啟動
# 前臺啟動(可以看到所有服務的日志交錯輸出) docker compose up # 后臺啟動(推薦日常使用) docker compose up -d
輸出:
[+] Running 3/3
? Network flask-redis-counter_app-net Created 0.1s
? Volume "flask-redis-counter_redis-data" Created 0.0s
? Volume "flask-redis-counter_flask-logs" Created 0.0s
? Container redis Started 0.5s
? Container flask-app Started 1.2s
注意兩個細節(jié):第一,網絡和卷的名稱會自動帶上項目名(默認是當前目錄名,這里是 flask-redis-counter)作為前綴,避免不同項目之間的資源名稱沖突。第二,docker compose up -d 僅啟動服務,不會重新構建鏡像。如果你修改了 Dockerfile 或代碼,需要先 docker compose build 再 up,或者直接用 docker compose up --build -d。
4.2 查看服務狀態(tài)
輸出:
NAME IMAGE COMMAND SERVICE STATUS PORTS
flask-app flask-redis-counter:2.0 "python app.py" flask-app running (healthy) 0.0.0.0:5000->5000/tcp
redis redis:alpine "docker-entrypoint.s…" redis running (healthy) 6379/tcp
注意兩點:docker compose ps 只會顯示當前項目的容器(根據 docker-compose.yml 所在目錄識別項目),不會混入宿主機上其他 Docker 容器;STATUS 列標注了 (healthy),說明兩個服務的 HEALTHCHECK 都已通過。
4.3 查看日志
# 查看所有服務的日志 docker compose logs # 實時跟蹤日志 docker compose logs -f # 只看特定服務 docker compose logs flask-app # 看最后 50 行 docker compose logs --tail=50 flask-app
docker compose logs 和 docker logs 最大的區(qū)別在于:前者會聚合所有服務的日志,并在每條日志前標注服務名,對于排查跨服務的調用鏈問題非常方便。
4.4 擴容服務
這是手動模式最難做到的事情——Compose 一條命令搞定:
# 將 Flask 服務擴容到 3 個實例 docker compose up -d --scale flask-app=3
輸出:
[+] Running 3/3
? Container redis Running 0.0s
? Container flask-app Started 0.3s
? Container flask-app-2 Started 0.4s
? Container flask-app-3 Started 0.4s
--scale 參數在 docker compose 中僅用于臨時一次性擴容,不會持久化到配置文件。下次執(zhí)行 docker compose up -d 時,副本數會恢復為默認的 1 個。如果需要長期使用多個副本,建議在 Compose 文件中使用 deploy.replicas(需 Swarm 模式),或直接用 K8s 的 Deployment 管理。
4.5 停止與清理
# 停止所有服務(不刪除容器、網絡、卷) docker compose stop # 啟動已停止的服務 docker compose start # 停止并刪除容器(不刪除網絡和卷) docker compose down # 停止并刪除容器、網絡(保留卷,防止誤刪數據) docker compose down --volumes # 或簡寫 docker compose down -v
注意:docker compose down 默認不會刪除 volumes,這是出于數據安全的考慮。如果你確定要徹底清理包括數據在內的所有資源,必須顯式加 -v。
五、完整驗證流程
# 1. 確認目錄結構
ls
# app.py docker-compose.yml Dockerfile requirements.txt .dockerignore
# 2. 啟動應用棧
docker compose up -d
# 3. 查看狀態(tài)
docker compose ps
# 4. 測試功能
curl http://localhost:5000
# Hello World! I have been seen 1 times.
curl http://localhost:5000
# Hello World! I have been seen 2 times.
# 5. 測試健康檢查
curl http://localhost:5000/health
# {"status":"ok"}
# 6. 查看聚合日志
docker compose logs --tail=20
# 7. 停止服務
docker compose down
現在,整個 Flask + Redis 應用棧的啟動從第 10 篇的"手動敲 8 條命令"變成了:
一條命令,從啟動 Redis、等待就緒、啟動 Flask,到創(chuàng)建網絡和數據卷,全部自動完成。
六、V1 vs V2 命令對比
Docker Compose 有兩個命令版本,如果你在網上看教程,可能會遇到混用的情況。以下是區(qū)別:
如果你之前用過 docker-compose(帶橫杠),現在統一換為 docker compose(空格)。兩者語法 99% 兼容,但 V2 在性能和功能上更優(yōu)。
七、本篇總結
Docker Compose 解決的核心問題就是——把多容器應用從手動管理變成聲明式管理。
- 聲明式配置:
docker-compose.yml一站式定義服務、網絡、卷,可納入 Git 管理 - 一鍵啟停:
docker compose up -d和docker compose down,告別冗長的手動命令 - 健康檢查驅動的啟動順序:
depends_on+condition: service_healthy,不再需要sleep - 服務擴容:
--scale參數快速測試多副本場景 - 聚合日志:一個命令查看整個應用棧的日志,跨服務排錯效率大幅提升
到此這篇關于Docker Compose入門指南之一條命令啟動多服務的文章就介紹到這了,更多相關Docker Compose命令內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Centos7 安裝部署Kubernetes(k8s)集群實現過程
這篇文章主要為大家介紹了Centos7 安裝部署Kubernetes(k8s)集群實現過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11

