【Docker基礎】Docker-compose進階配置:健康檢查與服務就緒

目錄

引言

1 Docker健康檢查基礎概念

1.1 什么是健康檢查

1.2 健康檢查的狀態

2 healthcheck配置詳解

2.1 基本語法

2.2 配置參數解釋

2.3 健康檢查命令的編寫

2.4 健康檢查的工作流程

3 服務依賴與健康檢查

3.1 depends_on的基本用法

3.2 結合健康檢查的依賴

3.3 服務啟動順序控制流程

4 高級配置與實踐

4.1 多階段健康檢查

4.2 避免常見陷阱

4.3 生產環境建議配置

5 案例:完整Web應用棧配置

6 總結

附錄:常用服務健康檢查命令參考


引言

在現代微服務架構中,服務之間的依賴關系變得越來越復雜。一個服務可能需要等待其他服務完全就緒后才能正常工作。Docker-compose作為容器編排工具,提供了強大的健康檢查和服務依賴管理功能,能夠幫助我們構建更加健壯的容器化應用。

1 Docker健康檢查基礎概念

1.1 什么是健康檢查

健康檢查(Healthcheck)是Docker提供的一種機制,用于檢測容器內運行的應用程序是否處于健康狀態。它通過定期執行指定的命令來驗證服務的可用性,并根據命令的返回值判斷服務是否健康。
健康檢查的主要作用包括:
  • 自動檢測服務故障
  • 防止將請求路由到不健康的實例
  • 實現服務啟動順序控制
  • 提高系統整體可靠性

1.2 健康檢查的狀態

Docker中的健康檢查有三種可能的狀態:
  • healthy:健康檢查通過,服務正常運行
  • unhealthy:健康檢查失敗,服務不可用
  • starting:容器剛啟動,尚未完成第一次健康檢查

2 healthcheck配置詳解

2.1 基本語法

  • 在docker-compose.yml文件中,我們可以為每個服務配置healthcheck選項。配置示例:
services:webapp:image: my-webapp:latesthealthcheck:test: ["CMD", "curl", "-f", "http://localhost:8080/health"]interval: 30stimeout: 10sretries: 3start_period: 5s

2.2 配置參數解釋

參數

描述

默認值

test

檢查命令,可以是字符串或數組格式

interval

檢查間隔時間

30s

timeout

檢查超時時間

30s

retries

連續失敗次數達到該值則標記為unhealthy

3

start_period

容器啟動后的初始化時間,此期間失敗不計入retries

0s

2.3 健康檢查命令的編寫

  • 數據庫健康檢查示例
healthcheck:test: ["CMD-SHELL", "pg_isready -U postgres"]
  • Web服務健康檢查示例
healthcheck:test: ["CMD", "curl", "-f", "http://localhost/health"]
  • 自定義腳本檢查示例
healthcheck:test: ["CMD", "/bin/sh", "-c", "check_script.sh"]

2.4 健康檢查的工作流程

  • 容器啟動后,首先等待start_period指定的初始化時間
  • 執行第一次健康檢查命令
  • 如果檢查成功,立即標記為healthy狀態
  • 如果檢查失敗,增加失敗計數,并在達到retries次數后標記為unhealthy
  • 無論成功或失敗,都會在interval時間后再次執行檢查

3 服務依賴與健康檢查

3.1 depends_on的基本用法

  • 在Docker-compose中,depends_on用于指定服務之間的啟動依賴關系。基本語法如下:
services:web:depends_on:- db- redis

3.2 結合健康檢查的依賴

  • 從Docker-compose版本2.1開始,depends_on可以與健康檢查結合,實現真正的服務就緒等待:
services:web:depends_on:db:condition: service_healthyredis:condition: service_healthy
可用的condition選項:
  • service_started:僅等待服務啟動(默認)
  • service_healthy:等待服務健康檢查通過
  • service_completed_successfully:適用于一次性服務,等待其成功完成

3.3 服務啟動順序控制流程

  • Docker-compose首先啟動依賴服務(DB)
  • 等待DB服務的健康檢查通過
  • 只有DB服務報告healthy狀態后,才啟動Web服務
  • Web服務啟動后可以立即與健康的DB服務建立連接

4 高級配置與實踐

4.1 多階段健康檢查

  • 對于復雜的服務,可以實現多階段健康檢查策略:
healthcheck:test: ["CMD", "/bin/sh", "-c", "check_phase1.sh && check_phase2.sh"]

4.2 避免常見陷阱

  • 檢查命令過于簡單:簡單的進程存在檢查可能無法反映實際服務狀態
  • 檢查間隔不合理:過于頻繁的檢查會增加系統負載,間隔太長則響應慢
  • 忽略start_period:對于啟動慢的服務,應設置足夠的初始化時間
  • 依賴循環:避免服務間的循環健康依賴

4.3 生產環境建議配置

healthcheck:test: ["CMD", "custom_healthcheck", "--verbose"]interval: 1mtimeout: 10sretries: 3start_period: 2m

5 案例:完整Web應用棧配置

version: '3.8'services:db:image: postgres:13environment:POSTGRES_PASSWORD: examplehealthcheck:test: ["CMD-SHELL", "pg_isready -U postgres"]interval: 5stimeout: 5sretries: 5start_period: 10sredis:image: redis:6healthcheck:test: ["CMD", "redis-cli", "ping"]interval: 5stimeout: 5sretries: 3web:build: .depends_on:db:condition: service_healthyredis:condition: service_healthyports:- "8000:8000"healthcheck:test: ["CMD", "curl", "-f", "http://localhost:8000/health"]interval: 30stimeout: 10sretries: 3
  • 調試健康檢查:當健康檢查不工作時,可以使用以下命令調試:
# 查看容器健康狀態
docker inspect --format='{{json .State.Health}}' container_name# 查看健康檢查日志
docker logs container_name

6 總結

Docker-compose的健康檢查和服務依賴功能為構建可靠的微服務架構提供了強大支持。通過合理配置healthcheck和depends_on,我們可以:
  • 確保服務真正就緒后才被使用
  • 自動檢測并處理故障服務
  • 實現服務間的有序啟動
  • 提高整個系統的穩定性
在實際應用中,應根據具體服務的特性設計恰當的健康檢查策略,并充分測試以確保其有效性。記住,一個好的健康檢查應該能夠真實反映服務的可用狀態,既不過于寬松也不過于嚴格。

附錄:常用服務健康檢查命令參考

服務類型

檢查命令示例

MySQL

mysqladmin ping -h localhost

PostgreSQL

pg_isready -U username

Redis

redis-cli ping

MongoDB

mongo --eval 'db.runCommand("ping").ok'

HTTP服務

curl -f http://localhost/health

gRPC服務

grpc_health_probe -addr=:50051

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/94914.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/94914.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/94914.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis大Key處理流程與注意事項

概述 Redis大Key問題是在生產環境中經常遇到的技術挑戰,它可能導致內存占用過高、網絡延遲增加、阻塞其他操作等嚴重問題。本文將深入探討Redis大Key的識別、處理流程以及相關注意事項。 什么是Redis大Key 定義標準 String類型: 單個Key的Value超過10KBHash類型: 單…

領悟8種常見的設計模式

很多 Java 初學者覺得設計模式 “抽象難學”,其實是沒抓住核心邏輯 —— 設計模式不是 “炫技代碼”,而是前輩們總結的 “解決高頻復雜問題的通用思路”,好吧,你可以過一遍了解這些大概是個什么東西不求我們能夠完全理解&#xff…

復雜BI報表SQL

復雜SQL 一行多個人員,平均瓜分總產量。 -- 西寧硅料三期 with b as ( select(row_number() OVER(PARTITION BY t1.tool ORDER BY t1.tool ) - 1) AS help_topic_id from((select1 AS tool union allselect1 AS tool union allselect1 AS tool union allselect1 AS …

bin log 和 redo log有什么區別

問題bin log 和 redo log有什么區別我的回答首先,這兩種日志的作用不同。redo log是InnoDB引擎特有的,主要用于崩潰恢復,保證事務的持久性。而bin log是MySQL服務層的日志,主要用于主從復制和數據恢復。從層次上看,red…

導入文件允許合并表格

本來呢,已經有幾年沒咋寫博客了,但是好像網上沒什么好的合并導入可以抄的,周末加班了一天弄出來了,想一想也不算造輪子,可以露一手出來,最近也挺喜歡寫注釋的,應該方便大家抄的public class Tra…

WebIDEPLOY 技術驅動櫻桃溯源管理系統的價值重塑與落地實踐—— 以櫻桃溯源管理系統構建產業信任體系的路徑探索

一、WebIDEPLOY 技術支撐下的櫻桃溯源系統核心架構櫻桃種植從開花到銷售的全流程數據記錄,需要兼顧專業性與易操作性,WebIDEPLOY 技術以 “零代碼降低門檻、云原生優化成本” 的特性,成為連接數字工具與櫻桃種植的關鍵紐帶。系統核心架構圍繞…

零知開源——基于STM32F407VET6實現ULN2003AN驅動28BYJ-48步進電機控制系統

?零知IDE 是一個真正屬于國人自己的開源軟件平臺,在開發效率上超越了Arduino平臺并且更加容易上手,大大降低了開發難度。零知開源在軟件方面提供了完整的學習教程和豐富示例代碼,讓不懂程序的工程師也能非常輕而易舉的搭建電路來創作產品&am…

如何多個手機設備的實現不同公網IP

為了避免多個手機設備使用相同的公網IP地址導致平臺檢測關聯,可以通過以下方法實現不同公網IP的分配和管理. 一、移動網絡(SIM 卡)方案 1.移動數據與Wi-Fi切換:通過切換移動數據和不同Wi-Fi網絡(如家庭Wi-Fi、公共Wi-F…

沙箱操作指南

這是一份通用且詳細的沙箱操作指南。沙箱(Sandbox)是一種安全隔離環境,常用于測試未經驗證的代碼、軟件、文件或訪問可疑網址,而不會對真實系統造成危害。 本指南將分為以下幾個部分: 沙箱是什么? 為什么需要使用沙箱? 如何使用沙箱?(三種主要類型) 最佳實踐與注意事…

【數字IC后端】引導時鐘樹CTS的生成方向之anchor driver

如何控制數字IC后端CTS的生成方向?我們可以引入anchor driver來實現引導。景芯12nm車規APR實戰中,我們可以看到,絕大部分的sink都受控于xxxx_tessent_occ_clk_cpu_inst/tessent_persistent_cell_clock_out_mux/C10_ctmi_1這個mux,…

「Java EE開發指南」如何使用MyEclipse啟用自動JSP驗證?

自動JSP驗證可以在兩種情況下啟用,在本文中您將學習如何正確使用它。 該特性在MyEclipse中可用。 MyEclipse v2025.1離線版下載 您可以在保存JSP編輯器的內容或執行“Clean”操作時啟用自動JSP驗證。要進行正確的驗證,必須使用完整的JDK JVM啟動MyEcl…

leetcode_73 矩陣置零

1. 題意 給定一個 m x n 的矩陣,如果一個元素為 0 ,則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。 2. 題解 想不到O(1)的空間復雜度的做法, 只有抄抄題解這樣子才能維持的了生活。 2.1 暴力 維護兩個標記數組,分…

優雅地實現ChatGPT式的打字機效果:Spring Boot 流式響應

01 引言 之前專門介紹過流式響應的數據的接收、發送以及使用SSE由服務端推送數據的文章,但是要求前端必須使用EventSource訂閱實現。 有沒有通過直接通過瀏覽器訪問或者Fetch API直接調用的方式呢?效果還能和ChatGPT一樣,實現打字機的效果呢&…

Git 刪除文件

在 Git 中,刪除文件同樣被視為一種修改操作。下面我們通過實際操作演示如何刪除文件。假設要刪除文件 file5,如果你直接在文件系統中執行了刪除:這種直接刪除的方式并不會在 Git 中生效,反而會導致工作區與版本庫不一致。使用 git…

虛幻基礎:角色變換角色視角蒙太奇運動

能幫到你的話,就給個贊吧 😘 文章目錄角色視角機臂使用pawn控制旋轉:旋轉體將失去作用旋轉體攝像機:可以使用旋轉體控制:pawn不起作用角色變換角色移動:由移動組件控制移動方向:給組件任意一個方…

【LeetCode】31. 下一個排列

文章目錄31. 下一個排列題目描述示例 1:示例 2:示例 3:提示:解題思路1. 問題本質與字典序回顧2. 經典算法三步曲(必須原地、常數空間)3. 直觀示例與過程可視化4. 與“62. 不同路徑”風格對應的分析維度4.1 …

CVPR2025丨VL2Lite:如何將巨型VLM的“知識”精煉后灌入輕量網絡?這項蒸餾技術實現了任務專用的極致壓縮

關注gongzhonghao【CVPR頂會精選】小模型(Small Models)通常指參數量較小、計算與存儲成本更低的深度學習模型。近年來,它們在移動端部署、邊緣計算和隱私保護等場景中快速發展,逐漸成為大模型的輕量化補充。隨著蒸餾、剪枝、量化…

【SystemUI】鎖屏來通知默認亮屏Wake模式

一、問題描述 基于 Android 14平臺,鎖屏狀態下來通知時默認是進入Doze模式,此時屏幕不能點擊只能查看通知信息且很快滅屏,用戶體驗不是很好,要求修改為通知直接亮屏。二、問題分析 梳理鎖屏狀態下(特指設備息屏或處于D…

高并發寫入、毫秒級查詢——盤古信息攜手 TDengine 時序數據庫解決六大技術挑戰

小T導讀:廣東盤古信息科技股份有限公司(下文簡稱盤古信息)成立于 2005 年,是一家基于工業互聯網平臺的數字化管理解決方案供應商,公司自主研發的 IMS(數字化智能制造系統)可為離散、流程及混合制…

Unity 打包 iOS,Xcode 構建并上傳 App Store

一、準備工作(環境、賬號、證書與項目基礎)系統與工具macOS:使用與最新 Xcode 兼容的版本。Xcode:從 Mac App Store 安裝最新穩定版(建議與當前 App Store 必需的 Xcode 主版本保持一致)。Unity&#xff1a…