如何配置 Health Check?- 每天5分钟玩转 Docker 容器技术(107)
容器状态是 UP 的,应用就是健康的吗?
还真不一定!
Docker 只能从容器启动进程的返回代码判断其状态,而对于容器内部应用的运行情况基本没有了解。
执行 docker run
命令时,通常会根据 Dockerfile 中的 CMD 或 ENTRYPOINT 启动一个进程,这个进程的状态就是 docker ps
STATUS
列显示容器的状态。
命令显示:
-
有的容器正在运行,状态为
UP
。 -
有的容器已经正常停止了,状态是
Exited (0)
。 -
有的则因发生故障停止了,退出代码为非 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 的命令,还有几个相关的参数:
-
--timeout
命令超时的时间,默认 30s。 -
--interval
命令执行的间隔时间,默认 30s。 -
--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
本文转自CloudMan6 51CTO博客,原文链接:http://blog.51cto.com/cloudman/2051611

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
如何使用 Secret?- 每天5分钟玩转 Docker 容器技术(108)
我们经常要向容器传递敏感信息,最常见的莫过于密码了。比如: dockerrun-eMYSQL_ROOT_PASSWORD=my-secret-pw-dmysql 在启动 MySQL 容器时我们通过环境变量MYSQL_ROOT_PASSWORD设置了 MySQL 的管理员密码。不过密码是以明文的形式写在docker run命令中,有潜在的安全隐患。 为了解决这个问题,docker swarm 提供了 secret 机制,允许将敏感信息加密后保存到 secret 中,用户可以指定哪些容器可以使用此 secret。 如果使用 secret 启动 MySQL 容器,方法是: 在 swarm manager 中创建 secretmy_secret_data,将密码保存其中。 echo"my-secret-pw"|dockersecretcreatemy_secret_data- 启动 MySQL service,并指定使用 secretmy_secret_data。 dockerservicecreate\ --namemysql\ --secretsource=my_secret_data,t...
- 下一篇
用 Label 控制 Service 的位置 - 每天5分钟玩转 Docker 容器技术(106)
上一节我们讨论了 Service 部署的两种模式:global mode 和 replicated mode。无论采用 global mode 还是 replicated mode,副本运行在哪些节点都是由 Swarm 决定的,作为用户我们有没有可能精细控制 Service 的运行位置呢? 答案是:能,使用 label。 逻辑分两步: 为每个 node 定义 label。 设置 service 运行在指定 label 的 node 上。 label 可以灵活描述 node 的属性,其形式是 key=value,用户可以任意指定,例如将swarm-worker1作为测试环境,为其添加 labelenv=test: dockernodeupdate--label-addenv=testswarm-worker1 对应的,将swarm-worker2作为生产环境,添加 labelenv=prod: dockernodeupdate--label-addenv=prodswarm-worker2 现在部署 service 到测试环境: dockerservicecreate\ --constr...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7设置SWAP分区,小内存服务器的救世主