容器实例的状态虽然是up,但不能保证里面的进程一定是监控的。我门可以借助HEALTHCHECK指令来做监控状态检查

HEALTHCHECK指令有两种形式:

  • HEALTHCHECK [OPTIONS] CMD command:通过在容器内运行一个命令来检查容器健康情
  • HEALTHCHECK NONE:禁用从base镜像继承的任何healthcheck

HEALTHCHECK指令告诉Docker如何检查容器中的进程是否工作正常。

当一个容器设置了healthcheck之后,除了正常的up状态,它多了一个healthy状态,这个状态初始为starting。当健康检查通过后,它变成了healthy(不管之前是什么状态)。当连续出现几次失败后,就变成unhealthy

在CMD之前的选项有:

  • –interval=DURATION [默认30s]:检查间隔

  • –timeout=DURATION [默认30s]:检查时间超时

  • –retries=N [默认3]:重试

当容器启动之后,首先间隔interval秒然后进行健康检查,如果一个检查所花的时间超过了timeout秒,那么就认为这次检查失败了,如果连续retries次失败,就认为此容器状态为unhealthy。

可以为之前定制的MySQL5.5镜像加入这条健康检查指令:

HEALTHCHECK --interval=60s --timeout=5s CMD /usr/local/mysql/bin/mysqladmin -uroot -p$(cat /data/save/mysql_root) ping | grep alive || exit 1

来看看这时的状态变化:

[root@Docker_Machine_192.168.31.130 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
664c68483278 volumes/my_percona_server:v5.5.61 "/mysql_init.sh /usr…" 37 seconds ago Up 36 seconds (health: starting) 3306/tcp percona-server-v5.5.61_test1
[root@Docker_Machine_192.168.31.130 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
664c68483278 volumes/my_percona_server:v5.5.61 "/mysql_init.sh /usr…" About a minute ago Up About a minute (healthy) 3306/tcp percona-server-v5.5.61_test1

我们故意把里面的配置好的root密码给修改掉,这会导致mysqladmin 的ping命令无法执行,以此来验证一下结果:

[root@Docker_Machine_192.168.31.130 ~]# docker exec -it  percona-server-v5.5.61_test1 /bin/bash
bash-4.2# echo 123 > /data/save/mysql_root
bash-4.2# usr/local/mysql/bin/mysqladmin -uroot -p$(cat /data/save/mysql_root) ping
usr/local/mysql/bin/mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user 'root'@'localhost' (using password: YES)'
bash-4.2# exit

一段时间后 我们来查一下状态:

[root@Docker_Machine_192.168.31.130 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e5bbc5a8bfd volumes/my_percona_server:v5.5.61.2 "/mysql_init.sh /usr…" 4 minutes ago Up 4 minutes (unhealthy) 3306/tcp percona-server-v5.5.61_test1

这时候已经变成unhealthy

来看看inspect中的内容:

   "State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 5587,
"ExitCode": 0,
"Error": "",
"StartedAt": "2018-10-23T03:14:40.518866729Z",
"FinishedAt": "0001-01-01T00:00:00Z",
"Health": {
"Status": "unhealthy",
"FailingStreak": 5,
"Log": [
{
"Start": "2018-10-23T11:16:40.703827739+08:00",
"End": "2018-10-23T11:16:40.820505828+08:00",
"ExitCode": 1,
"Output": "\u0007/usr/local/mysql/bin/mysqladmin: connect to server at 'localhost' failed\nerror: 'Access denied for user 'root'@'localhost' (using password: YES)'\n"
},
{
"Start": "2018-10-23T11:17:41.093626922+08:00",
"End": "2018-10-23T11:17:41.221555939+08:00",
"ExitCode": 1,
"Output": "\u0007/usr/local/mysql/bin/mysqladmin: connect to server at 'localhost' failed\nerror: 'Access denied for user 'root'@'localhost' (using password: YES)'\n"
},
{
"Start": "2018-10-23T11:18:41.496533988+08:00",
"End": "2018-10-23T11:18:41.633191971+08:00",
"ExitCode": 1,
"Output": "\u0007/usr/local/mysql/bin/mysqladmin: connect to server at 'localhost' failed\nerror: 'Access denied for user 'root'@'localhost' (using password: YES)'\n"
},
{
"Start": "2018-10-23T11:19:41.905348235+08:00",
"End": "2018-10-23T11:19:42.024334261+08:00",
"ExitCode": 1,
"Output": "\u0007/usr/local/mysql/bin/mysqladmin: connect to server at 'localhost' failed\nerror: 'Access denied for user 'root'@'localhost' (using password: YES)'\n"
},
{
"Start": "2018-10-23T11:20:42.048432466+08:00",
"End": "2018-10-23T11:20:42.174141725+08:00",
"ExitCode": 1,
"Output": "\u0007/usr/local/mysql/bin/mysqladmin: connect to server at 'localhost' failed\nerror: 'Access denied for user 'root'@'localhost' (using password: YES)'\n"
}
]
}
},

进程是出于running状态,但健康检查是unhealthy

Log的Output输出可以很清楚的显示unhealthy的原因

Docker 默认只能通过容器进程的返回码判断容器的状态,Health Check 则能够从业务角度判断应用是否有异常。

Dockerfile的HEALTHCHECK指令的更多相关文章

  1. 使用ASP.NET Core实现Docker的HealthCheck指令

     写在前面 HealthCheck 不仅是对应用程序内运行情况.数据流通情况进行检查, 还包括应用程序对外部服务或依赖资源的健康检查. 健康检查通常是以暴露应用程序的HTTP端点的形式 实施,可用于配 ...

  2. Dockerfile介绍及指令详情

    Dockerfile简介:   镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那么哪些无法重复的问题.镜 ...

  3. 项目——基于httpd镜像演示Dockerfile所有的指令

    基于httpd镜像演示Dockerfile所有的指令: 第一步:创建Dockerfile工作目录 [root@localhost harbor]# mkdir /test [root@localhos ...

  4. centos7下安装docker(dockerfile常用的指令)

    FROM:指定ase镜像 MAINTAINER:设置镜像作者,可以是任意字符 COPY:将文件从build  context复制到镜像.支持两种形式:1.COPY src dest 2.COPY [“ ...

  5. docker 13 dockerfile的保留字指令

    Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本. 构建三步骤:1.编写dockerfile文件:2.docker build:3.docker run doc ...

  6. docker 笔记(4) Dockerfile 常用的指令

    下面列出了 Dockerfile 中最常用的指令,完整列表和说明可参看官方文档. FROM指定 base 镜像. MAINTAINER设置镜像的作者,可以是任意字符串. COPY将文件从 build ...

  7. Docker三剑客之Docker Compose

    一.什么是Docker Compose Compose 项目是Docker官方的开源项目,负责实现Docker容器集群的快速编排,开源代码在https://github.com/docker/comp ...

  8. docker compose yml 文件常用字段简介

    常用参数: version # 指定 compose 文件的版本 services # 定义所有的 service 信息, services 下面的第一级别的 key 既是一个 service 的名称 ...

  9. Dockerfile指令介绍

    FROM:指定基础镜像 在Dockerfile中FROM是必备的指令,用于指定基础的镜像. FROM centos:latest LABEL:指定镜像标签 LABEL指令用来指定镜像的标签. 格式: ...

随机推荐

  1. LeetCode - 767. Reorganize String

    Given a string S, check if the letters can be rearranged so that two characters that are adjacent to ...

  2. [ERROR] Terminal initialization failed; falling back to unsupported

    Logging initialized using configuration in jar:file:/usr/local/hive/lib/hive-common-1.2.2.jar!/hive- ...

  3. JAVAMail邮件服务器

    SMTP:simple mail transfer protocol(简单邮件传输协议),是internate传输mail的基本协议,也是TCP/IP协议组成员, POP3:邮局协议第三版,是inte ...

  4. JQuery实现表格自动增加行,对新行添加事件

    实现功能: 通常在编辑表格时表格的行数是不确定的,如果一次增加太多行可能导致页面内容太多,反应变慢:通过此程序实现表格动态增加行,一直保持最下面有多个空白行. 效果: 一:原始页面 二:表1增加新行并 ...

  5. Codeforces 1100 - A/B/C/D/E/F - (Undone)

    链接:https://codeforces.com/contest/1100 A - Roman and Browser - [暴力枚举] 题意:浏览器有 $n$ 个网页,编号 $1 \sim n$, ...

  6. [Day12]构造方法、关键字this、super

    1.构造方法:对象创建时要执行的方法 (1)构造方法的格式: 修饰符 构造方法名(参数列表){} 体现: a.构造方法没有返回值类型,也不需要返回值 b.构造方法名称必须和类型保持一致 c.构造方法没 ...

  7. python->读写excel

    from openpyxl import load_workbook#将一个excel文档中的数据存放内存中,即变量wb保存了该excel的所有信息wb = load_workbook(r" ...

  8. LeetCode 206 Reverse Linked List 解题报告

    题目要求 Reverse a singly linked list. Example: Input: 1->2->3->4->5->NULL Output: 5-> ...

  9. 各操作系统安装redis

    mac系统安装redis 注:Mac操作亲测可用,其他系统的安装均从菜鸟教程转载而来,未测试是否可用 一.下载 打开官网:https://redis.io/ Download---Stable---D ...

  10. nodejs 之=> 函数

    基本用法: ES6中允许使用“箭头”(=>)定义函数 var f = v => v; 上面代码相当于定义了一个函数 f : var f = function(v){ return v; } ...