先下载centos镜像
docker pull centos
根据镜像创建容器:
docker run -it -d --name centos1 -d centos
进入容器下载常用工具 :

docker exec -it 容器id bash
 yum -y install wget gcc-c++ pcre pcre-devel zlib zlib-devel opensll-devel popt-devel initscripts net-tools vim
 安装好以后安装nginx
 rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
 yum -y install nginx
 安装keepalived:
 yum -y install keepalived


注意:这里nginx和keepalived安装以后 执行systemctl start 是拒绝的 利用centos启动的容器是没有root权限的
退出容器 利用该容器构成新镜像:

docker commit -a ‘5e’ -m ‘centos with common tools’ centos1 centos_base
 -a:作者信息
 -m:镜像信息
 centos1:容器名字
 centos_base:自定义生成的镜像名字
 上面的centos1容器可以删除掉:
 docker rm 容器id
 利用刚刚构建的新镜像创建新容器:
 docker run -it --name centos_temp -d --privileged centos_base /usr/sbin/init
 –privileged:给予容器root权限
 /usr/sbin/init:配合privileged使用
 进入容器:
 docker exec -it 容器id bash
 现在可systemctl 启动nginx和keepalived:
 systemct start nginx
 systemctl enable nginx
 访问nginx资源是否能访问到:
 curl http://容器的ip
 现在可编辑keepalived的配置文件 修改前可先cp一份:
 vim /etc/keepalived/keepalived.conf


内容:

! Configuration File for keepalived
global_defs {
 router_id LVS_01
 }vrrp_script chk_nginx {
 script “/etc/keepalived/nginx_check.sh”
 interval 2
 weight -20
 }vrrp_instance VI_1 {
 state MASTER
 interface eth0
 virtual_router_id 121
 mcast_src_ip 172.17.0.6
 priority 100
 nopreempt #非抢占式的keepalived
 advert_int 1
 authentication {
 auth_type PASS
 auth_pass 1111
 }
track_script {
    chk_nginx
}

virtual_ipaddress {
    172.19.12.100
}

}
编辑好退出创建 上述内容的 nginx_check.sh脚本

vim /etc/keepalived/nginx_check.sh
 #!/bin/bash
 A=ps -C nginx -–no-header |wc -l if [ $A -eq 0 ];then
 /usr/local/nginx/sbin/nginx
 sleep 2
 if [ ps -C nginx --no-header |wc -l -eq 0 ];then
 killall keepalived
 fi
 fi
 给权限:
 chmod +x nginx_check.sh
 现在可启动keepalived:
 systemct start keepalived
 systemctl enable keepalived


现在可尝试访问:
curl http://keepalived定义的虚拟ip

现在有了访问虚拟ip成功地容器,那么现在利用该容器构建新镜像,再利用镜像构建keepalived的主和备两个的容器:
构建主的容器:
docker commit-a ‘cfh’-m ‘centos with keepalived nginx’ centos_temp centos_kn
-a :作者信息
-m:镜像信息
centos_temp:根据的具体容器构建的镜像
再利用刚刚创建的镜像构成keepalived的主:
docker run --privileged -tid --name centos_master --restart=always centos_kn /usr/sbin/init
–restart=always:表示docker退出后将自动重启这个容器
构建从的容器:
docker run --privileged -tid --name centos_slave --restart=always centos_kn /usr/sbin/init
现在主从容器已经构建,因为在构建镜像时候,根据构建的容器已经修改过keepalived的配置文件
所以现在主的不需要修改 现在只需要将构建的从的容器,进入从容器修改keepalived的配置文件即可:

router_id LVS_01 改为LVS_02
state MASTER改为BACKUP
priority 100 改为90
因为这里是从,从的priority的优先级低于master
保存退出后重启从的keepalived的服务
systemctl restart keepalived

现在容器有两个 一个是master一个是slave,都是基于centos_temp容器构建的镜像创建的容器
防止出错如果有centos_temp容器 最好将他删除

现在在宿主机访问虚拟ip
curl 172.19.12.100 可显示master主的nginx资源
将master容器停止模拟损坏 再访问虚拟机ip出现从的nginx资源即成功

限制arp响应:

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
 echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
 echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
 echo 2 > /proc/sys/net/ipv4/conf/all/arp_a
 或者
 vim /etc/sysctl.conf
 net.ipv4.conf.all.arp_ignore = 1
 net.ipv4.conf.default.arp_ignore = 1
 net.ipv4.conf.lo.arp_ignore = 1
 net.ipv4.conf.all.arp_announce = 2
 net.ipv4.conf.default.arp_announce = 2 net.ipv4.conf.lo.arp_announce = 2
 增加回环地址:
 ifconfig lo:1 172.19.12.100 netmask 255.255.255.255 broadcast 172.19.12.100 up
 增加路由:
 route add -host 172.19.12.100 dev lo:1
 #添加开启自启动 echo “route add -host 172.19.12.100 dev lo:1” >> /etc/rc.local
 编辑配置文件增加:
 virtual_server 172.19.12.100 80 {
 delay_loop 10
 lb_algo rr
 lb_kind DR
 protocol TCP
 #sorry_server 127.0.0.1 80
real_server 172.19.12.2 80 {
            weight 1
            HTTP_GET {
               url {
                    path /
                    status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
            }
    }
            real_server 172.19.12.4 80 {
            weight 1
            HTTP_GET {
               url {
                    path /
                    status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
    }

}
}

安装ipvsadm:

yum -y install ipvsadm
 重启主和备的keepalived 查看ipvsadm规则:
 systemctl restart keepalived
 ipvsadm -Ln

这里做ipvs 上面脚本内容可以注释,因为ipvs会根据nginx是否存在自动添加到ipvs集群规则,如果某台nginx服务宕机,那么就会从ipvs的规则剔除,那么访问是keepalived只会显示还存在的nginx
为什么LVS设置了轮询,浏览器测试还是不能轮询?这关系到两个地方的配置:
01./etc/keepalived/keepalived.conf的persistence_timeout会话保持时间配置,测试轮询时设置为0;

02.查看ipvsadm默认超时时间
 [root@DR1 keepalived]# ipvsadm -L --timeout
 Timeout (tcp tcpfin udp): 900 120 300


900 120 300这三个数值分别是TCP TCPFINUDP的时间.也就是说一条tcp的连接经过lvs后,lvs会把这台记录保存15分钟,就是因为这个时间过长,所以很多人都会发现做好LVS DR之后轮询现象并没有发生,实践中将此数值调整很小小,使用以下命令调整:
[root@DR1 ~]# ipvsadm --set 1 2 1

如果上述未轮询:
那么只在主master的keepalived的配置文件带有

virtual_server 172.19.12.100 80 {
 delay_loop 10
 lb_algo rr
 lb_kind DR
 protocol TCP
 #sorry_server 127.0.0.1 80
real_server 172.19.12.2 80 {
            weight 1
            HTTP_GET {
               url {
                    path /
                    status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
            }
    }
            real_server 172.19.12.4 80 {
            weight 1
            HTTP_GET {
               url {
                    path /
                    status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
    }

}
}
从BACKUP的不带这些配置文件
只有主配置virtual_server
也会执行客户端访问轮询
但是当主的keepalived停掉,那么客户端访问资源只有访问BACKUP的资源不会再有轮询