微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Docker 下的 Keepalived + Haproxy 高可用实现 1 实现结果演示

Docker 下的 Keepalived + Haproxy 高可用实现 1 实现结果演示

一. 结果:

1.1 对外虚拟IP “172.16.232.200”,可以访问5659,5660,5661 三个端口,分别对应不同功能模块;

1.2 跳过中间过程,实际是访问的 Haproxy的5659监控界面,再加上负载均衡到“172.18.12.11~12~13”三套Rabbitmq容器的5672(功能端口)和15672(管理界面);

二.高可用演示

通过PIng测试,在宿主机ping Docker内虚拟IP 172.18.12.110,在手工关闭一台Keepalived主机时,IP转移,耗费2.3ms秒左右;

结果表示高可用成功;

 

 三. 坐好,开始描述实现过程;

3.1 详细结果

从外部方位宿主机,本次合计实现了 2个IP,15各端口;

3.2 两个IP

172.16.232.138 是宿主网卡获取的ip(可以访问12个端口);

172.16.232.200是虚拟IP(Keepalived)(多了3个端口,合计可以访问15个端口);

3.3 15个端口;

  • 先三个:

5659,5660,5661是虚拟IP专用的3个端口,分别对应了Docker内Keepalived的3个端口(5659,5660,5661)

这3个端口只要不冲突,可以是<65536的任意整数;此次演示项目保持了跟Docker内Keepa的3个端口一致;

这3个端口是通过宿主机的Keepalived虚拟ip 172.16.232.200转发的,并没有给宿主机本身,所以这3个端口不能通过物理ip172.16.232.138来访问;

  • 再12个端口:这12个端口,全部是Docker内部的5套容器的端口,分别是:

2套Haproxy容器,每套3个,计6个端口

3套Rabbitmq容器,每套2个,计6个端口

本次演示项目,以上12个端口,可以不用转发给宿主机,但是为了学习Docker,就全部转发了;

根据Docker规则,以上必须转发到宿主12个不同的接口;

示例如下:(学习过程中,Haproxy容器多次创建和删除,图上的是Haproxy4~5)

 3.4 5套容器

  • 先3个简单的,Rabbitmq 容器,不过多描述;
  • 在2个复杂的 Haproxy+Keepalived容器,要多描述

 有Haproxy容器,下载和安装就行;也是下载+安装;

 没有Keepalived容器,需要自己创建;

3.5 Keeplived 容器的创建

创建Keepalived容器与2中方法,本次测试项目,Keepalived和Haproxy是一体的,所以可以在Haproxy的基础上创建Keepalived容器;

1是运行Haproxy后,在内部安装Keepalived,后再保存成镜像,便于创建第二个Haproxy;体积稍大;

2是通过DockFile生成Keepalived+Haproxy的合体镜像;

由于直连官方链接,这2个方法,都耗费了40多分钟;

示例如下

通过DockFile生成是209m

运行Haproxy后再安装,是257m

        

  • 先运行Haproxy,再内部安装Keepalived,

运行后,命令行,apt-get update,再apt-get install keepalived,再apt-get install nano;

划重点:docker内部认没有编辑工具,这里安装nano,体积小;也可以安装vim,要大不少;nano用于编辑keepalived的配置文件;  

  • 通过DockFile生成Keepalived+Haproxy的合体镜像;

FROM haproxy:latest
RUN apt-get update && apt-get install -y nano keepalived

 

就这2行,第一行,表示基础镜像是 haproxy:lastest, 第二行,表示 运行 “apt-get update && apt-get install -y nano keepalived”命令;

划重点:“&&”符号,在生成Docker时,如果以上命令分成

apt-get update //一行

apt-get install **//二行

的话,会在增加Docker镜像的“层数”,具体描述看Docker专业知识,本次测试项目不详细描述;

  • bulid命令 sudo docker build -t "新镜像的名字:版本" . 

划重点:最后有个“.” 点字符;要在Dockerfile文件所在的目录下执行命令;不错,文件名就是“Dockerfile”;


 

篇幅所限,在继续编写实现过程; 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐