Docker容器進行健康檢查的三種方式
如何對 Docker 容器進行健康檢查
熟悉使用過kubernetes的人應該知道,kubernetes支持對pod進行健康檢查的功能,這對生產(chǎn)業(yè)務來說其實是非常有用處的,能快速發(fā)現(xiàn)服務不可用,并進行快速重啟恢復。其實不使用kubernetes這種容器管理工具,docker自身也能實現(xiàn)對容器的健康檢查。
從docker 1.12 版本之后,Docker 實現(xiàn)了原生的健康檢查實現(xiàn)。對于容器而言,最簡單的健康檢查是進程級的健康檢查,即檢驗進程是否存活。Docker Daemon 會自動監(jiān)控容器中的 PID1 進程,如果 docker run 命令中指明了 restart policy,可以根據(jù)重啟策略自動重啟已結束的容器。但是在很多實際應用中,僅使用進程級健康檢查方式還遠遠不夠。比如,容器中進程雖然還在運行卻由于其他種種原因無法繼續(xù)響應用戶請求(如應用死鎖),這樣的問題是無法通過進程級監(jiān)控發(fā)現(xiàn)的。
容器啟動之后,初始狀態(tài)會為 starting (啟動中)。Docker Engine 會等待 interval 時間,開始執(zhí)行健康檢查命令,并周期性執(zhí)行。如果單次檢查返回值非 0 或者運行需要比指定 timeout 時間還長,則本次檢查被認為失??;如果健康檢查連續(xù)失敗超過了 retries 重試次數(shù),狀態(tài)就會變?yōu)?unhealthy (不健康)。
1) 過程中有一次健康檢查成功,Docker 會將容器標記為healthy (健康)狀態(tài)
2) 當容器的健康狀態(tài)發(fā)生變化時,Docker Engine 會發(fā)出一個 health_status 事件。通過檢查容器監(jiān)控狀態(tài)這里介紹以下三種方式
1、 docker run 方式
這種方式是在 docker run 命令中,直接指明 healthcheck 相關設置,該方法修改起來比較方便快捷,但是要求使用者對命令行使用比較熟練。
[root@k8s-m1 ~]# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 80726f760696 nginx "/docker-entrypoint.…" About a minute ago Up About a minute (healthy) 80/tcp nginx-test [root@k8s-m1 ~]# docker run -d --name=nginx-test --health-cmd="curl http://localhost/ || exit 1" --health-interval=5s --health-retries=6 --health-timeout=3s nginx
對命令行不熟悉的,可以通過執(zhí)行docker run --help | grep health
命令查看相關的參數(shù)及解釋如下:
– health-cmd string 運行檢查健康狀況的命令
–health-interval duration 運行間隔時間(ms|s|m|h)(缺省為 0s)
–health-retries int 需要報告不健康的連續(xù)失敗次數(shù)
–health-start-period duration 容器在開始健康之前初始化的起始周期(ms|s|m|h)(默認 0)
–health-timeout duration 允許一次檢查運行的最大時間(ms|s|m|h)(默認為 0s)
–no-healthcheck 禁用任何容器指定的HEALTHCHECK
,會使 Dockerfile 構建設置的HEALTHCHECK
功能失效
2、 Dockerfile 方式
可以在 Dockerfile 中通過使用HEALTHCHECK
聲明應用自身的健康檢測配置。HEALTHCHECK配置了健康檢測命令,用這個命令來判斷容器主進程的服務狀態(tài)是否正常,從而比較真實的反應容器實際運行狀況。
HEALTHCHECK
指令格式:
HEALTHCHECK [選項] CMD <命令>
設置檢查容器健康狀況的命令,注意CMD一直有HEALTHCHECK NONE
如果基礎鏡像有健康檢查指令,可以通過該配置屏蔽
注 :和cmd、entrypoint一樣,在 Dockerfile 中HEALTHCHECK只可以出現(xiàn)一次,如果寫了多個,只有最后一個生效。
HEALTHCHECK 返回值,決定了該次健康檢查的成功與否:0:成功;1:失敗;2:保留(不要使用這個值)
使用包含HEALTHCHECK
指令的 Dockerfile 構建出來的鏡像,在實例化 Docker 容器的時候,就具備了健康狀態(tài)檢查的功能。啟動容器后會自動進行健康檢查。
參數(shù)說明:
HEALTHCHECK 支持下列選項:
- --interval=<間隔>:兩次健康檢查的間隔,默認為 30 秒;
- --timeout=<間隔>:健康檢查命令運行超時時間,如果超過這個時間,本次健康檢查就被視為失敗,默認 30 秒;
- --retries=<次數(shù)>:當連續(xù)失敗指定次數(shù)后,則將容器狀態(tài)視為 unhealthy,默認3次,如果正常的話好像會一直檢查下去,可自行測試。
- --start-period=<間隔>: 應用的啟動的初始化時間,在啟動過程中的健康檢查失效不會計入,默認 0 秒,需要一定啟動時間的服務最好設置;
假設有個鏡像是個最簡單的 nginx 服務,我們希望增加健康檢查來判斷其 nginx服務是否在正常工作,我們可以使用 curl 來幫助檢查測試, Dockerfile 的HEALTHCHECK
可以簡單這么寫:
[root@k8s-m1 ~]vim Dockerfile FROM nginx HEALTHCHECK --interval=5s --timeout=3s CMD curl http://localhost/ || exit 1 [root@k8s-m1 ~]docker build -t nginx:v1 . [root@k8s-m1 ~]docker run -d --name webtest -p 80:80 nginx:v1 [root@k8s-m1 ~]# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c4dcff064e99 nginx:v1 "/docker-entrypoint.…" 5 seconds ago Up 4 seconds (health: starting) 0.0.0.0:80->80/tcp webtest [root@k8s-m1 ~]# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c4dcff064e99 nginx:v1 "/docker-entrypoint.…" 10 seconds ago Up 9 seconds (healthy) 0.0.0.0:80->80/tcp webtest [root@k8s-m1 ~]#
這里設置了每 5 秒檢查一次,如果健康檢查命令超過 3 秒沒響應,并且重試 3 次都沒響應就視為失敗,并且使用curl http://localhost/ || exit 1
,可以根據(jù)自己的業(yè)務自行調(diào)整檢查命令。構建好后啟動一個容器實例,看到最初的狀態(tài)為(health: starting)
,在等待幾秒鐘后,再次docker ps -l
,就可以看到健康狀態(tài)變化為了(healthy)
。
當然如果健康檢查連續(xù)失敗超過了重試次數(shù),狀態(tài)就會變?yōu)?code>(unhealthy)
為了幫助排障,健康檢查命令的輸出(包括stdout
以及stderr
)都會被存儲于健康狀態(tài)里,可以用 docker inspect
來查看。
[root@k8s-m1 ~]# docker inspect --format '{{json .State.Health}}' webtest | python -m json.tool { "Status": "healthy", "FailingStreak": 0, "Log": [ { "Start": "2023-06-12T10:33:48.163431699+08:00", "End": "2023-06-12T10:33:48.303906069+08:00", "ExitCode": 0, "Output": " % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r100 615 100 615 0 0 600k 0 --:--:-- --:--:-- --:--:-- 600k\n<!DOCTYPE html>\n<html>\n<head>\n<title>Welcome to nginx!</title>\n<style>\nhtml { color-scheme: light dark; }\nbody { width: 35em; margin: 0 auto;\nfont-family: Tahoma, Verdana, Arial, sans-serif; }\n</style>\n</head>\n<body>\n<h1>Welcome to nginx!</h1>\n<p>If you see this page, the nginx web server is successfully installed and\nworking. Further configuration is required.</p>\n\n<p>For online documentation and support please refer to\n<a href=\"http://nginx.org/\">nginx.org</a>.<br/>\nCommercial support is available at\n<a href=\"http://nginx.com/\">nginx.com</a>.</p>\n\n<p><em>Thank you for using nginx.</em></p>\n</body>\n</html>\n"
3、 docker-composer 方式
在 docker-compose 中,可以使用以下方式來實現(xiàn)對容器的健康狀況檢查(下面以nginx為例,也可以參考Harbor的docker-compose文件):
version: '3' services: myapp: image: nginx container_name: healthcheck healthcheck: test: ["CMD", "curl", "-fs", "http://localhost/"] interval: 6s timeout: 3s retries: 3
#設置初次檢查等待6s,每次檢查超時設置為3s,總共檢查3次,如果3次都失敗則判斷為健康檢查不通過。過程中有一次檢查通過則判斷為健康。
執(zhí)行成功后,等待數(shù)秒查詢?nèi)萜鞯臓顟B(tài):
[root@k8s-m1 hewei]# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 46e1d11e2431 nginx "/docker-entrypoint.…" 3 seconds ago Up 3 seconds (health: starting) 80/tcp healthcheck [root@k8s-m1 hewei]# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 46e1d11e2431 nginx "/docker-entrypoint.…" 6 seconds ago Up 8 seconds (health: starting) 80/tcp healthcheck [root@k8s-m1 hewei]# docker-compose ps Name Command State Ports -------------------------------------------------------------------- healthcheck /docker-entrypoint.sh ngin ... Up (healthy) 80/tcp
更復雜的使用請自行探索,一般也很少單獨使用。更多docker容器和運維方面的知識請前往博客主頁。
到此這篇關于如何對Docker容器進行健康檢查的文章就介紹到這了,更多相關Docker容器健康檢查內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
iptables使用及docker的iptables規(guī)則
Docker在創(chuàng)建容器時,會自動添加一些iptables規(guī)則來實現(xiàn)網(wǎng)絡隔離和轉(zhuǎn)發(fā)等功能,本文主要介紹了iptables使用及docker的iptables規(guī)則,具有一定的參考價值,感興趣的可以了解一下2023-12-12Docker安裝MySQL并使用Navicat連接的操作方法
這篇文章主要介紹了Docker安裝MySQL并使用Navicat連接,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09iptables如何限制宿主機跟Docker IP和端口訪問(安全整改)
本文詳細介紹了如何通過iptables對網(wǎng)絡訪問進行限制,包括限制特定IP或網(wǎng)段訪問特定服務,以及在Docker環(huán)境下,如何設置DOCKER-USER鏈限制IP和端口訪問,確保網(wǎng)絡安全2024-10-10