首頁(yè) 資訊 Docker 容器的健康檢查

Docker 容器的健康檢查

來源:泰然健康網(wǎng) 時(shí)間:2024年12月29日 15:43

健康檢查 (HEALTHCHECK) 指令簡(jiǎn)介

健康檢查 (HEALTHCHECK) 指令告訴 Docker 如何檢查容器是否仍在工作。 它能夠監(jiān)測(cè)類似一個(gè)服務(wù)器雖然服務(wù)進(jìn)程仍在運(yùn)行, 但是陷入了死循環(huán), 不能響應(yīng)新的請(qǐng)求的情況。

當(dāng)一個(gè)容器有指定健康檢查 (HEALTHCHECK) 時(shí), 它除了普通狀態(tài)之外, 還有健康狀態(tài) (health status) 。 健康狀態(tài)的初始狀態(tài)是正在啟動(dòng) (starting) , 一旦通過了一個(gè)健康檢查, 它將變成健康 (healthy) (不管之前的狀態(tài)是什么), 經(jīng)過一定數(shù)量的連續(xù)失敗之后, 它將變成不健康 (unhealthy) 。

健康檢查 (HEALTHCHECK) 指令有兩種形式:

HEALTHCHECK [OPTIONS] CMD command 通過運(yùn)行容器內(nèi)的一個(gè)指令來檢查容器的健康情況;HEALTHCHECK NONE 禁用任何(包括基層至父鏡像)健康檢查指令。

可以出現(xiàn)在 CMD 之前的選項(xiàng)有:

--interval=DURATION 間隔時(shí)間, 默認(rèn) 30s (30秒);--timeout=DURATION 超時(shí)時(shí)間, 默認(rèn) 30s (30秒);--start-period=DURATION 啟動(dòng)時(shí)間, 默認(rèn) 0s, 如果指定這個(gè)參數(shù), 則必須大于 0s ;--retries=N 重試次數(shù), 默認(rèn) 3 ;

健康檢查會(huì)在容器啟動(dòng)后的間隔時(shí)間內(nèi)運(yùn)行, 在上一次檢查完成之后, 按照指定的間隔時(shí)間再次運(yùn)行。

如果單次健康檢查的時(shí)間超過了指定的超時(shí)時(shí)間, 則認(rèn)為是失敗的。

如果連續(xù)失敗次數(shù)超過了指定的重試次數(shù), 則容器的健康狀態(tài)將被視為不健康 (unhealthy) 。

start-period 為需要啟動(dòng)的容器提供了初始化的時(shí)間段, 在這個(gè)時(shí)間段內(nèi)如果檢查失敗, 則不會(huì)記錄失敗次數(shù)。 如果在啟動(dòng)時(shí)間內(nèi)成功執(zhí)行了健康檢查, 則容器將被視為已經(jīng)啟動(dòng), 如果在啟動(dòng)時(shí)間內(nèi)再次出現(xiàn)檢查失敗, 則會(huì)記錄失敗次數(shù)。

一個(gè) Dockerfile 中只能有一個(gè)健康檢查 (HEALTHCHECK) 指令生效, 如果出現(xiàn)了多個(gè), 則只有最后一個(gè)有效。

在 CMD 關(guān)鍵字之后的 command 可以是一個(gè) shell 命令(例如: HEALTHCHECK CMD /bin/check-running)或者一個(gè) exec 數(shù)組(與其它 Dockerfile 命令相同, 參考 [ENTRYPOINT])。

該命令的返回值說明了容器的狀態(tài), 可能是值為:

0: healthy - 容器健康, 可以使用;1: unhealthy - 容器工作不正常, 需要診斷;2: reserved - 保留, 不要使用這個(gè)返回值;

例如, 每隔 5 分鐘檢查一個(gè)網(wǎng)絡(luò)服務(wù)器能夠在 3 秒內(nèi)響應(yīng)主頁(yè)的請(qǐng)求:

HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ || exit 1

為了幫助調(diào)試失敗信息, 任何向 stdout 或者 stderr 的文本輸出會(huì)被記錄下來(使用 UTF-8 編碼), 并保存在容器的健康狀態(tài)中, 可以使用 docker inspect 命令查詢。 健康健康檢查的錯(cuò)誤輸出應(yīng)該盡可能的簡(jiǎn)短, 目前只保存前面的 4k 字符。

當(dāng)容器的健康狀態(tài)發(fā)生變化時(shí), 將會(huì)產(chǎn)生一個(gè) health_status 事件, 這個(gè)時(shí)間將會(huì)攜帶新的狀態(tài)。

健康檢查 (HEALTHCHECK) 指令在 Docker 的 1.12 版本之后可用。

健康檢查 (HEALTHCHECK) 指令使用示例

如果沒有為容器指定健康檢查 (HEALTHCHECK) 指令, 則使用 docker ps 時(shí), 返回列表如下:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 72d9db1c503d beginor/jexus:5.8.3.0 "docker-entrypoint.s…" 9 days ago Up 7 days 0.0.0.0:8088->80/tcp jexus

在 status 那一列只能顯示 Up 7 days , 表示 7 天前啟動(dòng), 不能顯示容器的健康狀況。

如果指定了容器指定健康檢查 (HEALTHCHECK) 指令, 則輸出為:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 10ec32c21b2e beginor/jexus:5.8.3.1 "docker-entrypoint.s…" 2 weeks ago Up 1 days (healthy) 0.0.0.0:8088->80/tcp jexus

可以看到, 在 status 那一列顯示為 Up 1 days (healthy) 。

由此可見, 健康檢查 (HEALTHCHECK) 指令在容器的管理中是非常重要的, 因此需要為每一個(gè)容器添加這個(gè)指令。

本文參與 騰訊云自媒體同步曝光計(jì)劃,分享自作者個(gè)人站點(diǎn)/博客。

相關(guān)知識(shí)

使用 docker 部署 AspNetCore 應(yīng)用:使用alpine鏡像并加入健康檢查和瘦身
Docker安全性:最佳實(shí)踐和常見安全考慮
Docker鏡像瘦身技巧的新思路(基于chiselled Ubuntu)本文介紹一種docker image瘦身的技巧
[云原生] Kubernetes(k8s)健康檢查詳解與實(shí)戰(zhàn)演示(就緒性探針 和 存活性探針)
產(chǎn)后42天健康檢查內(nèi)容
生殖器檢查檢查什么
定期體檢對(duì)身體健康的重要性,體檢都檢查哪些內(nèi)容?
職業(yè)健康檢查包括()。A.上崗前的健康檢查B.在崗期間的健康檢查C.定期的健康檢查D.離崗時(shí)的健康檢
男性生殖器官檢查主要檢查哪些
產(chǎn)后檢查的具體檢查內(nèi)容是什么

網(wǎng)址: Docker 容器的健康檢查 http://m.u1s5d6.cn/newsview905364.html

推薦資訊