Docker 容器健康檢查指的是在 Dockerfile 中使用 HEALTHCHECK
指令對容器的運行狀態進行檢查,
並在 docker ps
的 STATUS 欄顯示 healthy/unhealthy。
HEALTHCHECK
指令有兩種格式:
HEALTHCHECK [OPTIONS] CMD command
(通過在容器內運行命令檢查容器的健康狀態)HEALTHCHECK NONE
(禁用從基礎鏡像中繼承任何健康檢查)
HEALTHCHECK
指令告訴 Docker 如何測試一個容器,以檢查它是否仍在工作。
這可以檢測到一些情況,例如 web 服務器陷入無限循環,無法處理新的連接,即使服務器進程仍在運行。
當容器指定了健康檢查時,除了正常狀態外,它還具有健康狀態。此狀態初始為 starting
。
只要健康檢查通過,它就會恢復到 healthy
(無論它以前處於什么狀態)。在連續失敗一定次數后,它就會變得 unhealthy
。
CMD
之前可以出現的選項有:
- --interval=DURATION(默認:30s)
- --timeout=DURATION(默認:30s)
- --start-period=DURATION(默認:0s)
- --retries=N(默認:3)
運行狀態檢查首先會在容器啟動后的 interval
秒內運行,然后在前一次檢查完成后的 interval
秒內再次運行。
如果一次狀態檢查花費的時間超過 timeout
秒,則認為這次檢查失敗。
容器的運行狀態檢查連續失敗 retries
次才會被視為不健康。
start period
為需要時間啟動的容器提供初始化時間。在此期間的探測失敗將不計入最大重試次數。
但是,如果在啟動期間健康檢查成功,則認為容器已啟動,所有連續失敗的情況都將計算到最大重試次數。
Dockerfile 中只能有一個 HEALTHCHECK
指令。如果列出多個,則只有最后一個 HEALTHCHECK
才會生效。
CMD
關鍵字后面的命令可以是 shell 命令(例如 HEALTHCHECK CMD /bin/check-running
)或 exec 數組(與其他 Dockerfile 命令一樣,有關詳細信息,請參見 ENTRYPOINT
)。
command
的退出狀態表示容器的健康狀態。可能的值是:
- 0:成功--容器運行良好,可以使用
- 1:不健康—-容器不能正常工作
- 2:保留--不使用此退出碼
例如,每五分鍾左右檢查一次 web 服務器是否能在三秒內為站點的主頁提供服務:
HEALTHCHECK --interval=5m --timeout=3s \
CMD curl -f http://localhost/ || exit 1
為了幫助調試失敗的探測,command
寫在 stdout 或 stderr 上的任何輸出文本(UTF-8編碼)都將存儲在健康狀態中,並且可以通過 docker inspect
進行查詢。
這樣的輸出應該保持簡短(目前只存儲前4096個字節)。
當容器的健康狀態發生變化時,將生成一個具有新狀態的 health_status
事件。