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
docker 構建帶健康檢查的redis鏡像