docker 構建帶健康檢查的redis映象
阿新 • • 發佈:2018-11-05
===============================================
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
二、構建帶有健康檢查的新映象
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