您好,登錄后才能下訂單哦!
概述
Docker
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何流行的Linux機器或Windows 機器上,也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何接口。
dockerfile
Dockerfile是一個包含用于組合映像的命令的文本文檔。可以使用在命令行中調用任何命令。 Docker通過讀取Dockerfile中的指令自動生成映像。
docker容器的健康檢測是在編寫dockerfile時,將檢測機制寫入到dockerfile中,基于此docerfile生成的鏡像,在運行容器時會有健康檢測的功能。
dockerfile中的格式:
- HEALTHCHECK [選項] CMD <命令>:設置檢查容器健康狀況的命令。
- HEALTHCHECK NONE:如果基礎鏡像有健康檢查指令,使用這行可以屏蔽掉其健康檢查指令。
HEALTHCHECK 指令是告訴 Docker引擎應該如何進行判斷容器的狀態是否正常,這是 Docker 1.12 引入的指令。
在沒有 HEALTHCHECK 指令前,Docker 引擎只可以通過容器內主進程是否退出來判斷容器是否狀態異常。很多情況下這沒問題,但是如果程序進入死鎖狀態,或者死循環狀態,應用進程并不退出,但是該容器已經無法提供服務了。在 1.12 以前,Docker 不會檢測到容器的這種狀態,從而不會重新調度,導致可能會有部分容器已經無法提供服務了卻還在接受用戶請求。
而自 1.12 之后,Docker 提供了 HEALTHCHECK 指令,通過該指令指定一行命令,用這行命令來判斷容器主進程的服務狀態是否還正常,從而比較真實的反應容器實際狀態。
當在一個鏡像指定了 HEALTHCHECK 指令后,用其啟動容器,初始狀態會為 starting,在 HEALTHCHECK 指令檢查成功后變為 healthy,如果連續一定次數失敗,則會變為 unhealthy。
HEALTHCHECK 支持下列選項:
- --interval=<間隔>:兩次健康檢查的間隔,默認為 30 秒;
- --timeout=<時長>:健康檢查命令運行超時時間,如果超過這個時間,本次健康檢查就被視為失敗,默認 30 秒;
- --retries=<次數>:當連續失敗指定次數后,則將容器狀態視為 unhealthy,默認 3 次。
和 CMD, ENTRYPOINT 一樣,HEALTHCHECK 只可以出現一次,如果寫了多個,只有最后一個生效。
在 HEALTHCHECK [選項] CMD 后面的命令,格式和 ENTRYPOINT 一樣,分為 shell 格式,和 exec 格式。命令的返回值決定了該次健康檢查的成功與否:0:成功;1:失敗;2:保留,不要使用這個值。
用法舉例:
[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 來查看。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。