搭建 docker + nginx + keepalived 实现Web应用的高可用(亲测)
1. 环境准备
下载 VMware : https://www.vmware.com/go/getplayer-win
下载 Centos : https://mirrors.aliyun.com/centos/7.6.1810/isos/x86_64/CentOS-7-x86_64-Minimal-1810.iso
下载之后安装好 VMware,然后创建两个 centos 虚拟机,具体安装步骤直接按照界面提示操作即可,装完操作系统之后重启即可。
主机IP:192.168.65.132 备机IP 192.168.65.129 将两台机器都安装好 docker ,nginx,keepalived 安装方法如下面。
2. 安装启动 docker
yum -y install docker #参数 y 代表自动选择,可以试一下不加 y 会是什么效果
问题:如果是首次使用这个命令,会报错 cannot find a valid baseurl for repo : base/7/x86_64。
解决:1.打开 vi /etc/sysconfig/network-scripts/ifcfg-ens33(每个机子都可能不一样,但格式会是“ifcfg-ens数字”),把ONBOOT=no,改为ONBOOT=yes
2.重启网络 service network restart
问题: 如何校验是否安装成功
解决: 使用命令 docker -v ,会提示所安装的 docker 的版本信息
问题: 如何设置 docker 为开机自启以及后台启动
解决: 1.开机自启 systemctl enable docker
2.启动 docker systemctl start docker
3.检查是否启动 systemctl start docker
3. 安装启动 nginx
1.镜像加速: https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors (这里可能需要注册一个阿里云的账号,用大佬的东西,注册个账号也不费事)

2.拉取镜像:docker pull nginx #这里获取的是最新的 nginx
3.显示已拉取的镜像: docker images

4.创建文件夹用于使用自己定义的配置文件以及日志文件
mkdir -p /app/docker/nginx/conf # 配置文件
mkdir -p /app/docker/nginx/html #主页
mkdir -p /app/docker/nginx/logs #日志存放
5.在 /app/docker/nginx/conf 目录下创建配置文件: vi nginx.conf
在 /app/docker/nginx/html 目录下创建首页(仅仅是后面用来判断请求落在了哪个机器上,主机和备机能区分开就行): vi index.html
Master machine IP: 192.168.65.132
index.html
在 /app/docker/nginx/ 目录下创建 docker 启动文件: vi start.sh
#!/bin/bash
docker run --name docker-nginx --privileged=true --restart=always -p : \
-v /app/soft/docker-config/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /app/soft/docker-config/nginx/logs:/var/log/nginx \
-v /app/soft/docker-config/nginx/html:/usr/share/nginx/html \
-d nginx # --privileged=true 使用此参数 container内的root拥有真正的root权限
# --restart=always docker启动时,自动重启该容器
# -p : 将容器的80端口映射到主机的80端口
# --name docker-nginx 容器的名字
# -v /app/soft/docker-config/nginx/conf/nginx.conf:/etc/nginx/nginx.conf # 挂载文件夹,将主机的文件夹挂载到容器的文件夹 \
# -v /app/soft/docker-config/nginx/logs:/var/log/nginx
# -v /app/soft/docker-config/nginx/html:/usr/share/nginx/html
# -d nginx 下载的容器的名字,不带版本号就是最新的
start.sh
6.启动 nginx ./start.sh (先执行 chmod +x start.sh 使得脚本可以执行)

7.分别访问两个IP地址
主机:

备机:

8.查看日志进入 cd /app/docker/nginx/logs
5. 安装 keepalived
1.yum install -y curl gcc openssl-devel libnl3-devel net-snmp-devel
2.yum install -y keepalived
3.修改配置文件 /etc/keepalived/keepalived.conf
主机和备机的配置文件在于:state 和 priority 两个地方,修改下这里就行,主机初始状态为 MASTER,优先级为100 备机初始状态为BACKUP,优先级为80
! Configuration File for keepalived
global_defs { # 全局配置
notification_email {
@qq.com # 接受告警的邮箱
}
notification_email_from sample@.com # 指定发件人
smtp_server 192.168.200.1 # 指定的 smtp服务器地址
smtp_connect_timeout # 指定 smtp 连接超时时间
router_id LVS_DEVEL # 负载均衡标识,在局域网应该是唯一的
vrrp_skip_check_adv_addr
vrrp_strict #添加一个周期性执行的脚本。脚本的退出状态码会被调用它的所有的VRRP Instance记录。
vrrp_garp_interval
vrrp_gna_interval
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" # 指定要执行的脚本的路径
interval # 指定脚本执行的间隔。单位是秒。默认为1s。
}
vrrp_instance VI_1 {
state MASTER # 指定该keepalived节点的初始状态 这里这个并不意味着他就是主机!!是根据下面比较 priority 值来判断主机的
interface ens33 # vrrp实例绑定的接口,用于发送VRRP包 这里需要写成 ifconfig 显示的网卡名
virtual_router_id # 指定VRRP实例ID,范围是0-
priority # 指定优先级,优先级高的将成为MASTER
advert_int # 指定发送VRRP通告的间隔。单位是秒
authentication {
auth_type PASS # 指定认证方式。PASS简单密码认证(推荐),AH:IPSEC认证(不推荐)
auth_pass # 指定认证所使用的密码。最多8位
}
virtual_ipaddress {
192.168.65.135 # 指定VIP地址
}
track_script {
chk_nginx
}
}
4.创建定时检测 nginx 是否正常运行的脚本 (执行 chmod +x nginx_check.sh 使得脚本可以执行)
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq ];then
# /usr/bin/docker rstart docker-nginx >> ./tmp/echo.log >> ./tmp/echo2.log #正常情况下这里需要重启 nginx,这里已疯,环境变量导致着无法识别命名
sleep
if [ `ps -C nginx --no-header |wc -l` -eq ];then
ps -ef|grep keepalived|grep -v grep|awk '{print $2}'|xargs kill -
fi
fi
nginx_check.sh
大坑:这里是定时去调用这个脚本去检测 nginx 有没有正常运行,但是由于 crontab 的环境变量问题!脚本手动执行是可以执行的,但是运行就会报 "命令找不到",或者 "没有权限",由于水平有限,研究了两天还不知道怎么搞。附带几个链接,试过了但是还是没有解决,后续等解决之后修改,请大佬指点。
crontab定时任务自动不能执行,手动可以执行的解决办法-亲测解决
5.启动 keepalived
systemctl enable keepalived # 开机自启动
systemctl start keepalived # 启动
systemctl stop keepalived # 暂停
systemctl restart keepalived # 重启
systemctl status keepalived # 查看状态
6.查看日志
tail -f /var/log/messages
6. 验证
第一种情况:两个机器 nginx 都正常运行
1.访问 http://192.168.65.132/ 页面会显示 "Master machine..... IP:192.168.65.132"
2.访问 http://192.168.65.129/ 页面会显示 "Slave machine ... IP:192.168.65.129"
3.访问 http://192.168.65.135/ 页面会显示 "Master machine..... IP:192.168.65.132" 说明现在 主机192.168.65.132 获得 VIP
4.通过 cat /app/docker/logs/access.log 查看到访问记录,日志的格式也是配置文件中定义的
第二种情况 : 主机 nginx 关闭
1.关闭主机 docker : docker stop docker-nginx (docker-nginx 是在 .start.sh 定义的容器的名称)
2.由于 keepalived 定时监控 nginx 运行状态,发现 nginx 关闭了,此时会将 keepalived 关闭,备机获得 VIP ,在关闭主机docker时,可以观察备机的日志,tail -f /var/log/messages

3.此时访问 http://192.168.65.135/ 页面提示: “Slave machine ... IP:192.168.65.129”
4.查看备机 192.168.65.129 的 cat /app/docker/logs/access.log 能查看到访问记录
第三种情况:主机 nginx 关闭之后重启
1.重启主机 docker : docker restart docker-nginx (docker-nginx 是在 .start.sh 定义的容器的名称)
2.重启已关闭的 keepalived : systemctl restart keepalived
3.观察主机和备机的日志 : tail -f /var/log/messages
主机:

备机:

5.会发现主机马上获取到了 VIP,此时再访问 http://192.168.65.135/ 页面会显示 "Master machine..... IP:192.168.65.132"
7. 结束
参考博客 : https://blog.51cto.com/andyxu/2286045
https://blog.csdn.net/jomexiaotao/article/details/83271458
水平有限,如有错误的地方,希望大家可以友情指出 你我共同进步,开开心心的就好
搭建 docker + nginx + keepalived 实现Web应用的高可用(亲测)的更多相关文章
- Nginx+Keepalived+VIP漂移实现HA高可用技术之详细教程
https://www.cnblogs.com/zcc666/p/13141626.html 这个是nginx安装教程地址 https://www.cnblogs.com/zcc666/p/1313 ...
- Nginx(七):keepalived实现Nginx负载均衡服务器的双机高可用
前言 之前咱们通过 Nginx(六):Nginx HTTP负载均衡和反向代理的配置与优化 和 Nginx+tomcat组合实现高并发场景的动静分离和负载均衡方案 这两篇文章了解了Nginx对高并发应用 ...
- 浅谈web应用的高可用
1.熟悉几个组件 1.1.apache —— 它是Apache软件基金会的一个开放源代码的跨平台的网页服务器,属于老牌的web服务器了,支持基于Ip或者域名的虚拟主机,支持代理服务器,支持安全 ...
- 学习heartbeat-03t实现web服务的高可用案例及维护要点
8.Heartbeat实现web服务的高可用案例 8.1部署准备 通过web服务高可用案例来熟悉heatbeat软件的使用,用上面的两台服务器机器名分别为heartbeat-1-130和heartbe ...
- mysql+keepalived 双主热备高可用
理论介绍:我们通常说的双机热备是指两台机器都在运行,但并不是两台机器都同时在提供服务.当提供服务的一台出现故障的时候,另外一台会马上自动接管并且提供服务,而且切换的时间非常短.MySQL双主复制,即互 ...
- Redis主从配置及通过Keepalived实现Redis自动切换高可用
Redis主从配置及通过Keepalived实现Redis自动切换高可用 [日期:2014-07-23] 来源:Linux社区 作者:fuquanjun [字体:大 中 小] 一:环境介绍: M ...
- (七) Docker 部署 MySql8.0 一主一从 高可用集群
参考并感谢 官方文档 https://hub.docker.com/_/mysql y0ngb1n https://www.jianshu.com/p/0439206e1f28 vito0319 ht ...
- keepalived+mysql实现双主高可用
环境: DB1:centos6.8.mysql5.5.192.168.2.204 hostname:bogon DB2:centos6.8.mysql5.5.192.168.2.205 hostn ...
- 基于Keepalived实现LVS双主高可用集群
Reference: https://mp.weixin.qq.com/s?src=3×tamp=1512896424&ver=1&signature=L1C7us ...
随机推荐
- MAPREDUCE的原理和使用
简介: Mapreduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架: Mapreduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分 ...
- Reading RxJava Marble Diagrams
------>表示一个Observable(承时间推移,由左入右,左边item先发射) ------>上面的图形,表示这个Observable发射的item ------>上的的|( ...
- ora-28547:连接服务器失败,可能是 Oracle Net 管理失败
检查如下: 监听程序的配置文件 发现多了 (PROGRAM = extproc) 去掉后如下: # listener.ora Network Configuration \dbhome_1\netwo ...
- 在zookeeper集群的基础上,搭建solrCloud
1 将在window中部署的单机版solr上传到node-01中 cd /export/software/ rz 选择资料中的solr.zip进行上传(此zip就是 solr的简单部署:在tomca ...
- 【原创】3. MYSQL++ Query类型与SQL语句执行过程(非template与SSQLS版本)
我们可以通过使用mysqlpp:: Query来进行SQL语句的增删改查. 首先来看一下mysqlpp::Query的一些最简单的调用, conn.connect(mysqlpp::examples: ...
- 相关度算法BM25
BM25算法,通常用来作搜索相关性平分.一句话概况其主要思想:对Query进行语素解析,生成语素qi:然后,对于每个搜索结果D,计算每个语素qi与D的相关性得分,最后,将qi相对于D的相关性得分进行加 ...
- 关于sleep的理解
unix是按时间片轮转调度, windows是抢占式调度 以吃蛋糕为例子,10个人吃蛋糕,如果是unix下, 假设开始时,每个人都处于就绪状态,那么操作系统调度大家排好队,按顺序吃,每个人吃1分钟, ...
- Ubuntu 12.04 LTS 中文输入法的安装 (转载)
第一步:安装语言包 进入 “System Settings” 找到 “Language Support” 那一项,点击进入 选择 “Install/Remove Languages” 找到 “Chin ...
- zend studio永久使用的方法
安装时选择试用版,以后每天的剩余天数会减少,找到c盘->用户->administrator删除三个文件(.zend,.zend studio,.zs)即可,.zs往往是隐藏的,这时需要选择 ...
- 关于 Azure 安全性的 10 点提示
讨论云服务时,安全性是一个关键领域.实际上,Windows Azure 基础结构实施大量的技术和流程来保护环境.此页介绍 Microsoft 的全球基础服务如何运行基础结构以及它们实施的安全措施. 从 ...