docker容器的健康檢測是在編寫dockerfile時,將檢測機制寫入到dockerfile中,基於此docerfile生成的映象,在執行容器時會有健康檢測的功能。
dockerfile中的格式:healthcheck 指令是告訴 docker引擎應該如何進行判斷容器的狀態是否正常,這是 docker 1.12 引入的指令。
在沒有 healthcheck 指令前,docker 引擎只可以通過容器內主程序是否退出來判斷容器是否狀態異常。很多情況下這沒問題,但是如果程式進入死鎖狀態,或者死迴圈狀態,應用程序並不退出,但是該容器已經無法提供服務了。在 1.12 以前,docker 不會檢測到容器的這種狀態,從而不會重新排程,導致可能會有部分容器已經無法提供服務了卻還在接受使用者請求。
而自 1.12 之後,docker 提供了 healthcheck 指令,通過該指令指定一行命令,用這行命令來判斷容器主程序的服務狀態是否還正常,從而比較真實的反應容器實際狀態。
當在乙個映象指定了 healthcheck 指令後,用其啟動容器,初始狀態會為 starting,在 healthcheck 指令檢查成功後變為 healthy,如果連續一定次數失敗,則會變為 unhealthy。
healthcheck 支援下列選項:和 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 來檢視。
docker容器 Docker 容器逃逸漏洞
2020年12月1日,阿里雲應急響應中心監測到 containerd 官方發布安全更新,修復了 docker 容器逃逸漏洞 cve 2020 15257 漏洞描述 containerd 是乙個控制 runc 的守護程序,提供命令列客戶端和 api,用於在乙個機器上管理容器。在特定網路條件下,攻擊者可...
docker學習 docker容器
1.容器檢視 已經啟動的容器 docker ps 所有的容器 docker ps a2.啟動容器相關引數 互動式容器 退出時容器處於停止狀態,無法使用 docker run it name mynginx nginx bin bash 退出當前容器 exit 守護式容器 埠88是宿主機的對映埠 do...
docker容器 2 容器操作
docker ps options options說明 a 顯示所有的容器,包括未執行的。f 根據條件過濾顯示的內容。format 指定返回值的模板檔案。l 顯示最近建立的容器。n 列出最近建立的n個容器。no trunc 不截斷輸出。q 靜默模式,只顯示容器編號。s 顯示總的檔案大小。docker...