<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Docker 容器的 health 健康狀態(tài)檢查

          共 8858字,需瀏覽 18分鐘

           ·

          2022-08-25 12:48

          Docker 原生健康檢查能力

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

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

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

          1. Dockerfile 方式

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

          HEALTHCHECK指令格式:

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

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

          使用包含HEALTHCHECK指令的 Dockerfile 構(gòu)建出來的鏡像,在實(shí)例化 Docker 容器的時候,就具備了健康狀態(tài)檢查的功能。啟動容器后會自動進(jìn)行健康檢查。參數(shù)參考:https://docs.docker.com/engine/reference/builder/#healthcheck

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

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

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

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

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

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

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

          假設(shè)有個鏡像是個最簡單的 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)該相對較長),如果健康檢查命令超過 3 秒沒響應(yīng),并且重試 3 次都沒響應(yīng)就視為失敗,并且使用curl -fs http://localhost/ || exit 1作為健康檢查命令。

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

          docker build -t myweb:v1 .

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

          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,就會看到健康狀態(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)就會變?yōu)?code style="font-size: 14px;word-wrap: break-word;border-radius: 4px;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: #9b6e23;background-color: #fff5e3;padding: 3px;margin: 3px;">(unhealthy)。

          為了幫助排障,健康檢查命令的輸出(包括stdout以及stderr)都會被存儲于健康狀態(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)行間隔時間(ms|s|m|h)(缺省為 0s)
          • --health-retries int:需要報告不健康的連續(xù)失敗次數(shù)
          • --health-start-period duration :容器在開始健康重試倒計時之前初始化的起始周期(ms|s|m|h)(默認(rèn) 0)
          • --health-timeout duration:允許一次檢查運(yùn)行的最大時間(ms|s|m|h)(默認(rèn)為 0s)
          • --no-healthcheck:禁用任何容器指定的HEALTHCHECK,會使得 Dockerfile 構(gòu)建出來的HEALTHCHECK功能失效。

          如果是以 supervisor 來管理容器的多個服務(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ù)有一個不為正常的RUNNING狀態(tài),那么在等待大約 15 秒左右,容器的監(jiān)控狀態(tài)就會從(healthy)變?yōu)?code style="font-size: 14px;word-wrap: break-word;border-radius: 4px;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: #9b6e23;background-color: #fff5e3;padding: 3px;margin: 3px;">(unhealthy)

          3. docker-composer 方式

          在 docker-composer 中,可以使用以下方式來實(shí)現(xiàn)對容器的健康狀況檢查(以通過 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)通過手動supervisorctl stop停掉里面的一些子服務(wù),導(dǎo)致里面的子服務(wù)狀態(tài)不全為RUNNING狀態(tài)時,再查看容器的狀態(tài):

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



          - END -




          鏈接:https://www.seafog.cn/archives/751016741

          (版權(quán)歸原作者所有,侵刪)

          瀏覽 61
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产欧美日韩A V片 | sv在线观看 | 日韩99在线观看 | 99超碰不卡在线播放 | 蜜臀视频网站狠狠操b |