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指令用来指定镜像的标签. 格式: ...
随机推荐
- ubuntu16.04英文版搜狗输入法安装报错
1.因为是英文版的,所以需要更新中文字体 Systems Settings>Language Support ,会提示自动更新,这个时候KeyBorad input method 选择不了fci ...
- 从0移植uboot(三) _编译最小可用uboot
前两篇介绍了uboot-2013.01的配置原理以及大体的运行流程,本文将讨论如何对uboot源码进行配置,将一个可用的uboot烧录到SD卡中. 定制自己的core board 市面上能买到的开发板 ...
- nodejs + typescirpt + vs code
参考: 基于Nodejs生态圈的TypeScript+React开发入门教程 NPM install -save 和 -save-dev 傻傻分不清 使用typescript开发node js Typ ...
- Python——rrdtool模块的安装
一.Centos环境yum命令安装 yum install rrdtool rrdtool-devel 二.源码安装 wget https://pypi.python.org/packages/99/ ...
- pandas 处理文本数据
import pandas as pd import numpy as np 常规的字符串操作 s = pd.Series(['A',"B","C"," ...
- Nginx配置跨域请求 CORS
当出现403跨域错误的时候 No 'Access-Control-Allow-Origin' header is present on the requested resource,需要给Nginx服 ...
- [Codeforces Round #221 (Div. 1)][D. Tree and Queries]
题目链接:375D - Tree and Queries 题目大意:给你一个有n个点的树,每个点都有其对应的颜色,给出m次询问(v,k),问v的子树中有多少种颜色至少出现k次 题解:先对所有的询问进行 ...
- hibernate配置二级缓存
ehcache.xml: < ?xml version=”1.0″ encoding=”UTF-8″?>< !– defaultCache节点为缺省的缓存策略 maxElements ...
- oracle 数据库、实例、服务名、SID
参考:http://www.zhetao.com/content240 在实际的开发应用中,关于Oracle数据库,经常听见有人说建立一个数据库,建立一个Instance,启动一个Instance之类 ...
- css学习_css伪元素的本质
1.伪元素的本质(插入了一个元素(行内元素/标签/盒子) 案例1: 案例2: