天天看點

Dockerfile HEALTHCHECK詳解

Dockerfile中使用HEALTHCHECK的形式有兩種:

1、HEALTHCHECK [options] CMD command(本次詳細解釋)

2、HEALTHCHECK NODE 意思是禁止從父鏡像繼承的HEALTHCHECK生效

下面我們主要介紹第一種形式的應用:

options有三個參數可設定:

interval:間隔(s秒、m分鐘、h小時),從容器運作起來開始計時interval秒(或者分鐘小時)進行第一次健康檢查,随後每間隔interval秒進行一次健康檢查;還有一種特例請看timeout解析。

timeout:執行command需要時間,比如curl 一個位址,如果超過timeout秒則認為逾時是錯誤的狀态,此時每次健康檢查的時間是timeout+interval秒。

retries:連續檢查retries次,如果結果都是失敗狀态,則認為這個容器是unhealth的

CMD關鍵字後面可以跟執行shell腳本的指令或者exec數組。CMD後面的指令執行完的傳回值代表容器的運作狀況,可能的值:0 health狀态,1 unhealth狀态,2 reserved狀态,這個沒細研究,用的也很少。

注意:在Dockerfile中隻能有一個HEALTHCHECK指令。如果您列出多個,則隻有最後一個HEALTHCHECK将生效。

下面我們進行幾個測試:

我手裡有一個nginx的鏡像,我們以它為base鏡像進行一些簡單的測試,以下是我的Dockerfile和測試腳本。

通過Dockerfile可以預計,容器啟動10s内HEALTCHECK的狀态為starting,10s後為healthy狀态。腳本是監聽容器的80端口,存在傳回0,不存在傳回1。

不多廢話,執行1、docker build -t test_nginx:2 . 生成鏡像

2、docker run -d test_nginx:2 啟動容器。

3、通過docker ps檢視HEALTHCHECK的狀态

驗證:10s内health狀态為starting,10s後狀态為healthy

下面我們需要進到容器把nginx服務停掉,然後觀察health的狀态,預計變成unhealthy使用時間為30s(關于時間上不好展示,有興趣的話可以自己去做測試)

登到容器先确認80端口存在,停掉nginx服務,80端口消失,檢視容器health狀态

驗證:關掉nginx服務後,腳本檢測到80端口不存在,傳回1,容器狀态為unhealthy(應該是執行了三次這個腳本得到結果都是1才确認這個容器是不健康的)

關于上面變成unhealthy狀态使用了30s的時間,認真看的同僚可能會發現不應該是timeout+interval秒後變嗎。我的command是執行一個腳本,很快就能得到結果,不存在timeout的情況,是以我設定timeout的意義并不大。

如果我這樣設定HEALTHCHECK –interval=10s –timeout=3s –retries=3 CMD curl http://192.168.30.5:5000/v2。可能會出現curl這個位址3秒内沒響應則認為失敗,然後再開始interval的時間進行下次檢測。最後顯示unhealthy的狀态應該是39s。這就不做測試了。

下面分享一個指令,通過docker指令得到指定容器id的健康狀态

docker inspect –format ‘{{json .State.Health.Status}}’ 41f1414fab75

---------------------

繼續閱讀