Docker Swarm 健康检查

文章目录

  • Docker Swarm 健康检查
    • 1. 容器添加健康检查
    • 2. 崩溃命令
    • 3. 验证状态
    • 4. 状态修复
    • 5. swarm 运用 Healthchecks

1. 容器添加健康检查

新的Healthcheck功能是作为Dockerfile的扩展创建的,并在构建Docker映像时定义。

下面的Dockerfile扩展了现有的HTTP服务并添加了健康检查。

healthcheck将每秒钟对HTTP服务器进行curl操作以确保其正常运行。如果服务器以非200请求响应,curl将失败,并返回退出码1。在三次失败后,Docker将标记容器为不健康。
说明格式为HEALTHCHECK [OPTIONS] CMD命令。

$ vim Dockerfile
FROM katacoda/docker-http-server:health
HEALTHCHECK --timeout=1s --interval=1s --retries=3 \CMD curl -s --fail http://localhost:80/ || exit 1

目前,Healthcheck支持三种不同的选项:

  • interval=DURATION (default: 30s).这是执行健康检查之间的时间间隔。
  • timeout=DURATION (default: 30s) 如果检查在超时前没有完成,则认为它失败了。
  • retries=N (default: 3) 在将容器标记为不健康之前需要重新检查多少次。

执行的命令必须作为容器部署的一部分安装。在幕后,Docker将使用Docker exec来执行该命令。

在继续之前,构建并运行HTTP服务。

$ docker build -t http .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM katacoda/docker-http-server:health
health: Pulling from katacoda/docker-http-server
12b41071e6ce: Pull complete
fb1cef6edba2: Pull complete
1061ea2815dd: Pull complete
Digest: sha256:fee2132b14b4148ded82aacd8f06bdcb9efa535b4dfd2f1d88518996f4b2fb1d
Status: Downloaded newer image for katacoda/docker-http-server:health---> 7f16ea0c8bd8
Step 2/2 : HEALTHCHECK --timeout=1s --interval=1s --retries=3   CMD curl -s --fail http://localhost:80/ || exit 1---> Running in fcfcf750b855
Removing intermediate container fcfcf750b855---> 333a8ac14b75
Successfully built 333a8ac14b75
Successfully tagged http:latest
$ docker run -d -p 80:80 --name srv http
6702ab36060fc2efb112081ab0ebf96f8a14f1139417fac7dc0dad04e6d33b86

在接下来的步骤中,我们将导致HTTP服务器开始抛出错误。当HTTP服务器作为容器运行时,Docker守护进程将根据选项自动检查健康检查。例如,当您列出所有正在运行的容器时,它将返回状态.

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                        PORTS                NAMES
6702ab36060f        http                "/app"              About a minute ago   Up About a minute (healthy)   0.0.0.0:80->80/tcp   srv

HTTP服务器有一个特殊的端点,它将导致它开始报告错误。

2. 崩溃命令

$ curl http://docker/unhealthy

服务现在将进入错误模式。在下一步中,我们将看看Docker是如何处理这个问题的。
由于HTTP服务器处于错误状态,健康检查应该失败。Docker会将此报告为元数据的一部分。

3. 验证状态

Docker会报告不同地方的健康状况。要获取原始文本流(在自动化过程中非常有用),请使用Docker Inspect提取健康状态字段。

$ docker inspect --format "{{json .State.Health.Status }}" srv
"unhealthy"

运行状况状态存储所有失败和命令的任何输出的日志。这对于调试为什么认为容器不健康非常有用。

$ docker inspect --format "{{json .State.Health }}" srv
{"Status":"unhealthy","FailingStreak":75,"Log":[{"Start":"2021-10-11T02:19:07.166147032Z","End":"2021-10-11T02:19:07.233788055Z","ExitCode":1,"Output":""},{"Start":"2021-10-11T02:19:08.253738183Z","End":"2021-10-11T02:19:08.333500914Z","ExitCode":1,"Output":""},{"Start":"2021-10-11T02:19:09.354272859Z","End":"2021-10-11T02:19:09.436257557Z","ExitCode":1,"Output":""},{"Start":"2021-10-11T02:19:10.508515556Z","End":"2021-10-11T02:19:10.571064095Z","ExitCode":1,"Output":""},{"Start":"2021-10-11T02:19:11.590597522Z","End":"2021-10-11T02:19:11.663932528Z","ExitCode":1,"Output":""}]}
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS                NAMES
6702ab36060f        http                "/app"              3 minutes ago       Up 3 minutes (unhealthy)   0.0.0.0:80->80/tcp   srv

4. 状态修复

$ curl http://docker/healthy$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                   PORTS                NAMES
6702ab36060f        http                "/app"              5 minutes ago       Up 5 minutes (healthy)   0.0.0.0:80->80/tcp   srv$ docker inspect --format "{{json .State.Health.Status }}" srv
"healthy"

5. swarm 运用 Healthchecks

Docker Swarm可以使用这些运行状况检查来了解何时需要重新启动/重新创建服务。

初始化一个Swarm集群,并将新创建的映像部署为具有两个副本的服务。

docker rm -f $(docker ps -qa);
docker swarm init
docker service create --name http --replicas 2 -p 80:80 http

您应该看到两个容器在响应

$ curl host01
<h1>A healthy request was processed by host: f3da8c49a948</h1>

随机导致其中一个节点不正常,

$ curl host01/unhealthy

您应该只看到一个节点处理请求,因为Swarm已经自动从负载均衡器中删除了它

$ curl host01
<h1>A healthy request was processed by host: 01c394673bc0</h1>
$ curl host01
<h1>A healthy request was processed by host: 01c394673bc0</h1>
$ curl host01
<h1>A healthy request was processed by host: 01c394673bc0</h1>

群集现在将自动重启不健康的服务

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                        PORTS               NAMES
c2ba9356b47e        http:latest         "/app"              36 seconds ago       Up 30 seconds (healthy)       80/tcp              http.2.kg7bky9gy65r77ym7dkoxke84
01c394673bc0        http:latest         "/app"              About a minute ago   Up About a minute (healthy)   80/tcp              http.1.jit13g50cohbsv3qa1ht3o9h1

在Swarm重启服务后,你应该再次看到两个节点

$ curl host01
<h1>A healthy request was processed by host: c2ba9356b47e</h1>
$ curl host01
<h1>A healthy request was processed by host: 01c394673bc0</h1>

参考:

  • Docker Swarm Health Check
  • Healthchecks in a Docker Swarm
  • How To Successfully Implement A Healthcheck In Docker Compose

Docker Swarm 健康检查相关推荐

  1. Docker学习总结(28)——Docker 容器健康检查机制

    摘要: 在分布式系统中,经常需要利用健康检查机制来检查服务的可用性,防止其他服务调用时出现异常.自 1.12 版本之后,Docker 引入了原生的健康检查实现.本文将介绍Docker容器健康检查机制, ...

  2. Docker 容器健康检查机制

    摘要: 在分布式系统中,经常需要利用健康检查机制来检查服务的可用性,防止其他服务调用时出现异常.自 1.12 版本之后,Docker 引入了原生的健康检查实现.本文将介绍Docker容器健康检查机制, ...

  3. docker健康检查

    docker的健康检查 官方文档: https://docs.docker.com/engine/reference/builder/ HEALTHCHECK两种格式: HEALTHCHECK [OP ...

  4. 单机版Docker Swarm安装及试用

    Docker Swarm简介 Docker是一种运行于 Linux 和 Windows 上的软件,用于创建.管理和编排容器.Swarm 是Docker官方提供的一款集群管理工具,其主要作用是把若干台 ...

  5. Docker 健康检查功能

    Docker1.12及以上版本,自带了健康检查功能.通常情况下只能使用docker ps 来查看容器是否是up的状态,但是服务是否正常我们不可知,而健康检查功能,可以允许我们在容器中执行一些健康检查的 ...

  6. Java应用在docker环境配置容器健康检查,如何保证消息队列的高可用

    改造java应用,提供/getstate接口服务,根据业务的实际情况决定当前应用是否健康,健康时返回码为200,不健康时返回码为403: 编译构建应用并且生成docker镜像: 验证: 制作基础镜像 ...

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

    如何对 Docker 容器进行健康检查 熟悉使用过kubernetes的人应该知道,kubernetes支持对pod进行健康检查的功能,这对生产业务来说其实是非常有用处的,能快速发现服务不可用,并进行 ...

  8. 【Docker系列】Docker Compose 服务依赖和健康检查

    准备 不想再写一遍了,请看上篇文章的文件准备:[Docker系列]Docker Compose 环境变量 服务依赖 docker-compose.yml 添加depends_on参数 启动顺序: re ...

  9. 如何优雅的对 Docker 容器进行健康检查

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 自 1.12 版本之后,Docker 引入了原生的健康检查实现.对于容器而言,最简单的健康检查是进程级的健康检查, ...

最新文章

  1. 西安java招聘_西安招聘 | 陕西安控科技公司招聘(员工宿舍、节日福利、餐补)...
  2. LeetCode 746. Min Cost Climbing Stairs--动态规划--Java,C++,Python解法
  3. ASP.NET Core 沉思录 - 结构化日志
  4. 移动app显示远程服务器错误,KIS移动应用常见问题汇总
  5. 对发表论文的深层次思考
  6. 分享一下最近看的东西
  7. HTML字符实体大全
  8. Maven运行Selenium报错org/w3c/dom/ElementTraversal
  9. WARNING:CPU :2 PID:593 at net/wireless/nl802.c:2883 nl80211_send_chandef+0x54/0x180
  10. 编写谷歌浏览器插件入门
  11. 共模电感 | 关键参数的计算步骤
  12. matlab图片背景分割,12.4.2 图像分割
  13. btc、usdt 根据交易hash计算手续费
  14. Java初学01:学习路线,springcloud视频下载
  15. js区分单击双击,双击不会触发单击事件
  16. Gazebo仿真进阶教程之传感器高斯噪声(二)
  17. spin_lock、spin_lock_bh、spin_lock_irq、spin_lock_irqsave的使用
  18. 伺服控制原理 及RT and IRT
  19. BAT再战二手车,哪种模式会胜出?
  20. 开源的烽火 “烽火”的开源

热门文章

  1. 梦幻西游网页版无法在虚拟机上运行【游戏】【页游】【虚拟机】
  2. 【转】王怡 自由主义的书单
  3. Microbit Turnipbit 孩子也能做的声光控开关
  4. 小米笔记本AIR13.3第一代(6200U+8GB+256GB,不带指纹)双系统(WIN10+DEEPIN)安装过程避坑
  5. Android、Java要收费了!学霸程序员怒捅马蜂窝,沙特记者命运?GitHub挂了!
  6. 2022年网络搭建与应用——国赛FTP搭建 (解题步骤答案)
  7. iOS开发之加载、滑动翻阅大量图片优化解决方案
  8. 圆心科技再求上市:亏损金额飙升,研发费用率低于2%,如何突围?
  9. 转到计算机科学与技术专业的申请书,转专业的申请书范文(精选5篇)
  10. 互联网+智慧环保建设需求