Dockerfile中使用HEALTHCHECK的形式有兩種:
1、HEALTHCHECK [options] CMD command
2、HEALTHCHECK NODE 意思是禁止從父鏡像繼承的HEALTHCHECK生效
下面我們主要介紹第一種形式的應用:
options的可設定參數:
interval:間隔(s秒、m分鍾、h小時),從容器運行起來開始計時interval秒(或者分鍾小時)進行第一次健康檢查,隨后每間隔interval秒進行一次健康檢查;還有一種特例請看timeout解析。
--start-period=DURATION 啟動時間, 默認 0s, 如果指定這個參數, 則必須大於 0s ;--start-period 為需要啟動的容器提供了初始化的時間段, 在這個時間段內如果檢查失敗, 則不會記錄失敗次數。 如果在啟動時間內成功執行了健康檢查, 則容器將被視為已經啟動, 如果在啟動時間內再次出現檢查失敗, 則會記錄失敗次數。
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