docker和docker-compose中加入healthcheck

本文介绍了如何在Dockerfile和docker-compose中加入HEALTHCHECK,以确保容器内的应用程序健康运行。HEALTHCHECK指令允许从业务层面检查容器状态,避免仅依赖容器进程是否运行来判断健康状况。在Docker 1.12及以后版本,可以通过HEALTHCHECK CMD命令设置检查,如使用curl检查HTTP服务状态。在docker-compose中,HEALTHCHECK的配置格式略有不同,并可通过设置参数调整检查间隔和重试次数。

dockerfile中加入HEALTHCHECK

docker 容器的健康检查
在这里插入图片描述
容器的状态是 Up ,应用就是健康的吗?
其实即使容器状态是 Up ,也不能保证应用没有问题。比如当我们在 docker-compose 文件里面设置了 restart: always 时候,当容器崩溃的时候,docker 守护进程会重启容器。但是,如果容器的确在运行,但是容器里的应用不可用怎么办(比如容器里的 web server 应用一直返回 500)?

HEALTHCHECK 指令是告诉 Docker 应该如何进行判断容器的状态是否正常,这是 Docker 1.12 引入的新指令。在没有 HEALTHCHECK 指令前,Docker 引擎只可以通过容器内主进程是否退出来判断容器是否状态异常。很多情况下这没问题,但是如果程序进入死锁状态,或者死循环状态,应用进程并不退出,但是该容器已经无法提供服务了。在 1.12 以前,Docker 不会检测到容器的这种状态,从而不会重新调度,导致可能会有部分容器已经无法提供服务了却还在接受用户请求。

而自 1.12 之后,Docker 提供了 HEALTHCHECK 指令,通过该指令指定一行命令,用这行命令来判断容器主进程的服务状态是否还正常,从而比较真实的反应容器实际状态。

当在一个镜像指定了 HEALTHCHECK 指令后,用其启动容器,初始状态会为 starting,在 HEALTHCHECK 指令检查成功后变为 healthy,如果连续一定次数失败,则会变为 unhealthy。

因此我们需要使用 HEALTHCHECK 从应用的业务层面检查容器的状态。

HEALTHCHECK [选项] CMD 后面的命令,格式和 ENTRYPOINT 一样,分为 shell 格式,和 exec 格式。命令的返回值决定了该次健康检查的成功与否:0:成功;1:失败;2:保留,一般不使用这个值。

格式:

HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令

HEALTHCHECK  支持下列选项:
--interval=<间隔>:两次健康检查的间隔,默认为 30 秒,单位(h/m/s);
--timeout=<时长>:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒,单位(h/m/s);
--retries=<次数>:当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次。
和 CMD, ENTRYPOINT 一样,HEALTHCHECK 只可以出现一次,如果写了多个,只有最后一个生效。

举个例子,对于提供 HTTP 服务接口的应用,可以通过 curl 检查 HTTP 状态吗。比如:

FROM node:11.15.0-alpine
MAINTAINER wollens

WORKDIR /code

RUN apk update && apk upgrade && \
    apk add --no-cache bash git curl
HEALTHCHECK --interval=2m --timeout=10s --start-period=5s --retries=3 CMD curl -f http://127.0.0.1:8012/ || exit 1
ADD src /code/src

COPY package.json ./
COPY tsconfig.json ./
RUN npm install
EXPOSE 8012
RUN npm run compile
CMD npm run start

docker-compose中加入HEALTHCHECK

在docker-compose中加入healthcheck

healthcheck 支持下列选项:
interval=<间隔>:两次健康检查的间隔,默认为 30 秒,单位(h/m/s);
timeout=<时长>:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒,单位(h/m/s);
retries=<次数>:当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次。
和 CMD, ENTRYPOINT 一样,HEALTHCHECK 只可以出现一次,如果写了多个,只有最后一个生效。

docker-compose中使用HEALTHCHECK 和在dockerfile中使用格式上稍有不同。

具体格式如下(注意参数和 : 之间的空格):

healthcheck:
      test: ["CMD" "命令"]
      interval:
      timeout:
      retries:

举个?: 验证我们本地web服务是否正常启动

version: "3"

services:
  server:
    build: .
    image: test:0.0.7
    volumes:
      - .:/code
      - /code/node_modules
    ports:
      - "8012:8012"
    environment:
      MYSQL_HOST: mysqldb
    links:
      - mysqldb
    healthcheck:
      test: ["CMD", "curl", "-f", "http://127.0.0.1:8012"/, "||", "exit", "1"]
      interval: 2m
      timeout: 10s
      retries: 3

  mysqldb:
    image: mysql:5.6
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: xxx
      MYSQL_DATABASE: test
在Ubuntu系统离线部署dockerdocker-compose,可按以下步骤进行: 1. **准备安装包**: - 对于Ubuntu 20.04,可准备docker 23.0.1安装包,链接地址为通过网盘分享的文件:ubuntu中docker的离线安装包.zip ,链接: https://pan.baidu.com/s/1F3OFkO5RuIfJEtTPOA7baw?pwd=dhhu ,提取码: dhhu [^3]。 - 对于Ubuntu 18.04,准备离线包(x86_64) ,包括docker-ce_20.10.12_3 - 0_ubuntu - bionic_amd64.deb(Docker引擎,安装时通常依赖docker - ce - cli)、docker - ce - cli_20.10.12_3 - 0_ubuntu - bionic_amd64.deb(Docker命令行工具)、containerd.io_1.4.6 - 1_amd64.deb(Docker的运行时依赖)、docker - compose - plugin_2.6.0_ubuntu - bionic_amd64.deb(Docker Compose V2) [^4]。 2. **安装docker - compose**: - 从https://github.com/docker/compose/releases/tag/v2.29.3 下载docker - compose,执行命令: ```bash mv docker-compose-linux-x86_64 /usr/bin/ mv /usr/bin/docker-compose-linux-x86_64 /usr/bin/docker-compose chmod +x /usr/bin/docker-compose ``` - 也可以运行如下命令进行安装及配置: ```bash sudo chmod +x /usr/local/bin/docker-compose sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose sudo docker-compose version ``` 3. **检查安装是否成功**:可使用`docker info`查看docker版本等信息 [^3]。 ### 示例代码 ```bash # 示例:安装docker-compose mv docker-compose-linux-x86_64 /usr/bin/ mv /usr/bin/docker-compose-linux-x86_64 /usr/bin/docker-compose chmod +x /usr/bin/docker-compose # 示例:查看docker版本 docker info ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值