Dockerfile的HEALTHCHECK指令
容器实例的状态虽然是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指令的更多相关文章
- 使用ASP.NET Core实现Docker的HealthCheck指令
写在前面 HealthCheck 不仅是对应用程序内运行情况.数据流通情况进行检查, 还包括应用程序对外部服务或依赖资源的健康检查. 健康检查通常是以暴露应用程序的HTTP端点的形式 实施,可用于配 ...
- Dockerfile介绍及指令详情
Dockerfile简介: 镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那么哪些无法重复的问题.镜 ...
- 项目——基于httpd镜像演示Dockerfile所有的指令
基于httpd镜像演示Dockerfile所有的指令: 第一步:创建Dockerfile工作目录 [root@localhost harbor]# mkdir /test [root@localhos ...
- centos7下安装docker(dockerfile常用的指令)
FROM:指定ase镜像 MAINTAINER:设置镜像作者,可以是任意字符 COPY:将文件从build context复制到镜像.支持两种形式:1.COPY src dest 2.COPY [“ ...
- docker 13 dockerfile的保留字指令
Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本. 构建三步骤:1.编写dockerfile文件:2.docker build:3.docker run doc ...
- docker 笔记(4) Dockerfile 常用的指令
下面列出了 Dockerfile 中最常用的指令,完整列表和说明可参看官方文档. FROM指定 base 镜像. MAINTAINER设置镜像的作者,可以是任意字符串. COPY将文件从 build ...
- Docker三剑客之Docker Compose
一.什么是Docker Compose Compose 项目是Docker官方的开源项目,负责实现Docker容器集群的快速编排,开源代码在https://github.com/docker/comp ...
- docker compose yml 文件常用字段简介
常用参数: version # 指定 compose 文件的版本 services # 定义所有的 service 信息, services 下面的第一级别的 key 既是一个 service 的名称 ...
- Dockerfile指令介绍
FROM:指定基础镜像 在Dockerfile中FROM是必备的指令,用于指定基础的镜像. FROM centos:latest LABEL:指定镜像标签 LABEL指令用来指定镜像的标签. 格式: ...
随机推荐
- V8 javascript 引擎
V8是一个由丹麦Google开发的开源java script引擎,用于Google Chrome中.[2]Lars Bak是这个项目的组长.[3] V8在执行之前将java script编译成了机 ...
- 客户端如何访问访问oracle 12c 64位的数据库
服务器A安装的oracle 12c 64位的数据库,机器B如何访问oracle数据库. oracle客户端必须是用32位的客户端,plsql才能访问 准备: 1.下载instantclient-bas ...
- C++ 中文拼音排序方法。
参考文档:http://zisxks.com/2013/10/25/sort-Chinese-characters-in-cpp/ 采用locate.注意事项:排序的名字,如果出现某一个人,出现在顶上 ...
- properties文件读取工具类
项目中防止硬编码,经常会将一些与业务相关的数据存在properties文件中,根据不同的key加载不同的数据,所以就会有读取properties文件的东西,这篇文章仅为了以后copy方便写的. 1.添 ...
- js中级小知识3
函数: 函数在调用的时候,会形成一个私有作用域,内部的变量不会被外面访问,这种保护机制叫闭包.这就意味着函数调用完毕,这个函数形成的栈内存会被销毁. 有些时候我们不希望他被销毁. 函数归属谁跟它在哪调 ...
- js中级小知识
1.作用域链 作用域:浏览器给js的一个生存环境(栈内存). 作用域链:js中的关键字var和function都可以提前声明和定义,提前声明和定义的放在我们的内存地址(堆内存)中.然后js从上到下逐行 ...
- Java编程基础篇第三章
逻辑运算符 与(&)(&&),或(||)(|),非(!) &和&&的区别 &:无论&的左边真假,右边都进行运算 &&:当 ...
- Docker数据卷
1.volume操作命名:docker volume Usage: docker volume COMMAND Manage Docker volumes Options: --he ...
- iOS 线程安全--锁
一,前言 线程安全是iOS开发中避免了的话题,随着多线程的使用,对于资源的竞争以及数据的操作都可能存在风险,所以有必要在操作时保证线程安全. 二,为什么要使用锁? 由于一个进程中不可避免的存在多线程, ...
- Python网络编程-Socket简单通信(及python实现远程文件发送)
学习python中使用python进行网络编程,编写简单的客户端和服务器端进行通信,大部分内容来源于网络教程,这里进行总结供以后查阅. 先介绍下TCP的三次握手: 1,简单的发送消息: 服务器端: i ...