容器状态是UP的,那应用就是健康的吗?    不一定
 
Docker 只能从容器启动进程的返回代码判断其状态,而对于容器内部应用的运行情况基本没有了解。
 
执行 docker run 命令时,通常会根据Dockerfile中的CMD或 ENTRYPOINT 启动一个进程,这个进程的状态就是 docker ps STATUS 列显示容器的状态。
 
 
上面命令显示:
    1、有的容器正在运行,状态为 UP
    2、有的容器已经正常停止了,状态是exited(0)
    3、有的则因发生故障停止了,退出代码非 0 ,例如 exited (137)、exited(1) 等
 
即使容器状态是 UP ,也不能保证应用没有问题,web server 虽然没有崩溃,但如果总是返回 HTTP500 - 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 失败。
 
root@host03:~# docker service create --name web_server --health-cmd "curl http://localhost:8091/pools || exit 1"  couchbase
81p63ao2rnuimt0f9i5vahmz8
overall progress: 1 out of 1 tasks
1/1: running   
verify: Service converged
 
root@host03:~# docker service ps web_server
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
0ckikfsanfb2        web_server.1        couchbase:latest    host01              Running             Running 52 seconds ago  
 
root@host01:~# docker ps -a    #    SATUS栏可以看到容器的监控状态
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS                                                        NAMES
f82561439414        couchbase:latest    "/entrypoint.sh couc…"   57 seconds ago      Up 56 seconds (healthy)   8091-8096/tcp, 11207/tcp, 11210-11211/tcp, 18091-18096/tcp   web_server.1.0ckikfsanfb254nmkyjrrtxzp
 
 
--health-timeout    命令超时时间,默认30s
--health-interval    命令执行间隔,默认30s
--health-retries      命令失败重试的次数,默认为3,如果 3 次都失败了则会将容器标记为unhealthy。swarm会销毁并重建unhealthy的副本。
 
下面模拟一个unhealthy的场景,让curl 访问一个不存在的url
 
root@host03:~# docker service create --name ng_server --health-cmd "curl --fail  http://localhost:8091/non-exist || exit 1" couchbase
y4qappjx5ke1ffp8ltsivt892
overall progress: 0 out of 1 tasks
1/1: starting  [============================================>      ]    #    创建Service一直卡在这里
 
root@host03:~# docker service ps ng_server    过一段时间查看该Service对应的容器,发现有三个处于shutdown状态,这就对应了前面说的,当健康检查不通过的时候会销毁并重建新的副本(容器),这些容器其实的node上只是被shutdown了
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE                 ERROR               PORTS
l0o7fyf6v8to        ng_server.1         couchbase:latest    host02              Ready               Ready 3 seconds ago                               
j3r6u80e9pe8         \_ ng_server.1     couchbase:latest    host02              Shutdown            Complete 3 seconds ago                            
177fik81ja20         \_ ng_server.1     couchbase:latest    host02              Shutdown            Complete about a minute ago                       
4ko4dmanao2y         \_ ng_server.1     couchbase:latest    host02              Shutdown            Complete 3 minutes ago                            
 
下面是在node上查看容器状态,可见累计创建过四个容器(副本),有问题的副本(容器)都shutdown了
 
root@host02:~# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                                 PORTS                                                        NAMES
0316bb763a73        couchbase:latest    "/entrypoint.sh couc…"   About a minute ago   Up About a minute (health: starting)   8091-8096/tcp, 11207/tcp, 11210-11211/tcp, 18091-18096/tcp   ng_server.1.4ko4dmanao2yntzkati7rqf2v
 
root@host02:~# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                                 PORTS                                                        NAMES
c08f7f88d929        couchbase:latest    "/entrypoint.sh couc…"   About a minute ago   Up About a minute (health: starting)   8091-8096/tcp, 11207/tcp, 11210-11211/tcp, 18091-18096/tcp   ng_server.1.177fik81ja20jwr36dz56sfh3
 
root@host02:~# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                             PORTS                                                        NAMES
eabec2359233        couchbase:latest    "/entrypoint.sh couc…"   24 seconds ago      Up 18 seconds (health: starting)   8091-8096/tcp, 11207/tcp, 11210-11211/tcp, 18091-18096/tcp   ng_server.1.j3r6u80e9pe8101xvt6mixvxc
 
root@host02:~# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                            PORTS                                                        NAMES
d7ad2c993564        couchbase:latest    "/entrypoint.sh couc…"   10 seconds ago      Up 4 seconds (health: starting)   8091-8096/tcp, 11207/tcp, 11210-11211/tcp, 18091-18096/tcp   ng_server.1.l0o7fyf6v8tocy60kdsb7djcy
 
root@host02:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                                 PORTS                                                        NAMES
f13e80a53400        couchbase:latest    "/entrypoint.sh couc…"   1 minutes ago        Up About 1 minutes (health: starting)   8091-8096/tcp, 11207/tcp, 11210-11211/tcp, 18091-18096/tcp  ng_server.1.koawuqt4rjyo65i3kilj18hsi
fe5c0436aaed        couchbase:latest    "/entrypoint.sh couc…"   4 minutes ago        Exited (0) 2 minutes ago                                                                            ng_server.1.nsy7l5anl0megyjfms3nbooyy
7d99a8eb3268        couchbase:latest    "/entrypoint.sh couc…"   5 minutes ago        Exited (0) 4 minutes ago                                                                            ng_server.1.m93f6tpx0hqd2z9sl0jadi8ib
d7ad2c993564        couchbase:latest    "/entrypoint.sh couc…"   7 minutes ago        Exited (0) 5 minutes ago                                                                            ng_server.1.l0o7fyf6v8tocy60kdsb7djcy
 
 
Docker 默认只能通过容器进程的返回码判断容器的状态,Health Check 则能够从业务角度判断应用是否发生故障,是否需要重启。
 
 

107、如何配置 Health Check ? (Swarm14)的更多相关文章

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

    容器状态是 UP 的,应用就是健康的吗? 还真不一定!Docker 只能从容器启动进程的返回代码判断其状态,而对于容器内部应用的运行情况基本没有了解. 执行 docker run 命令时,通常会根据 ...

  2. centos7下安装docker(26如何配置Health Check)

    Docker只能从容器启动进程的返回代码判断其状态,而对于容器内部应用的运行状况基本没有了解 执行docker run命令时,通常根据dockerfile中的CMD或ENTRYPOINT启动一个进程, ...

  3. 在 Scale Up 中使用 Health Check - 每天5分钟玩转 Docker 容器技术(145)

    对于多副本应用,当执行 Scale Up 操作时,新副本会作为 backend 被添加到 Service 的负责均衡中,与已有副本一起处理客户的请求.考虑到应用启动通常都需要一个准备阶段,比如加载缓存 ...

  4. 在 Rolling Update 中使用 Health Check - 每天5分钟玩转 Docker 容器技术(146)

    上一节讨论了 Health Check 在 Scale Up 中的应用,Health Check 另一个重要的应用场景是 Rolling Update.试想一下下面的情况: 现有一个正常运行的多副本应 ...

  5. k8s的Health Check(健康检查)

    强大的自愈能力是 Kubernetes 这类容器编排引擎的一个重要特性.自愈的默认实现方式是自动重启发生故障的容器.除此之外,用户还可以利用 Liveness 和 Readiness 探测机制设置更精 ...

  6. linux运维、架构之路-K8s健康检查Health Check

    一.Health Check介绍         强大的自愈能力是k8s容器编排引擎一个重要特性,自愈能力的默认实现方式为自动重启发生故障的容器,另外还可以利用Liveness和Readiness探测 ...

  7. 在 Scale Up 中使用 Health Check【转】

    对于多副本应用,当执行 Scale Up 操作时,新副本会作为 backend 被添加到 Service 的负载均衡中,与已有副本一起处理客户的请求.考虑到应用启动通常都需要一个准备阶段,比如加载缓存 ...

  8. 在 Rolling Update 中使用 Health Check【转】

    上一节讨论了 Health Check 在 Scale Up 中的应用,Health Check 另一个重要的应用场景是 Rolling Update.试想一下下面的情况: 现有一个正常运行的多副本应 ...

  9. Health Check in eShop -- 解析微软微服务架构Demo(五)

    引言 What is the Health Check Health Check(健康状态检查)不仅是对自己应用程序内部检测各个项目之间的健康状态(各项目的运行情况.项目之间的连接情况等),还包括了应 ...

随机推荐

  1. 2018-2019-2 20165205 网络对抗技术 Exp9 Web安全基础

    2018-2019-2 20165205 网络对抗技术 Exp9 Web安全基础 1.基础问题 SQL注入攻击原理,如何防御 原理: SQL注入指攻击者在提交查询请求时将SQL语句插入到请求内容中,同 ...

  2. linux目录简介说明

  3. DP&图论 DAY 6 上午

    DP&图论  DAY 6  上午 双连通分量 从u-->v不存在必经边,点 点双连通分量 边双连通分量 点/边双连通分量缩点之后变成一个树 找连通块的时候不越过割点或者桥 P3469 [ ...

  4. 六、Jmeter中自动提取Http请求参数,并put到Map,然后进行MD5加密

    1.BeanShell PerOrocessor中的脚本 import src.com.csjin.qa.MD5.*;//个人jar包 import java.util.*; import java. ...

  5. EXCEL中自定义格式输入的数据怎么完整复制

    在用设置单元格式里 自定义 输入数值 如图,B列的数据,我复制后,用选择性粘贴到别的地方,还是无法将75FG4Y2一起复制过去,只能复制过去FG 怎么办? ===>先把这些复制到一个记事本里,再 ...

  6. 反射 go

    reflect.Valueof 到底是个什么? 反射值对象(reflect.Value)提供一系列方法进行零值和空判定,如下表所示. 反射值对象的零值和有效性判断方法 方 法 说 明 IsNil() ...

  7. JavaScript this的使用

    当作用域不同时,我们可以将this暂时性的保存下来. 例如: _this =  this.

  8. Spring mvc中@RequestMapping 基本用法

    @RequestMapping(value="/departments") public String simplePattern(){ System.out.println(&q ...

  9. java7:(Files.walkFileTree())

    1.Files.walkFileTree(): 顺序:顺序访问,碰到目录会一直递归下去 package com.test; import java.io.File; import java.io.IO ...

  10. ES5与ES6常用语法教程之 ③模板字符串、判断字符串是否包含其它字符串

    这部分教程我们主要讲解以下几个常用语法 模板字符串 带标签的模板字符串 判断字符串中是否包含其他字符串 给函数设置默认值 模板字符串 老式的拼接字符串方法 let dessert = '