1. 程式人生 > >docker 構建帶健康檢查的redis鏡像

docker 構建帶健康檢查的redis鏡像

volume ports 持久化 uil art war replicas lock color

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

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

docker 構建帶健康檢查的redis鏡像