如何对Docker容器进行健康检查

这篇具有很好参考价值的文章主要介绍了如何对Docker容器进行健康检查。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

如何对 Docker 容器进行健康检查

熟悉使用过kubernetes的人应该知道,kubernetes支持对pod进行健康检查的功能,这对生产业务来说其实是非常有用处的,能快速发现服务不可用,并进行快速重启恢复。其实不使用kubernetes这种容器管理工具,docker自身也能实现对容器的健康检查。
从docker 1.12 版本之后,Docker 实现了原生的健康检查实现。对于容器而言,最简单的健康检查是进程级的健康检查,即检验进程是否存活。Docker Daemon 会自动监控容器中的 PID1 进程,如果 docker run 命令中指明了 restart policy,可以根据重启策略自动重启已结束的容器。但是在很多实际应用中,仅使用进程级健康检查方式还远远不够。比如,容器中进程虽然还在运行却由于其他种种原因无法继续响应用户请求(如应用死锁),这样的问题是无法通过进程级监控发现的。

容器启动之后,初始状态会为 starting (启动中)。Docker Engine 会等待 interval 时间,开始执行健康检查命令,并周期性执行。如果单次检查返回值非 0 或者运行需要比指定 timeout 时间还长,则本次检查被认为失败;如果健康检查连续失败超过了 retries 重试次数,状态就会变为 unhealthy (不健康)。

1) 过程中有一次健康检查成功,Docker 会将容器标记为healthy (健康)状态

2) 当容器的健康状态发生变化时,Docker Engine 会发出一个 health_status 事件。通过检查容器监控状态这里介绍以下三种方式

▍1、 docker run 方式

这种方式是在 docker run 命令中,直接指明 healthcheck 相关设置,该方法修改起来比较方便快捷,但是要求使用者对命令行使用比较熟练。

[root@k8s-m1 ~]# docker ps -l
CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS                        PORTS     NAMES
80726f760696   nginx     "/docker-entrypoint.…"   About a minute ago   Up About a minute (healthy)   80/tcp    nginx-test
[root@k8s-m1 ~]#  docker run  -d --name=nginx-test --health-cmd="curl http://localhost/ || exit 1" --health-interval=5s --health-retries=6  --health-timeout=3s nginx

对命令行不熟悉的,可以通过执行docker run --help | grep health

命令查看相关的参数及解释如下:
– health-cmd string 运行检查健康状况的命令
–health-interval duration 运行间隔时间(ms|s|m|h)(缺省为 0s)
–health-retries int 需要报告不健康的连续失败次数
–health-start-period duration 容器在开始健康之前初始化的起始周期(ms|s|m|h)(默认 0)
–health-timeout duration 允许一次检查运行的最大时间(ms|s|m|h)(默认为 0s)
–no-healthcheck 禁用任何容器指定的HEALTHCHECK,会使 Dockerfile 构建设置的HEALTHCHECK
功能失效

▍2、 Dockerfile 方式

可以在 Dockerfile 中通过使用HEALTHCHECK声明应用自身的健康检测配置。HEALTHCHECK配置了健康检测命令,用这个命令来判断容器主进程的服务状态是否正常,从而比较真实的反应容器实际运行状况。

HEALTHCHECK
指令格式:

  • HEALTHCHECK [选项] CMD <命令>
    设置检查容器健康状况的命令,注意CMD一直有
  • HEALTHCHECK NONE
    如果基础镜像有健康检查指令,可以通过该配置屏蔽

注 :和cmd、entrypoint一样,在 Dockerfile 中HEALTHCHECK只可以出现一次,如果写了多个,只有最后一个生效。
HEALTHCHECK 返回值,决定了该次健康检查的成功与否:0:成功;1:失败;2:保留(不要使用这个值)

使用包含HEALTHCHECK指令的 Dockerfile 构建出来的镜像,在实例化 Docker 容器的时候,就具备了健康状态检查的功能。启动容器后会自动进行健康检查。

参数说明:

HEALTHCHECK 支持下列选项:

  • --interval=<间隔>:两次健康检查的间隔,默认为 30 秒;
  • --timeout=<间隔>:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒;
  • --retries=<次数>:当连续失败指定次数后,则将容器状态视为 unhealthy,默认3次,如果正常的话好像会一直检查下去,可自行测试。
  • --start-period=<间隔>: 应用的启动的初始化时间,在启动过程中的健康检查失效不会计入,默认 0 秒,需要一定启动时间的服务最好设置;

假设有个镜像是个最简单的 nginx 服务,我们希望增加健康检查来判断其 nginx服务是否在正常工作,我们可以使用 curl 来帮助检查测试, Dockerfile 的HEALTHCHECK可以简单这么写:

[root@k8s-m1 ~]vim Dockerfile
FROM nginx
HEALTHCHECK --interval=5s --timeout=3s  CMD curl  http://localhost/ || exit 1

[root@k8s-m1 ~]docker build -t nginx:v1 .
[root@k8s-m1 ~]docker run -d --name webtest -p 80:80 nginx:v1  
[root@k8s-m1 ~]# docker ps -l
CONTAINER ID   IMAGE      COMMAND                  CREATED         STATUS                            PORTS                NAMES
c4dcff064e99   nginx:v1   "/docker-entrypoint.…"   5 seconds ago   Up 4 seconds (health: starting)   0.0.0.0:80->80/tcp   webtest
[root@k8s-m1 ~]# docker ps -l
CONTAINER ID   IMAGE      COMMAND                  CREATED          STATUS                   PORTS                NAMES
c4dcff064e99   nginx:v1   "/docker-entrypoint.…"   10 seconds ago   Up 9 seconds (healthy)   0.0.0.0:80->80/tcp   webtest
[root@k8s-m1 ~]# 

这里设置了每 5 秒检查一次,如果健康检查命令超过 3 秒没响应,并且重试 3 次都没响应就视为失败,并且使用curl http://localhost/ || exit 1,可以根据自己的业务自行调整检查命令。构建好后启动一个容器实例,看到最初的状态为(health: starting),在等待几秒钟后,再次docker ps -l,就可以看到健康状态变化为了(healthy)

当然如果健康检查连续失败超过了重试次数,状态就会变为(unhealthy)

为了帮助排障,健康检查命令的输出(包括stdout以及stderr)都会被存储于健康状态里,可以用 docker inspect来查看。

[root@k8s-m1 ~]#  docker inspect --format '{{json .State.Health}}' webtest | python -m json.tool
{
    "Status": "healthy",
    "FailingStreak": 0,
    "Log": [
        {
            "Start": "2023-06-12T10:33:48.163431699+08:00",
            "End": "2023-06-12T10:33:48.303906069+08:00",
            "ExitCode": 0,
            "Output": "  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current\n                                 Dload  Upload   Total   Spent    Left  Speed\n\r  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0\r100   615  100   615    0     0   600k      0 --:--:-- --:--:-- --:--:--  600k\n<!DOCTYPE html>\n<html>\n<head>\n<title>Welcome to nginx!</title>\n<style>\nhtml { color-scheme: light dark; }\nbody { width: 35em; margin: 0 auto;\nfont-family: Tahoma, Verdana, Arial, sans-serif; }\n</style>\n</head>\n<body>\n<h1>Welcome to nginx!</h1>\n<p>If you see this page, the nginx web server is successfully installed and\nworking. Further configuration is required.</p>\n\n<p>For online documentation and support please refer to\n<a href=\"http://nginx.org/\">nginx.org</a>.<br/>\nCommercial support is available at\n<a href=\"http://nginx.com/\">nginx.com</a>.</p>\n\n<p><em>Thank you for using nginx.</em></p>\n</body>\n</html>\n"

▍3、 docker-composer 方式

在 docker-compose 中,可以使用以下方式来实现对容器的健康状况检查(下面以nginx为例,也可以参考Harbor的docker-compose文件):

version: '3'
services:
  myapp:
    image: nginx
    container_name: healthcheck
    healthcheck:
      test: ["CMD", "curl", "-fs", "http://localhost/"]
      interval: 6s
      timeout: 3s
      retries: 3

#设置初次检查等待6s,每次检查超时设置为3s,总共检查3次,如果3次都失败则判断为健康检查不通过。过程中有一次检查通过则判断为健康。

执行成功后,等待数秒查询容器的状态:

[root@k8s-m1 hewei]# docker ps -l
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS                            PORTS     NAMES
46e1d11e2431   nginx     "/docker-entrypoint.…"   3 seconds ago   Up 3 seconds (health: starting)   80/tcp    healthcheck
[root@k8s-m1 hewei]# docker ps -l
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                            PORTS     NAMES
46e1d11e2431   nginx     "/docker-entrypoint.…"   6 seconds ago   Up 8 seconds (health: starting)   80/tcp    healthcheck

[root@k8s-m1 hewei]# docker-compose  ps
   Name                  Command                  State       Ports 
--------------------------------------------------------------------
healthcheck   /docker-entrypoint.sh ngin ...   Up (healthy)   80/tcp

更复杂的使用请自行探索,一般也很少单独使用。更多docker容器和运维方面的知识请前往博客主页。文章来源地址https://www.toymoban.com/news/detail-704691.html

到了这里,关于如何对Docker容器进行健康检查的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Docker快速搭建并优化Redmine环境:日志管理与健康检查指南

    Redmine是一种开源的项目管理和问题跟踪工具,它以Web应用程序的形式提供。Redmine的主要功能包括项目管理、问题跟踪、版本控制集成、Wiki和论坛等。它是用Ruby on Rails开发的,支持多语言和多数据库。Redmine的灵活性和可扩展性使其成为许多组织和团队用于协作和项目管理的

    2024年04月28日
    浏览(38)
  • 「快学Docker」监控和日志记录容器的健康和性能

    1. 容器健康状态监控 方法1:需要实时监测容器的运行状态,包括 CPU 使用率、内存占用、网络流量等指标。 方法2:使用容器编排工具(如 Docker Compose 或 Kubernetes)来设置容器的健康检查,确保异常容器能够被及时重新部署或替换。 方法3:利用 Docker 自带的健康检查机制或第

    2024年02月05日
    浏览(39)
  • 当docker中容器运行时,如何将目录和宿主机进行挂载

    容器已运行,但还想挂载文件 容器已经运行起来了,突然想给容器的目录进行挂载,通常是在运行容器时加上 -v  命令 进行挂载。运行起来的容器想挂载文件夹可以通过修改容器在宿主机的配置文件进行解决。 在配置文件中加入新的挂载 1.查看容器存放目录 2.进入该目录

    2024年01月25日
    浏览(52)
  • 如何检查docker和docker compose是否已经安装?

    要检查 Docker 和 Docker Compose 是否已经安装在您的系统上,您可以在命令行中运行一些简单的命令来验证它们的安装和版本。以下是具体的步骤: 检查 Docker 是否安装 在命令行中,运行以下命令来检查 Docker 是否安装以及其版本: 或者: 如果 Docker 已经安装,这些命令会显示

    2024年02月02日
    浏览(40)
  • 如何检查 Docker 镜像是否存在漏洞

    今天我们来聊聊Docker镜像。 你可能听过Docker,但是你知道什么是Docker镜像吗? 如果你还不知道,别担心,今天我们用幽默的方式来解释一下 首先,Docker镜像就像一份披萨的食谱。你可以把它看作是一个包含了所有制作披萨所需的材料和步骤的清单。 类似地,Docker镜像包含了

    2023年04月24日
    浏览(45)
  • 电脑硬盘检测怎么操作?如何检查硬盘的健康情况?

    【我的电脑硬盘中有许多重要的数据,我想知道电脑硬盘的健康状况怎么样?有没有小伙伴知道电脑硬盘检测的方法?】 电脑硬盘是存储数据的关键组件,而随着时间的推移和使用频率的增加,硬盘可能会出现各种故障。因此,了解如何进行电脑 硬盘检测 是非常重要的。本

    2024年02月16日
    浏览(43)
  • 如何检查Windows 11笔记本电脑电池健康状况

    如果你拥有一台运行微软最新操作系统的便携式电脑,那么检查Windows 11笔记本电脑的电池健康状况可能很重要。 电池寿命显然是一件大事,无论你是在最好的商务笔记本电脑上工作,还是在目前市场上最好的游戏笔记本电脑上享受马拉松式的Starfield会议。 值得庆幸的是,调

    2024年02月09日
    浏览(88)
  • docker基于已有容器和通过Dockerfile进行制作镜像配置介绍

    目录 一.制作镜像的两种方式 1.在已有容器中更新并提交这个镜像 2.使用Dockerfile来制作 二.基于容器制作镜像 1.格式 (1)主要格式 (2)可选参数 2.案例 基于容器创建镜像设置标签并进行验证是否可用 (1)运行容器并写入验证内容(改变容器存储层内容) (2)另起终端制

    2024年02月11日
    浏览(57)
  • 【Python编程工具】【ssh连接Docker容器】如何使用Docker容器里的python环境,如何调试在容器中的代码

    本篇博客将介绍如何在Docker容器中打开SSH连接服务,以及如何使用JetBrains Gateway软件进行代码调试。 JetBrains Gateway是一款紧凑型桌面应用,可让您通过 JetBrains IDE 远程工作,甚至无需下载这些IDE。通过在桌面端安装这款软件,您可以直接调试服务器上的代码。 使用以下命令启

    2024年01月25日
    浏览(67)
  • docker:如何将本地文件复制到docker容器内

    我们通过docker cp指令来将容器外文件传递到docker容器内 1、查看容器ID 2、将本地文件复制到docker容器中 举例: 或者通过容器名

    2024年02月11日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包