成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何優(yōu)雅的對(duì) Docker 容器進(jìn)行健康檢查

系統(tǒng) Linux
自 1.12 版本之后,Docker 引入了原生的健康檢查實(shí)現(xiàn)。對(duì)于容器而言,最簡單的健康檢查是進(jìn)程級(jí)的健康檢查,即檢驗(yàn)進(jìn)程是否存活。

自 1.12 版本之后,Docker 引入了原生的健康檢查實(shí)現(xiàn)。對(duì)于容器而言,最簡單的健康檢查是進(jìn)程級(jí)的健康檢查,即檢驗(yàn)進(jìn)程是否存活。Docker Daemon 會(huì)自動(dòng)監(jiān)控容器中的 PID1 進(jìn)程,如果 docker run 命令中指明了 restart policy,可以根據(jù)策略自動(dòng)重啟已結(jié)束的容器。在很多實(shí)際場(chǎng)景下,僅使用進(jìn)程級(jí)健康檢查機(jī)制還遠(yuǎn)遠(yuǎn)不夠。比如,容器進(jìn)程雖然依舊運(yùn)行卻由于應(yīng)用死鎖無法繼續(xù)響應(yīng)用戶請(qǐng)求,這樣的問題是無法通過進(jìn)程監(jiān)控發(fā)現(xiàn)的。

容器啟動(dòng)之后,初始狀態(tài)會(huì)為 starting (啟動(dòng)中)。Docker Engine 會(huì)等待 interval 時(shí)間,開始執(zhí)行健康檢查命令,并周期性執(zhí)行。如果單次檢查返回值非 0 或者運(yùn)行需要比指定 timeout 時(shí)間還長,則本次檢查被認(rèn)為失?。蝗绻】禉z查連續(xù)失敗超過了 retries 重試次數(shù),狀態(tài)就會(huì)變?yōu)?unhealthy (不健康)。

注:

  •  1. 一旦有一次健康檢查成功,Docker 會(huì)將容器置回 healthy (健康)狀態(tài)
  •  2. 當(dāng)容器的健康狀態(tài)發(fā)生變化時(shí),Docker Engine 會(huì)發(fā)出一個(gè) health_status 事件。通過檢查容器監(jiān)控狀態(tài)有以下兩種方式

1. Dockerfile 方式

可以在 Dockerfile 中聲明應(yīng)用自身的健康檢測(cè)配置。HEALTHCHECK指令聲明了健康檢測(cè)命令,用這個(gè)命令來判斷容器主進(jìn)程的服務(wù)狀態(tài)是否正常,從而比較真實(shí)的反應(yīng)容器實(shí)際狀態(tài)。

HEALTHCHECK指令格式:

  •    HEALTHCHECK [選項(xiàng)] CMD <命令>:設(shè)置檢查容器健康狀況的命令
  •    HEALTHCHECK NONE:如果基礎(chǔ)鏡像有健康檢查指令,使用這行可以屏蔽掉

注 :在 Dockerfile 中HEALTHCHECK只可以出現(xiàn)一次,如果寫了多個(gè),只有最后一個(gè)生效。

使用包含HEALTHCHECK指令的 Dockerfile 構(gòu)建出來的鏡像,在實(shí)例化 Docker 容器的時(shí)候,就具備了健康狀態(tài)檢查的功能。啟動(dòng)容器后會(huì)自動(dòng)進(jìn)行健康檢查。

參數(shù)參考:

https://docs.docker.com/engine/reference/builder/#healthcheck

HEALTHCHECK 支持下列選項(xiàng):

  •  --interval=<間隔>:兩次健康檢查的間隔,默認(rèn)為 30 秒;
  •  --timeout=<間隔>:健康檢查命令運(yùn)行超時(shí)時(shí)間,如果超過這個(gè)時(shí)間,本次健康檢查就被視為失敗,默認(rèn) 30 秒;
  •  --retries=<次數(shù)>:當(dāng)連續(xù)失敗指定次數(shù)后,則將容器狀態(tài)視為 unhealthy,默認(rèn) 3 次。
  •  --start-period=<間隔>: 應(yīng)用的啟動(dòng)的初始化時(shí)間,在啟動(dòng)過程中的健康檢查失效不會(huì)計(jì)入,默認(rèn) 0 秒;

參數(shù)作用解釋如下:

  •  運(yùn)行狀態(tài)檢查首先會(huì)在容器啟動(dòng)后的 interval 秒內(nèi)運(yùn)行,然后在前一次檢查完成后的 interval 秒內(nèi)再次運(yùn)行。
  •  如果一次狀態(tài)檢查花費(fèi)的時(shí)間超過 timeout 秒,則認(rèn)為這次檢查失敗。
  •  容器的運(yùn)行狀態(tài)檢查連續(xù)失敗 retries 次才會(huì)被視為不健康。
  •  start period 為需要時(shí)間啟動(dòng)的容器提供初始化時(shí)間。在此期間的探測(cè)失敗將不計(jì)入最大重試次數(shù)。

但是,如果在啟動(dòng)期間健康檢查成功,則認(rèn)為容器已啟動(dòng),所有連續(xù)失敗的情況都將計(jì)算到最大重試次數(shù)。

在HEALTHCHECK [選項(xiàng)] CMD后面的命令,格式和ENTRYPOINT一樣,分為 shell 格式,和 exec 格 式。命令的返回值決定了該次健康檢查的成功與否:

  •  0:成功;
  •  1:失敗;
  •  2:保留值,不要使用

假設(shè)有個(gè)鏡像是個(gè)最簡單的 Web 服務(wù),我們希望增加健康檢查來判斷其 Web 服務(wù)是否在正常工作,我們可以用 curl 來幫助判斷,其 Dockerfile 的HEALTHCHECK可以這么寫:

FROM nginx:1.23
HEALTHCHECK --interval=5s --timeout=3s --retries=3 \
CMD curl -fs http://localhost/ || exit 1

這里設(shè)置了每 5 秒檢查一次(這里為了試驗(yàn)所以間隔非常短,實(shí)際應(yīng)該相對(duì)較長),如果健康檢查命令超過 3 秒沒響應(yīng),并且重試 3 次都沒響應(yīng)就視為失敗,并且使用curl -fs http://localhost/ || exit 1作為健康檢查命令。

使用docker build來構(gòu)建這個(gè)鏡像:

docker build -t myweb:v1 .

構(gòu)建好后啟動(dòng)容器:

docker run -d --name web myweb:v1

當(dāng)運(yùn)行該鏡像后,可以通過docker container ls看到最初的狀態(tài)為(health: starting):

docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7068d793c6e4 myweb:v1 "/docker-entrypoint.…" 3 seconds ago Up 2 seconds (health: starting) 80/tcp web

在等待幾秒鐘后,再次docker container ls,就會(huì)看到健康狀態(tài)變化為了(healthy):

$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7068d793c6e4 myweb:v1 "/docker-entrypoint.…" 18 seconds ago Up 16 seconds (healthy) 80/tcp web

如果健康檢查連續(xù)失敗超過了重試次數(shù),狀態(tài)就會(huì)變?yōu)?unhealthy)。

為了幫助排障,健康檢查命令的輸出(包括stdout以及stderr)都會(huì)被存儲(chǔ)于健康狀態(tài)里,可以用 docker inspect來查看。

$ docker inspect --format '{{json .State.Health}}' web | python -m json.tool
{
"FailingStreak": 0,
"Log": [
{
"End": "2022-08-20T14:02:38.19224648+08:00",
"ExitCode": 0,
"Output": "xxx",
"Start": "2022-08-20T14:02:38.116041192+08:00"
},
{
"End": "2022-08-20T14:02:43.271105619+08:00",
"ExitCode": 0,
"Output": "xxx",
"Start": "2022-08-20T14:02:43.200932585+08:00"
}
],
"Status": "healthy"
}

 2. docker run 方式

另外一種方法是在 docker run 命令中,直接指明 healthcheck 相關(guān)策略:

$ docker run  -d \
--name=myweb \
--health-cmd="curl -fs http://localhost/ || exit 1" \
--health-interval=5s \
--health-retries=12 \
--health-timeout=2s \
nginx:1.23

通過執(zhí)行docker run --help | grep health命令查看相關(guān)的參數(shù)及解釋如下:

  •  --health-cmd string:運(yùn)行檢查健康狀況的命令
  •  --health-interval duration:運(yùn)行間隔時(shí)間(ms|s|m|h)(缺省為 0s)
  •  --health-retries int:需要報(bào)告不健康的連續(xù)失敗次數(shù)
  •  --health-start-period duration :容器在開始健康重試倒計(jì)時(shí)之前初始化的起始周期(ms|s|m|h)(默認(rèn) 0)
  •  --health-timeout duration:允許一次檢查運(yùn)行的最大時(shí)間(ms|s|m|h)(默認(rèn)為 0s)
  •  --no-healthcheck:禁用任何容器指定的HEALTHCHECK,會(huì)使得 Dockerfile 構(gòu)建出來的HEALTHCHECK功能失效。

如果是以 supervisor 來管理容器的多個(gè)服務(wù),想通過子服務(wù)的狀態(tài)來判斷容器的監(jiān)控狀態(tài),可以使用supervisorctl status來做判斷,比如:

$ docker run --rm -d \
--name=myweb \
--health-cmd="supervisorctl status" \
--health-interval=5s \
--health-retries=3 \
--health-timeout=2s \
nginx:v1

按照此參數(shù)的設(shè)置,如果supervisorctl status檢查子服務(wù)有一個(gè)不為正常的RUNNING狀態(tài),那么在等待大約 15 秒左右,容器的監(jiān)控狀態(tài)就會(huì)從(healthy)變?yōu)?unhealthy)

3. docker-composer 方式

在 docker-composer 中,可以使用以下方式來實(shí)現(xiàn)對(duì)容器的健康狀況檢查(以通過 supervisor 管理子進(jìn)程的容器為例):

version: '3'
services:
web:
image: nginx:v1
container_name: web
healthcheck:
test: ["CMD", "supervisorctl", "status"]
interval: 5s
timeout: 2s
retries: 3

執(zhí)行成功后,等待數(shù)秒查詢?nèi)萜鞯臓顟B(tài):

$ docker-compose ps
Name Command State Ports
--------------------------------------------------------------------------------
web supervisord -c /etc/superv ... Up (healthy) 443/tcp, 80/tcp

當(dāng)通過手動(dòng)supervisorctl stop停掉里面的一些子服務(wù),導(dǎo)致里面的子服務(wù)狀態(tài)不全為RUNNING狀態(tài)時(shí),再查看容器的狀態(tài):

healthcheck:
disable: true
責(zé)任編輯:龐桂玉 來源: 奇妙的Linux世界
相關(guān)推薦

2017-08-25 10:20:46

Docker容器機(jī)制

2023-05-09 07:34:25

Docker健康檢查方式

2020-12-07 06:29:13

SpringBoot

2023-03-02 07:20:10

GRPC服務(wù)健康檢查協(xié)議

2023-03-03 08:19:35

KubernetesgRPC

2022-08-23 10:04:23

Dockerhealth健康檢查

2023-03-01 08:33:37

gRPC健康檢查代碼

2021-07-15 10:25:15

集群節(jié)點(diǎn)檢查

2023-10-14 15:36:14

PodKubernetes

2024-02-27 17:30:11

2021-01-15 05:38:28

ASPHttp端口

2024-10-31 15:16:35

2021-03-05 00:06:12

Docker容器內(nèi)存

2021-04-18 10:34:28

Spring Clou郵件釘釘

2022-02-28 07:40:23

Nacos注冊(cè)中心客戶端

2021-09-18 16:10:48

Spring BootJava微服務(wù)

2022-04-26 05:55:13

容器K8s管理debug問題

2015-07-28 11:10:22

Docker容器容器編排

2022-12-27 07:42:12

2021-07-05 06:51:41

Nacos微服務(wù)源碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 中文字幕av在线 | 毛片在线免费播放 | 91性高湖久久久久久久久_久久99 | 免费在线毛片 | 91一区 | 91在线色视频 | 亚洲中午字幕 | 精品视频成人 | 欧美激情欧美激情在线五月 | 97免费在线观看视频 | 国产日韩精品视频 | 国产一级免费视频 | 国产精品中文字幕一区二区三区 | 自拍偷拍第一页 | 欧美久久久网站 | 高清国产午夜精品久久久久久 | 国产精品久久久久久久免费观看 | 亚洲一区精品视频 | 国内精品免费久久久久软件老师 | 国产在线中文字幕 | 亚洲精品大片 | 亚洲国产免费 | 亚洲在线高清 | 国产一级在线 | 欧美综合国产精品久久丁香 | 蜜桃视频在线观看免费视频网站www | 亚洲午夜精品在线观看 | 欧美精品久久久 | 日本精品视频一区二区三区四区 | 欧洲一区二区三区 | av在线电影网站 | 国产免费xxx | 日韩理论电影在线观看 | 精品视频一区二区在线观看 | 久久久久网站 | 激情亚洲 | 欧美高清dvd | 中文在线a在线 | 欧美性乱| 夫妻午夜影院 | 一级黄色淫片 |