如何配置 Health Check?- 每天5分钟玩转 Docker 容器技术(107)

容器状态是 UP 的,应用就是健康的吗?

还真不一定!
Docker 只能从容器启动进程的返回代码判断其状态,而对于容器内部应用的运行情况基本没有了解。

执行 docker run 命令时,通常会根据 Dockerfile 中的 CMD 或 ENTRYPOINT 启动一个进程,这个进程的状态就是 docker ps STATUS 列显示容器的状态。

 

命令显示:

  1. 有的容器正在运行,状态为 UP
  2. 有的容器已经正常停止了,状态是 Exited (0)
  3. 有的则因发生故障停止了,退出代码为非 0,例如 Exited (137)Exited (1) 等。

即使容器状态是 UP,也不能保证应用没有问题。web server 虽然没有崩溃,但如果总是返回 HTTP 500 - Internal Server Error ,对应用来说这就是很严重的故障。

如何从应用的业务层面检查容器的状态呢? 答案是:Health Check。

Docker 支持的 Health Check 可以是任何一个单独的命令,Docker 会在容器中执行该命令,如果返回 0,容器被认为是 healthy,如果返回 1,则为 unhealthy

对于提供 HTTP 服务接口的应用,常用的 Health Check 是通过 curl 检查 HTTP 状态码,比如:

curl --fail http://localhost:8080/ || exit 1

如果 curl 命令检测到任何一个错误的 HTTP 状态码,则返回 1,Health Check 失败。

下面我们通过例子来演示 Health Check 在 swarm 中的应用。

docker service create --name my_db \       --health-cmd "curl --fail http://localhost:8091/pools || exit 1" \       couchbase

--health-cmd Health Check 的命令,还有几个相关的参数:

  1. --timeout 命令超时的时间,默认 30s。
  2. --interval 命令执行的间隔时间,默认 30s。
  3. --retries 命令失败重试的次数,默认为 3,如果 3 次都失败了则会将容器标记为 unhealthy。swarm 会销毁并重建 unhealthy 的副本。

通过 docker ps 可以查看到容器的状态为 healthy

下面模拟一个 unhealthy 的场景,curl 指向一个不存在的 url。

docker service create --name my_db \       --health-cmd "curl --fail http://localhost:8091/non-exist || exit 1" \       couchbase

 

副本被 shutdown 了,可以到 swarm-worker1 用 docker inspect 查看具体原因。

root@swarm-worker1:~# docker inspect my_db.1.saebvmn7aql2l2n4kgp6s1lui

容器被标记为 unhealthy,其原因是 curl 连续三次返回 404 错误。

Docker 默认只能通过容器进程的返回码判断容器的状态,Health Check 则能够从业务角度判断应用是否发生故障,是否需要重启。

Health Check 就讨论到这里,下一节我们学习如何在容器中使用密码,私钥这类敏感数据。

书籍:

1.《每天5分钟玩转Docker容器技术》
https://item.jd.com/16936307278.html

2.《每天5分钟玩转OpenStack》
https://item.jd.com/12086376.html

时间: 2024-09-25 07:09:38

如何配置 Health Check?- 每天5分钟玩转 Docker 容器技术(107)的相关文章

如何安装和配置 Rex-Ray?- 每天5分钟玩转 Docker 容器技术(74)

Rex-Ray 是一个优秀的 Docker volume driver,本节将演示其安装和配置方法. Rex-Ray 以 standalone 进程的方式运行在 Docker 主机上,安装方法很简单,在需要使用 Rex-Ray driver 的主机 docker1 和 docker2 上运行如下命令: curl -sSL https://dl.bintray.com/emccode/rexray/install | sh - 然后创建并编辑 Rex-Ray 的配置文件 /etc/rexray/c

配置 VirtualBox backend - 每天5分钟玩转 Docker 容器技术(75)

Rexy-Ray 支持多种 backend,上一节我们已经安装配置了 Rex-Ray,今天演示如何配置 VirtualBox backend. 在 VirtualBox 宿主机,即我的笔记本上启动 vboxwebsrv 服务:vboxwebsrv -H 0.0.0.0 执行如下命令关闭 VirtualBox 的登录认证:VBoxManage setproperty websrvauthlibrary null 在关机状态下修改虚拟机 docker1 和 docker2 的 Storage 配置:

用 Label 控制 Service 的位置 - 每天5分钟玩转 Docker 容器技术(106)

上一节我们讨论了 Service 部署的两种模式:global mode 和 replicated mode.无论采用 global mode 还是 replicated mode,副本运行在哪些节点都是由 Swarm 决定的,作为用户我们有没有可能精细控制 Service 的运行位置呢? 答案是:能,使用 label. 逻辑分两步: 为每个 node 定义 label. 设置 service 运行在指定 label 的 node 上. label 可以灵活描述 node 的属性,其形式是 ke

写在最前面 - 每天5分钟玩转Docker容器技术(1)

写在最前面 <每天5分钟玩转Docker容器技术>是一个有关容器技术的教程,有下面两个特点: 系统讲解当前最流行的容器技术 从容器的整个生态环境到各种具体的技术,从整体到细节逐一讨论. 重实践并兼顾理论 从实际操作的角度带领大家学习容器技术. 为什么要写这个 简单回答是:容器技术非常热门,但门槛高. 容器技术是继大数据和云计算之后又一炙手可热的技术,而且未来相当一段时间内都会非常流行. 对 IT 行业来说,这是一项非常有价值的技术.而对 IT 从业者来说,掌握容器技术是市场的需要,也是提升自我

部署 Graylog 日志系统 - 每天5分钟玩转 Docker 容器技术(92)

Graylog 是与 ELK 可以相提并论的一款集中式日志管理方案,支持数据收集.检索.可视化 Dashboard.本节将实践用 Graylog 来管理 Docker 日志. Graylog 架构 Graylog 架构如下图所示: Graylog 负责接收来自各种设备和应用的日志,并为用户提供 Web 访问接口. Elasticsearch 用于索引和保存 Graylog 接收到的日志. MongoDB 负责保存 Graylog 自身的配置信息. 与 ELK 一样,Graylog 的部署方案很灵

ELK 完整部署和使用 - 每天5分钟玩转 Docker 容器技术(90)

上一节已经部署了容器化的 ELK,本节讨论如何将日志导入 ELK 并进行图形化展示. 几乎所有的软件和应用都有自己的日志文件,容器也不例外.前面我们已经知道 Docker 会将容器日志记录到 /var/lib/docker/containers/<contariner ID>/<contariner ID>-json.log,那么只要我们能够将此文件发送给 ELK 就可以实现日志管理. 要实现这一步其实不难,因为 ELK 提供了一个配套小工具 Filebeat,它能将指定路径下的日

万能日志数据收集器 Fluentd - 每天5分钟玩转 Docker 容器技术(91)

前面的 ELK 中我们是用 Filebeat 收集 Docker 容器的日志,利用的是 Docker 默认的 logging driver json-file,本节我们将使用 fluentd 来收集容器的日志. Fluentd 是一个开源的数据收集器,它目前有超过 500 种的 plugin,可以连接各种数据源和数据输出组件.在接下来的实践中,Fluentd 会负责收集容器日志,然后发送给 Elasticsearch.日志处理流程如下: 这里我们用 Filebeat 将 Fluentd 收集到的

跨主机使用 Rex-Ray volume - 每天5分钟玩转 Docker 容器技术(77)

上一节我们在 docker1 上的 MySQL 容器中使用了 Rex-Ray volume mysqldata,更新了数据库.现在容器已经删除,今天将演示在 docker2 中重新使用这个卷. 在 dokcer2 上执行如下命令,启动 MySQL 容器: docker run --name mydb_on_docker2 -v mysqldata:/var/lib/mysql -d mysql 新容器也使用相同的卷 mysqldata,不过这次不需要指定环境变量 MYSQL_ROOT_PASSW

日志管理之 Docker logs - 每天5分钟玩转 Docker 容器技术(87)

高效的监控和日志管理对保持生产系统持续稳定地运行以及排查问题至关重要. 在微服务架构中,由于容器的数量众多以及快速变化的特性使得记录日志和监控变得越来越重要.考虑到容器短暂和不固定的生命周期,当我们需要 debug 问题时有些容器可能已经不存在了.因此,一套集中式的日志管理系统是生产环境中不可或缺的组成部分. 本章我们将讨论监控容器的各种可用技术和方案,首先会介绍 Docker 自带的 logs 子命令,然后讨论 Docker 的 logging driver,接下来通过实践学习几个已经广泛应用