日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

在沒有HEALTHCHECK指令之前,Docker只能通過process是否退出來判斷contAIner的狀態,不過有時候服務已經無法正常運作了,但process沒有退出,這樣會導致該服務仍然可以接收用戶請求,但是無法正常響應。我們需要對這種容器進行識別并自動重啟。

今天我們接著上次的docker健康檢查機制那篇文章,講述一下如何給不健康的容器進行重啟。新近關注的用戶可以點擊后面的鏈接查看如何添加健康檢查機制,巧用Docker健康檢查,讓你的容器如虎添翼。另外有讀者反饋有幾個參數不是很理解,我們會在這篇文章里再補充講解一下。

Docker在1.12版本之后提供了HEALTHCHECK指令,可以設定一行command用來判斷服務的狀態是否正常,這樣可以更準確地判斷服務狀態。

HEALTHCHECK Container啟動后的初始狀態為starting,在指令檢查成功后,狀態會更改為healthy,如果連續失敗超過指定次數則會改為unhealthy。看下HealthCheck的工作機制。

圖片

HEALTHCHECK參數選項:

--interval: Health check時間間隔,預設為30秒

--timeout:當Health check超過此設定的時間,則會視為失敗,預設為30秒

--retries:當Health check連續失敗次數超過此設定時,則會將狀態更改為,預設為3次unhealthy

--start-period:啟動時間,預設為0秒

HEALTHCHECK可以通過Dockerfile或是docker-compose.yml設定:

Dockerfile 示例

在Dockerfile中,HEALTHCHECK指令格式為

HEALTHCHECK [options] CMD <command>

<command>可以是shell指令或是exec格式(和其他Dockerfile指令相同,可以參考ENTRYPOINT)。而一個Dockerfile中只能有一個HEALTHCHECK指令,如果同時有多個HEALTHCHECK指令,則只有最后一個有效。

<command>的返回值代表container的狀態:

0:成功,container is healthy

1:失敗,如果失敗超過指定次數,則container為unhealthy

2: reserved,不要使用這個值

假設我們的container服務是web服務,我們可以使用來檢查服務是否正常運行,例如:每30秒檢查一次是否可在5秒內響應請求:curl http://localhost:3000

# ...
HEALTHCHECK --interval=30s --timeout=5s --retries=5 --start_period=30s   CMD curl -fs http://localhost:3000/ || exit 1
# ...

Docker-compose 示例

docker-compose.yml的healthcheck,示例如下:

version: "3.7"services:  api:    restart: always    image: api    container_name: api    ports:      - 3000:3000    build:      context: ./api    healthcheck:      test: curl -fs http://localhost:3000/ || exit 1      interval: 30s      timeout: 5s      retries: 5      start_period: 30s   .NETworks:      - netnetworks:  net:    name: net    driver: bridge

其中test必須是string或list.如果是list,第一個item必須是NONE,或CMD-SHELL。如果是string,則等同于CMD-SHELL。

確認健康狀態

在設定好health check指令之后,接著啟動container,檢查container狀態時可以看到初始狀態是:health: starting

$ docker psCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                            PORTS                       NAMES6c7b9ca321d2        api:1.0.0           "uwsgi --ini /home/d…"   5 seconds ago       Up 2 seconds (health: starting)   0.0.0.0:3000->3000/tcp      api

過30秒之后再執行一次docker ps,可以看到container的狀態變成:healthy

$ docker psCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                            PORTS                       NAMES6c7b9ca321d2        api:1.0.0           "uwsgi --ini /home/d…"   35 seconds ago      Up 32 seconds (healthy)           0.0.0.0:3000->3000/tcp      api

而如果連續失敗超過指定次數,狀態會變成unhealthy。

圖片

關鍵步驟:重新啟動不正常的容器

以上的步驟只有檢查container的健康狀態,但沒有針對unhealthy container做任何處理,這部分我們可以搭配docker-autoheal來重啟unhealthy container。先看下AutoHeal的工作機制。

圖片

autoheal可以直接使用docker執行,或是寫在docker-compose中:

使用 docker 指令:

$ docker run -d     --name autoheal     --restart=always     -e AUTOHEAL_CONTAINER_LABEL=all     -v /var/run/docker.sock:/var/run/docker.sock     willfarrell/autoheal

使用docker-compose指令:

version: "3.7"services:  autoheal:    restart: always    image: willfarrell/autoheal    container_name: autoheal    environment:      - AUTOHEAL_CONTAINER_LABEL=all    volumes:      - /var/run/docker.sock:/var/run/docker.sock

然后執行 docker-compose up -d autoheal 就可以啟動。

啟動之后可以通過docker ps觀察unhealthy的容器是否重啟了。也可以查看autoheal的日志查看是否有啟動記錄。

最后再給大家介紹一種模擬unhealthy的方法,正常情況下都是healthy的,可以通過修改命令來模擬unhealthy。比如模擬MySQL的服務,我們可以使用如下命令。

  • test: ["CMD", "nc -vz localhost 3307 || exit 1"]

正常監聽3306端口,我們用3307連接檢查,就會一直處于unhealthy狀態,這個時候我們可以通過autoheal的日志觀察到對mysql容器的重啟。

有了這個機制,以后docker假死的情況就可以自動重啟了。這個檢查和自動重啟機制對于數據庫或者Tomcat服務都非常有用。

分享到:
標簽:容器
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定