大家好,我是杰哥
之前在Docker篇(五):容器之间该如何通讯?中,讲到了运行多个容器时的网络通信方式,但那些容器都是运行在同一台物理机的
在实际项目中,我们往往需要部署多套软件,比如组件需要使用集群化部署,或者一个项目程序本身就依赖了很多组件,为了存储与运行效率等方面,往往需要跨主机部署。那么,该如何实现跨主机容器之间的网络通讯呢?
哎,你想到的,Docker也想到啦,或者说本来就存在着一种通用的方案吧
一、理论:Docker如何实现跨主机网络?1、认识DockerOverlayOverlay网络是为特定目的在物理(底层)网络之上创建的逻辑网络。Docker可以创建容器之间的Overlay网络,从而实现跨主机的容器之间的沟通
也就是说,只要几台物理机之间本身是可以通信的,那么只要在这些机器上建立好一个Overlay网络把需要相互通讯的容器,直接部署在这个网络之上,最终的效果就类似于将这些容器部署在同一台物理机一样,进行任意通信啦
比如说我们需要实现一个Elasticsearch集群,那么我们只需要把各个节点部署在预先创建好的一个Overlay网络上就可以实现通信啦
2、稍微具体一点你可能还会有疑惑,为什么Overlay网络就可以实现多台物理机之间的网络互通呢?实际上它是在Docker集群节点间的加入了一层虚拟网络,它有独立的虚拟网段。Docker容器发送的请求,会先发送到虚拟子网,再由虚拟子网包装为宿主机的真实网址进行发送
3、Swarm是什么?而今天要介绍的DockerSwarm,则是DockerOverlay网络的一种简易实现方式,它是Docker开发的容器集群管理工具,与DockerAPI兼容性很好
并且Linux中安装了Docker,也默认会安装Swarm。因此,在这里,我们采用Swarm实现集群间的网络通信
接下来,让我们通过实战真正了解一下使用DockerSwarm如何实现Docker容器的跨主机通信吧
二、实战一:实现集群之间的通信还是拿那个老例子来讲一下
在文章Docker篇(五):容器之间该如何通讯?中,我们分别将SpringBoot后端程序druid_demo和mariadb分别运行在不同容器中,成功实现了他们之间的通讯
那么,接下来,我们将他们分别部署在两台机器上
机器配置如下:
序号节点角色ip地址容器名称1_
说明:使用Swarm建立跨主机的网络,实际上总共分为如下几步:
在manager创建一个Swarm集群
将其他集群分别加进来
在manager创建一个Overlay网络
启动各个容器时,指定这个Overlay网络
具体,往下看
1、在manager节点创建Swarm集群执行命令:
dockerswarminit--advertise-addr=10.10.10.100
效果如下:
dockerswarminit--advertise-addr=10.10.10.100[root@localhost~]========================ElasticsearchConfiguration=========================NOTE:(separatemultiplelocationsbycomma)::/var/log/elasticsearch-----------------------------------Memory-----------------------------------Lockthememoryonstartup:_lock:tru----------------------------------Network-----------------------------------SetthebindaddresstoaspecificIP(IPv4orIPv6):Thedefaultlistofhostsis["127.0.0.1","[::1]"]_master_nodes:["elastic-master"]Formoreinformation,consultthediscoveryandclusterformationmoduledocumentation.----------------------------------Gateway-----------------------------------BlockinitialrecoveryafterafullclusterrestartuntilNnodesarestarted:_after_nodes:3Formoreinformation,consultthegatewaymoduledocumentation.----------------------------------Various-----------------------------------Requireexplicitnameswheletingindices:_::"*"
说明:
:my-application节点名称,各个节点必须独一无二
:demo不是data节点
:/var/lib/elasticsearch日志存储目录(无特殊需求,直接使用默认的即可)
_hosts:["elastic-master","elastic-data01","elastic-data02","elastic-data03"]
初始化集群节点,直接配置master节点的主机名即可
vi/usr/local/es/config/elastic-data01/
Beforeyousetouttotweakandtunetheconfiguration,makesureyoutheonoptions::/var/lib/elasticsearchPathtologfiles::0.0.0.0SetacustomportforHTTP::9200Formoreinformation,consultthenetworkmoduledocumentation.---------------------------------Discovery----------------------------------Passaninitiallistofhoststoperformdiscoverywhenthisnodeisstarted:_hosts:["elastic-master","elastic-data01","elastic-data02","elastic-data03"]Bootstraptheclusterusinganinitialsetofmaster-eligiblenodes:节点名称,各个节点必须独一无二:false是data节点
、elastic-data03的配置,与elastic-data01的配置,除了的值不一致以外,其余均相同
3)启动
分别在各个主机上,执行docker启动命令,进行各个节点的启动
dockerrun-itd--nameelastic-master-helastic-master--net=demo-v/usr/local/es/data:/var/lib/elasticsearch-v/usr/local/es/logs:/var/log/elasticsearch-v/usr/local/es/plugins:/usr/share/elasticsearch/plugins-v/usr/local/es/config/elastic-master/:/etc/elasticsearch/:ro-p9200:9200-p9300:9300-_master_nodes=elastic-master--restart=alwayselasticsearch:/sbin/initdockerrun-itd--nameelastic-data01-helastic-data01--net=demo-v/usr/local/es/data:/var/lib/elasticsearch-v/usr/local/es/logs:/var/log/elasticsearch-v/usr/local/es/plugins:/usr/share/elasticsearch/plugins-v/usr/local/es/config/elastic-data01/:/etc/elasticsearch/:ro-p9200:9200-p9300:9300-_master_nodes=elastic-master--restart=alwayselasticsearch:/sbin/initdockerrun-itd--nameelastic-data02-helastic-data02--net=demo-v/usr/local/es/data:/var/lib/elasticsearch-v/usr/local/es/logs:/var/log/elasticsearch-v/usr/local/es/plugins:/usr/share/elasticsearch/plugins-v/usr/local/es/config/elastic-data02/:/etc/elasticsearch/:ro-p9200:9200-p9300:9300-_master_nodes=elastic-master--restart=alwayselasticsearch:/sbin/initdockerrun-itd--nameelastic-data03-helastic-data03--net=demo-v/usr/local/es/data:/var/lib/elasticsearch-v/usr/local/es/logs:/var/log/elasticsearch-v/usr/local/es/plugins:/usr/share/elasticsearch/plugins-v/usr/local/es/config/elastic-data03/:/etc/elasticsearch/:ro-p9200:9200-p9300:9300-_master_nodes=elastic-master--restart=alwaysrelasticsearch:/sbin/init4)验证
请求地址:查看节点列表
可以看到,集群中,如期展示了4个节点,其中1个master节点和3个data节点(带*号的为master节点)
集群成功搭建完毕!可喜可贺!
5)项目中集成ES配置
经测试,只需要配置一个master节点的地址即可
=注:这里只是说明了如何搭建一个ES集群,实现集群间网络通信的方式。后面会专门有文章,介绍ES的理论知识,与具体实战知识,敬请期待
四、总结好了,总得来说,Docker是通过搭建Overlay网桥,然后把各个主机的容器都统一放在这个网桥上就实现了Docker容器的跨主机通讯
恭喜你又掌握了一个新技能。当然,如果想要真正掌握的话,也建议大家真正实战一次,毕竟实战与理解是不同阶段,对于知识的掌握程度也是不同级别的哦
嗯,就这样。每天学习一点,时间会见证你的强大~









