zoukankan      html  css  js  c++  java
  • 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

      

  • 相关阅读:
    401. Binary Watch
    46. Permutations
    61. Rotate List
    142. Linked List Cycle II
    86. Partition List
    234. Palindrome Linked List
    19. Remove Nth Node From End of List
    141. Linked List Cycle
    524. Longest Word in Dictionary through Deleting
    android ListView详解
  • 原文地址:https://www.cnblogs.com/straycats/p/9906816.html
Copyright © 2011-2022 走看看