最近配置一台 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端口,如果不通,将重启整个服务。