偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

強(qiáng)制異常容器重啟,讓你的Docker錦上添花

云計(jì)算
在沒(méi)有HEALTHCHECK指令之前,Docker只能通過(guò)process是否退出來(lái)判斷container的狀態(tài),不過(guò)有時(shí)候服務(wù)已經(jīng)無(wú)法正常運(yùn)作了,但process沒(méi)有退出,這樣會(huì)導(dǎo)致該服務(wù)仍然可以接收用戶請(qǐng)求,但是無(wú)法正常響應(yīng)。我們需要對(duì)這種容器進(jìn)行識(shí)別并自動(dòng)重啟。

今天我們接著上次的docker健康檢查機(jī)制那篇文章,講述一下如何給不健康的容器進(jìn)行重啟。另外有讀者反饋有幾個(gè)參數(shù)不是很理解,我們會(huì)在這篇文章里再補(bǔ)充講解一下。

Docker在1.12版本之后提供了HEALTHCHECK指令,可以設(shè)定一行command用來(lái)判斷服務(wù)的狀態(tài)是否正常,這樣可以更準(zhǔn)確地判斷服務(wù)狀態(tài)。

HEALTHCHECK Container啟動(dòng)后的初始狀態(tài)為starting,在指令檢查成功后,狀態(tài)會(huì)更改為healthy,如果連續(xù)失敗超過(guò)指定次數(shù)則會(huì)改為unhealthy??聪翲ealthCheck的工作機(jī)制。

HEALTHCHECK參數(shù)選項(xiàng):

--interval: Health check時(shí)間間隔,預(yù)設(shè)為30秒

--timeout:當(dāng)Health check超過(guò)此設(shè)定的時(shí)間,則會(huì)視為失敗,預(yù)設(shè)為30秒

--retries:當(dāng)Health check連續(xù)失敗次數(shù)超過(guò)此設(shè)定時(shí),則會(huì)將狀態(tài)更改為,預(yù)設(shè)為3次unhealthy

--start-period:啟動(dòng)時(shí)間,預(yù)設(shè)為0秒

HEALTHCHECK可以通過(guò)Dockerfile或是docker-compose.yml設(shè)定:

Dockerfile 示例

在Dockerfile中,HEALTHCHECK指令格式為

HEALTHCHECK [options] CMD <command>

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

<command>的返回值代表container的狀態(tài):

0:成功,container is healthy

1:失敗,如果失敗超過(guò)指定次數(shù),則container為unhealthy

2: reserved,不要使用這個(gè)值

假設(shè)我們的container服務(wù)是web服務(wù),我們可以使用來(lái)檢查服務(wù)是否正常運(yùn)行,例如:每30秒檢查一次是否可在5秒內(nèi)響應(yīng)請(qǐng)求: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:
      - net
networks:
  net:
    name: net
    driver: bridge

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

確認(rèn)健康狀態(tài)

在設(shè)定好health check指令之后,接著啟動(dòng)container,檢查container狀態(tài)時(shí)可以看到初始狀態(tài)是:health: starting

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

過(guò)30秒之后再執(zhí)行一次docker ps,可以看到container的狀態(tài)變成:healthy

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

而如果連續(xù)失敗超過(guò)指定次數(shù),狀態(tài)會(huì)變成unhealthy。

關(guān)鍵步驟:重新啟動(dòng)不正常的容器

以上的步驟只有檢查container的健康狀態(tài),但沒(méi)有針對(duì)unhealthy container做任何處理,這部分我們可以搭配docker-autoheal來(lái)重啟unhealthy container。先看下AutoHeal的工作機(jī)制。

autoheal可以直接使用docker執(zhí)行,或是寫(xiě)在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

然后執(zhí)行 docker-compose up -d autoheal 就可以啟動(dòng)。

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

最后再給大家介紹一種模擬unhealthy的方法,正常情況下都是healthy的,可以通過(guò)修改命令來(lái)模擬unhealthy。比如模擬mysql的服務(wù),我們可以使用如下命令。

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

正常監(jiān)聽(tīng)3306端口,我們用3307連接檢查,就會(huì)一直處于unhealthy狀態(tài),這個(gè)時(shí)候我們可以通過(guò)autoheal的日志觀察到對(duì)mysql容器的重啟。

有了這個(gè)機(jī)制,以后docker假死的情況就可以自動(dòng)重啟了。這個(gè)檢查和自動(dòng)重啟機(jī)制對(duì)于數(shù)據(jù)庫(kù)或者tomcat服務(wù)都非常有用。如果使用過(guò)程中有什么問(wèn)題也歡迎發(fā)消息給我們。

責(zé)任編輯:華軒 來(lái)源: 微技術(shù)之家
相關(guān)推薦

2014-02-09 14:49:51

云計(jì)算網(wǎng)絡(luò)IT

2011-12-31 08:58:04

服務(wù)器重啟Unix

2019-05-07 08:50:11

開(kāi)源工具Kubernetes容器

2024-02-26 18:11:08

Docker容器鏡像

2021-07-01 10:03:55

Distroless容器安全

2018-04-24 10:05:13

Docker工具交付

2009-10-10 14:07:43

2012-09-20 15:11:31

Unix服務(wù)器

2019-08-19 08:00:00

服務(wù)器Ubuntu Live漏洞

2017-02-10 11:00:59

Windows服務(wù)器filebeat

2014-12-26 09:52:08

Go

2025-03-26 02:00:00

C#Docker開(kāi)發(fā)

2023-08-28 10:54:09

容器Docker

2019-05-14 14:27:36

KubernetesDocker存儲(chǔ)

2021-07-15 09:47:20

Docker容器命令

2016-03-28 09:39:54

2020-04-26 15:38:28

Docker容器

2021-10-12 15:58:53

手機(jī)數(shù)據(jù)隱私

2024-02-26 16:40:58

2018-08-27 06:58:06

無(wú)線路由器WiFi網(wǎng)絡(luò)
點(diǎn)贊
收藏

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