docker容器的健康檢測是在編寫dockerfile時,將檢測機制寫入到dockerfile中,基於此docerfile生成的鏡像,在運行容器時會有健康檢測的功能。node
dockerfile中的格式:nginx
- HEALTHCHECK [選項] CMD <命令>:設置檢查容器健康情況的命令。
- HEALTHCHECK NONE:若是基礎鏡像有健康檢查指令,使用這行能夠屏蔽掉其健康檢查指令。
HEALTHCHECK 指令是告訴 Docker引擎應該如何進行判斷容器的狀態是否正常,這是 Docker 1.12 引入的指令。web
在沒有 HEALTHCHECK 指令前,Docker 引擎只能夠經過容器內主進程是否退出來判斷容器是否狀態異常。不少狀況下這沒問題,可是若是程序進入死鎖狀態,或者死循環狀態,應用進程並不退出,可是該容器已經沒法提供服務了。在 1.12 之前,Docker 不會檢測到容器的這種狀態,從而不會從新調度,致使可能會有部分容器已經沒法提供服務了卻還在接受用戶請求。docker
而自 1.12 以後,Docker 提供了 HEALTHCHECK 指令,經過該指令指定一行命令,用這行命令來判斷容器主進程的服務狀態是否還正常,從而比較真實的反應容器實際狀態。shell
當在一個鏡像指定了 HEALTHCHECK 指令後,用其啓動容器,初始狀態會爲 starting,在 HEALTHCHECK 指令檢查成功後變爲 healthy,若是連續必定次數失敗,則會變爲 unhealthy。ide
HEALTHCHECK 支持下列選項:ui
- --interval=<間隔>:兩次健康檢查的間隔,默認爲 30 秒;
- --timeout=<時長>:健康檢查命令運行超時時間,若是超過這個時間,本次健康檢查就被視爲失敗,默認 30 秒;
- --retries=<次數>:當連續失敗指定次數後,則將容器狀態視爲 unhealthy,默認 3 次。
和 CMD, ENTRYPOINT 同樣,HEALTHCHECK 只能夠出現一次,若是寫了多個,只有最後一個生效。code
在 HEALTHCHECK [選項] CMD 後面的命令,格式和 ENTRYPOINT 同樣,分爲 shell 格式,和 exec 格式。命令的返回值決定了該次健康檢查的成功與否:0:成功;1:失敗;2:保留,不要使用這個值。blog
用法舉例:進程
[root@node02 test]# cat Dockerfile #Dockerfile文件以下 FROM nginx:latest COPY test.txt /test.txt HEALTHCHECK --interval=5s --timeout=3s CMD cat /test.txt || exit 1
這裏咱們設置了每 5 秒檢查一次(這裏爲了試驗因此間隔很是短,實際應該相對較長),若是健康檢查命令超過 3 秒沒響應就視爲失敗,而且使用CMD cat /test.txt || exit 1 做爲健康檢查命令。
構建鏡像:
[root@node02 test]# docker build -t lzj:v6 .
啓動一個容器:
[root@node02 test]# docker run -d --name web03 lzj:v6
當該容器運行後,就能夠查看到該容器的運行狀態,初始狀態爲(health: starting),當一次檢測成功後,會轉換爲(healthy),以下:
若是健康檢查連續失敗超過了重試次數,狀態就會變爲 (unhealthy)。我這裏進入容器將其CMD執行的查看test.txt文件刪除掉,狀態就會爲unhealthy,以下:
爲了幫助排障,健康檢查命令的輸出(包括 stdout 以及 stderr)都會被存儲於健康狀態裏,能夠用 docker inspect 來查看。
———————— 本文至此結束,感謝閱讀 ————————