Shell 实现 docker 的健康检查及服务重启功能

有运维或运维开发方面的需求,可以联系博主QQ 452336092或Email:admin#centos.bz(收费)

最近配置一台 CentOS 7.1 的服务器, 安装了 docker-ce 版本为: Docker version 17.09.1-ce, 启用 docker swarm, 创建 stack 时,发现如下错误:

start container failed: subnet sandbox join failed for "10.255.0.0/16": overlay subnet 10.255.0.0/16 failed check with host route table: requested network overlaps with existing network

具体错误如图:

原因可能是上层网络占用了 10.255.0.0/16 的部分网段导致。 所以只有放弃 swarm 模式,由于应用比较简单,所以只需使用 docker-compose 就够啦, 只是docker 自带的健康检查失去了意义,只是标识是否健康,没有进程监控健康的状态及恢复服务的操作。
最后决定使用 SHELL 实现这一功能。

先写好自己的docker-compose.yml, 比如PHP+NGINX+REDIS的服务,具体如下:

version: '3.3'
services:
  redis:
    image: redis:3
    restart: always
    volumes:
      - /xmisp/redis/conf:/usr/local/etc/redis
      - /xmisp/redis/data:/var/lib/redis
      - /xmisp/redis/log:/var/log/redis
    ports:
      - 10.0.21.30:6379:6379/tcp
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
  php:
    image: davinbao/php-fpm:latest
    restart: always
    volumes:
      - /xmisp/php/conf/www.conf:/usr/local/etc/php-fpm.d/www.conf:ro
      - /xmisp/php/log:/var/log/php-fpm
      - /xmisp/www:/home/www
    ports:
      - 10.0.21.30:9000:9000/tcp
  nginx:
    image: davinbao/nginx:latest
    restart: always
    volumes:
      - /xmisp/nginx/conf:/etc/nginx/conf.d
      - /xmisp/nginx/log:/var/log/nginx
      - /xmisp/www:/home/www
    ports:
      - 80:80/tcp

SHELL 实现健康检查及重启服务, 具体如下:

#!/bin/bash

ADDRESS=$1
COMPOSE_FILE=$2
STATE=0


while true ;do

    HTTP_CODE=`curl -I -m 10 -o /dev/null -s -w %{http_code}"\n" ${ADDRESS}`
    if [ "${HTTP_CODE}" != 200 ];then
        let STATE=STATE+1
        echo `date +"%Y-%m-%d %H:%M:%S"` The ${STATE} time can not access
    else
        echo `date +"%Y-%m-%d %H:%M:%S"` Success
        break
    fi

    if [ $STATE -gt 2 ];then
        echo Can not access ${ADDRESS} ,service will reboot!
        docker-compose -f ${COMPOSE_FILE} down
        docker-compose -f ${COMPOSE_FILE} up -d
        break
    fi
    sleep 15

最后配置 crontab 每两分钟执行该脚本:

> crontab -e

*/2 * * * * /xmisp/www/redirect-system/health_check.sh http://localhost /xmisp/www/redirect-system/docker-compose.yml >> /xmisp/www/redirect-system/storage/logs/health_check.log

脚本的功能是每两分钟检查一次80端口,如果不通,将重启整个服务。

原文出处:tech06 -> http://tech06.com/2018/01/09/shell-docker-health-check-restart/

打赏

如果此文对你有所帮助,请随意打赏鼓励作者^_^