1、拉取镜像
docker pull osixia/keepalived:2.0.20
2、启动命令
192.168.1.1,192.168.1.2代表的是宿主机的IP,192.168.1.3代表的是虚拟IP。
1.master
docker run --cap-add=NET_ADMIN --cap-add=NET_BROADCAST --cap-add=NET_RAW --net=host -d --name keepalived \
-v /etc/localtime:/etc/localtime \
-e KEEPALIVED_INTERFACE='enp3s0' \
-e KEEPALIVED_PASSWORD='123456' \
-e KEEPALIVED_STATE='MASTER' \
-e KEEPALIVED_ROUTER_ID='51' \
-e KEEPALIVED_UNICAST_PEERS="#PYTHON2BASH:['192.168.1.1','192.168.1.2']" \
-e KEEPALIVED_VIRTUAL_IPS='192.168.1.3' \
osixia/keepalived:2.0.20
2.Slave
docker run --cap-add=NET_ADMIN --cap-add=NET_BROADCAST --cap-add=NET_RAW --net=host -d --name keepalived \
-v /etc/localtime:/etc/localtime \
-e KEEPALIVED_INTERFACE='enp3s0' \
-e KEEPALIVED_PASSWORD='123456' \
-e KEEPALIVED_STATE='BACKUP' \
-e KEEPALIVED_ROUTER_ID='51' \
-e KEEPALIVED_UNICAST_PEERS="#PYTHON2BASH:['192.168.1.1','192.168.1.2']" \
-e KEEPALIVED_VIRTUAL_IPS='192.168.1.3' \
osixia/keepalived:2.0.20
3、注意
因为是docker部署的keepalived,所以keepalived里面所写的nginx检测脚本是运行不了的,因为不能从容器去操作宿主机,无法实现nginx的重启与keepalived的docker stop操作。所以采取crontab的定时任务策略去检测,实现VIP飘逸。
4、定时检测脚本
#!/bin/bash
while true
do
if [ -z "$(lsof -i :80)" ]; then
/usr/local/nginx/sbin/nginx
fi
sleep 5
if [ -z "$(lsof -i :80)" ]; then
docker stop keepalived
fi
sleep 5
if [ -z "$(lsof -i :80)" ]; then
/usr/local/nginx/sbin/nginx
fi
sleep 5
if [ -z "$(lsof -i :80)" ]; then
docker stop keepalived
fi
sleep 5
if [ -z "$(lsof -i :80)" ]; then
/usr/local/nginx/sbin/nginx
fi
sleep 5
if [ -z "$(lsof -i :80)" ]; then
docker stop keepalived
fi
done
5、定时任务
crontab -e 进入定时任务编写页面
* * * * * check_nginx.sh
表示,每分钟执行一次检测脚本,crontab最小执行单位为分钟,所以check_nginx.sh中每五秒检测一次,写了三次,相当于每分支去检测6次nginx,第1.3.5次检测的是nginx,如果端口不存在则重启nginx,第2.4.6次是重启完了nginx再去检测nginx,nginx还没启动,则docker stop keepalived,实现虚拟IP转移。