docker 构建带健康检查的redis镜像

===============================================

2018/11/5_第1次修改                       ccb_warlock

===============================================

由于希望引入docker的健康检查,即对不健康容器的策略(如果容器进入 unhealthy 状态,它会停止容器并且重新启动一个新容器来取代它),故根据官方给出的脚本进行修改后构建出带健康检查的redis镜像。

这里简单提下为什么要花力气去构建带健康检查的镜像:docker的容器有2个自我检查的机制,一个是进程的检查,就是服务的进程运行是否正常;另一层就是业务的检查,就是在进程运行的情况下,业务是否正常提供服务。

以redis举例,正常情况配置正确,资源给够的情况,redis进程可以正常运行,但是由于连接redis的程序连接过多(达到了redis的连接数上线,一般单redis是1W不到点,redis服务就开始拒绝新的连接)。像这种情况进程的检查是捕获不到异常的,那就得配合健康检查增加一个维度判断redis是否正常。



 一、准备工作

redis官方版本:4.0.11(虽然现在刚出了5.X,但是新东西很多都还未知,故保守在生产环境还是设计使用4.X)

示例redis的密码为:123456

存放密码的环境变量:redisPWD



 二、构建带有健康检查的新镜像

 2.1  创建构建目录

mkdir -p /opt/build/redis

# 进入目录

cd /opt/build/redis

 2.2 编辑healthcheck脚本

vi healthcheck

# 将下面的内容添加到healthcheck文件内,wq保存。

#!/bin/bash
set -eo pipefail
host="$(hostname -i || echo ‘127.0.0.1‘)"
if ping="$(redis-cli -h "$host" ping)" && [ "$ping" = ‘PONG‘ ]; then
    exit 0
elif  ping="$(redis-cli -h "$host" -a "$redisPWD" ping)"  && [ "$ping" = ‘PONG‘ ]; then
        exit 0
fi
exit 1

 2.3 编辑dockerfile文件

vi dockerfile

# (基于redis镜像)将下面的内容添加到dockerfile文件内,wq保存。

# basic image
FROM redis:4.0.11

COPY healthcheck /usr/local/bin/

RUN chmod +x /usr/local/bin/healthcheck

HEALTHCHECK --interval=10s --timeout=10s --retries=6 CMD ["healthcheck"]

 2.4 构建镜像

docker build --rm -t redis:4.0.11-chk .

由于dockerfile构建时已经增加了健康检查的命令,故即使部署容器时没有配置健康检查也会根据初始规则自动进行健康检查。

至此,带有健康检查的redis镜像(redis:4.0.11-chk)构建完成。



 三、 启动redis

由于我习惯使用swarm、docker compose部署,下面就是使用了健康检查后的compose该怎么写。

version: ‘3.6‘
services:

  redis:
    image: redis:4.0.11-chk
    environment:
      - TZ=Asia/Shanghai
      - redisPWD=123456
    volumes:
      # 配置文件
      - /usr/docker-vol/redis/conf/redis.conf:/etc/redis.conf
      # 持久化
      - /usr/docker-vol/redis/data:/data
    command:
      redis-server /etc/redis.conf
    deploy:
      replicas: 1
      restart_policy:
        condition: any
      resources:
        limits:
          cpus: "0.3"
          memory: 256M
      update_config:
        parallelism: 1
        delay: 5s
        monitor: 5s
        max_failure_ratio: 0.1
        order: start-first
    ports:
      - 6379:6379
    networks:
      - my-net

networks:
  my-net:
    external: true

 参考资料:

1. https://blog.csdn.net/dicyt/article/details/77775219

2. https://github.com/docker-library/healthcheck/blob/master/redis/docker-healthcheck

3. https://github.com/docker-library/healthcheck/blob/master/redis/Dockerfile

4. https://blog.csdn.net/fenghui187/article/details/78332480

原文地址:https://www.cnblogs.com/straycats/p/9906816.html

时间: 2024-08-30 13:45:01

docker 构建带健康检查的redis镜像的相关文章

docker容器HEALTHCHECK 健康检查

docker容器的健康检测是在编写dockerfile时,将检测机制写入到dockerfile中,基于此docerfile生成的镜像,在运行容器时会有健康检测的功能. dockerfile中的格式: HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令. HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令. HEALTHCHECK 指令是告诉 Docker引擎应该如何进行判断容器的状态是否正常,这是 Docker 1.12

DOCKER简明教程 : 通过容器连接REDIS数据库

序言 本文重点讲解了如何通过Redis的官方镜像和Docker容器来搭建redis-cli,并将其连接到Redis镜像.首先要跟大家简单介绍一下Redis,这是一个键值存储系统,除了对场景进行缓存之外,Redis还提供了很多强大的功能,因此也目前是非常受欢迎的一个数据库. Docker镜像仓库简介 大家可以在Docker Hub里搜索到目前所有的主流应用和服务的镜像,像Python语言.MySQL数据库等等镜像在Docker Hub里面都有.而且Docker Hub里面的镜像数量非常多,不管我们

Docker 健康检查功能

Docker1.12及以上版本,自带了健康检查功能.通常情况下只能使用docker ps 来查看容器是否是up的状态,但是服务是否正常我们不可知,而健康检查功能,可以允许我们在容器中执行一些健康检查的命令,然后将容器的状态在"STATUS"中标识: [[email protected]]# docker ps CONTAINER ID        IMAGE                        COMMAND             CREATED             

用Docker构建分布式Redis集群

[编者的话]本文介绍了如何使用Docker搭建Redis集群,很多读者都在问Docker能带来哪些实质性的好处,我想本文就是一个很好的例子.不使用Docker你也可以搭建Redis集群,那使用Docker后会有怎么样的优势了?我想可以用两个词总结:快速和复用. 海量技术文章:http://tieba.yunxunmi.com/ 云搜 http://so.yunxunmi.com/ 让搜索更简单 采用html5完全支持手机和PC 我们经常会遇到这样一个问题:当我们想进行一个完整的测试的时候,往往缺

Docker Kubernetes 健康检查

Docker Kubernetes 健康检查 提供Probe探测机制,有以下两种类型: livenessProbe:如果检查失败,将杀死容器,然后根据Pod的重启策略来决定是否重启. readinessProbe:如果检查失败,Kubernetes会把Pod从服务代理的分发后端剔除. Probe支持以下三种检查方法: httpGet 发送HTTP请求,返回200-400范围状态码为成功. exec 执行Shell命令返回状态码是0为成功. tcpSocket 发起TCP Socket建立成功.

Docker 构建私有镜像仓库(6)

title: Docker 构建私有镜像仓库(6) date: 2018-12-18 08:47:27 tags: Docker categories: Docker copyright: true --- Docker是基于Go语言实现的开源容器项目,Docker让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何接口,Docker诞生于2013年年初,最初发起者是dotCloud公司.

用 Docker 构建分布式 Redis 集群

本文介绍了如何使用Docker搭建Redis集群,很多读者都在问Docker能带来哪些实质性的好处,我想本文就是一个很好的例子.不使用Docker你也可以搭建Redis集群,那使用Docker后会有怎么样的优势了?我想可以用两个词总结:快速和复用. 我们经常会遇到这样一个问题:当我们想进行一个完整的测试的时候,往往缺少硬件或者其它资源.为了满足需求,我可能需要三台服务,或者说三个虚拟机.但是我发现我们没有时间来创建它们,并且如果要物理机的话我们也没有那么多资源.这也是为什么我对Docker如此感

使用docker构建、运行jenkins镜像

目录: 1.基于docker官方的jenkins镜像启动容器 2.使用源码构建jenkins镜像并运行容器 3.使用csphere产品对容器.镜像.主机进行管理 docker近两年很火,最近在听cSphere希云主办的docker培训, 之前也参加过docker相关的技术沙龙(如docker meetup). 同时也使用Jenkins近两年,所以尝试使用docker构建jenkins镜像.运行基于镜像的容器. 因为听希云的docker培训获得了一张200元的腾讯云代金券, 所以用代金券在腾讯云上

Ubuntu下用docker安装redis镜像和使用redis容器分享

Ubuntu下用docker安装redis镜像和使用redis容器分享 1. 安装Ubuntu 2. 用Putty登录Ubuntu Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-40-generic x86_64) * Documentation:  https://help.ubuntu.com/ System information as of Wed Dec 31 06:41:16 UTC 2014 System load:  0.01