===============================================
2018/11/5_第1次修改 ccb_warlock
===============================================
這里簡單提下為什么要花力氣去構建帶健康檢查的鏡像: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
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"]
docker build --rm -t redis:4.0.11-chk .
至此,帶有健康檢查的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