车海快讯

Docker篇(七): 如何实现 Docker 容器 的跨主机通讯?

admin 144

大家好,我是杰哥

之前在Docker篇(五):容器之间该如何通讯?中,讲到了运行多个容器时的网络通信方式,但那些容器都是运行在同一台物理机的

在实际项目中,我们往往需要部署多套软件,比如组件需要使用集群化部署,或者一个项目程序本身就依赖了很多组件,为了存储与运行效率等方面,往往需要跨主机部署。那么,该如何实现跨主机容器之间的网络通讯呢?

哎,你想到的,Docker也想到啦,或者说本来就存在着一种通用的方案吧

一、理论:Docker如何实现跨主机网络?1、认识DockerOverlay

Overlay网络是为特定目的在物理(底层)网络之上创建的逻辑网络。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/init
dockerrun-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/init
dockerrun-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/init
dockerrun-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/init

4)验证

请求地址:查看节点列表

可以看到,集群中,如期展示了4个节点,其中1个master节点和3个data节点(带*号的为master节点)

集群成功搭建完毕!可喜可贺!

5)项目中集成ES配置

经测试,只需要配置一个master节点的地址即可

=

注:这里只是说明了如何搭建一个ES集群,实现集群间网络通信的方式。后面会专门有文章,介绍ES的理论知识,与具体实战知识,敬请期待

四、总结

好了,总得来说,Docker是通过搭建Overlay网桥,然后把各个主机的容器都统一放在这个网桥上就实现了Docker容器的跨主机通讯

恭喜你又掌握了一个新技能。当然,如果想要真正掌握的话,也建议大家真正实战一次,毕竟实战与理解是不同阶段,对于知识的掌握程度也是不同级别的哦

嗯,就这样。每天学习一点,时间会见证你的强大~