我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Docker跨服务器通信Overlay怎么实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Docker跨服务器通信Overlay怎么实现

本篇内容主要讲解“Docker跨服务器通信Overlay怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Docker跨服务器通信Overlay怎么实现”吧!

场景

公司微服务快上线了,微服务都是用Docker容器进行部署的,在同一台主机下,把服务都部署上,注册到Nacos的IP与PORT都是内网的IP与Dockerfile中定义的端口号,看起来好像也没什么问题,通过网关去调用也是可以调通的,请注意这有一个大前提:

必须把所有服务容器部署在同一台主机上时才可以!

当服务实例没有部署在同一主机上,比如网关服务在A服务器,服务a在B服务器上,同样注册到Nacos (或其它注册中心) ,此时上报上来的都是内网的IP,那么当外部有请求进来的时候,网关通过Nacos的服务列表,找到了对应的服务a的内网IP,一调用发现调用不通

ps:内网怎么会通……

任务

微服务容器可以不在同一台服务器上,互相调用

想法

  • 既然上报的是内网的IP,我直接让他上报宿主机的IP和端口呗

  • 使用Docker的host网络模式

  • 修改部署脚本,通过shell部署容器时,获取宿主机IP与设置的映射端口号

  • 让Docker的网络互通

分析

以下分别按上边的“想法”部分来进行说明下问题

翻遍官方文档与Github,得出的方案又有两个:

  • 固定IP端口,把宿主机IP与端口写死在配置文件中:看起来是解决了,但是问题是无法水平扩展了 ——勉强能用

  • 固定网卡,防止因多网卡环境上报错误IP端口:没有用的,进入容器中ifconfig发现内部网卡只有两个,分别是eth0lo,对应网卡的IP就是内网IP ——还是没用

使用Docker的Host网络模式,你会发现IP这回上报的的确是宿主机IP,但是端口号不对啊……如果自己去通过shell使用Java参数传入待映射的端口号的话,这种情况理论上是可行的,唯一缺点是docker ps 再也直接看不到端口号了,需要额外去docker inspect ——可以用

映射端口号可以获取,但是主机的网卡名称不同,写死后不灵活,如果有的是eth0,有的是ens33呢?还有更多不可测的情况! ——或许可用

通过一些成熟的Docker容器网络共享,但是会有一定的性能损耗 ——完全可用

概念与选型

最稳妥的办法——使用Docker网络共享,在搜索引擎的帮助下,我决定用Overlay的方式来实现效果

以下简单说下Overlay:

容器在两个跨主机进行通信的时候,是使用overlay network这个网络模式进行通信;如果使用host也可以实现跨主机进行通信,直接使用这个物理的ip地址就可以进行通信。overlay它会虚拟出一个网络比如10.0.2.3这个ip地址。在这个overlay网络模式里面,有一个类似于服务网关的地址,然后把这个包转发到物理服务器这个地址,最终通过路由和交换,到达另一个服务器的ip地址。

Docker跨服务器通信Overlay怎么实现

想要实现Overlay网络,需要引入一个K-V数据库,来保存网络状态信息,包括 Network、Endpoint、IP 等。Consul、Etcd 和 ZooKeeper 都是 Docker 支持的K-V数据库

我们这里使用 Consul,相比其它K-V数据库,Consul提供的界面化方便管理,所以这里使用Consul实现Overlay

Docker跨服务器通信Overlay怎么实现

通过让每个服务器的Docker daemon将自己的IP注册到Consul中,来共享Docker内网,这里共享的内网是Overlay网络模式的,也只有在注册的Docker环境下使用同overlay网络的容器,才能互相通讯

ps: 创建完成后,不使用overlay网络的跨服务器容器,不能ping通

小试身手

单节点的Consul实现Overlay网络,使用Docker镜像

环境说明


服务器OS主机IPDocker版本网卡名
Ubuntu Server 18.04 LTS192.168.87.13318.09.6ens33
Ubuntu Server 18.04 LTS192.168.87.13918.09.7ens33

待使用的Consul版本为1.5.2,看Docker Hub上提示漏洞目前最小的。

本测试环境适用于Systemd管理的Linux发行版

Consul没有使用非官方的progrium/consul,主要是因为这个镜像实在太老了,四年前的如果有漏洞也没能及时修复,所以自己去<hub.docker.com>去趟了遍官方的坑!????

注意事项

每台运行docker的主机都不能同hostname,可以使用

$ sudo hostnamectl set-hostname your-new-hostname

同hostname会导致同名的主机docker无法互相通信

动手做

准备Consul使用镜像在133服务器上启动,所以可以先配置下Docker daemon的启动参数指向133服务器

分别修改133、139两台服务器的docker.service

$ ifconfig#已经去除干扰网卡,记录网卡名为ens33ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500        inet 192.168.87.133  netmask 255.255.255.0  broadcast 192.168.87.255        inet6 fe80::20c:29ff:fe02:e00a  prefixlen 64  scopeid 0x20<link>        ether 00:0c:29:02:e0:0a  txqueuelen 1000  (Ethernet)        RX packets 156739  bytes 233182466 (233.1 MB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 45173  bytes 2809606 (2.8 MB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0$ vim /etc/docker/daemon.json

Docker跨服务器通信Overlay怎么实现

保存退出.

  • cluster-store:配置的Consul的leader地址,单体直接写,其它软件注意协议

  • cluster-advertise: 指定监听的网卡和端口,也可以指定接收订阅消息的IP:PORT

还有一种是直接修改docker.service的,参考如下:

$ cd /etc/systemd/system/multi-user.target.wants$ sudo vim docker.service

找到ExecStart= 字眼,在此行末尾添加如下代码

--cluster-store=consul://192.168.87.133:8500 --cluster-advertise=ens33:2375

效果如下:

Docker跨服务器通信Overlay怎么实现

操作效果与以上方法保持一致

接着执行命令,重启docker服务,另一台服务器操作方式相同,注意网卡名称

$ sudo systemctl daemon-reload && sudo systemctl restart docker

在133服务器启动Consul服务

docker run -d --network host -h consul --name=consul --restart=always -e CONSUL_BIND_INTERFACE=ens33 consul:1.5.2

用主机模式的原因是防止有些端口没有映射出来,还有就是想让Consul识别外部网卡的方式只能host模式,下面给个非host的方式

$ docker run -di  -h consul -p 8500:8500 --name=consul consul:1.5.2

创建Docker overlay共享网络

$ docker network create -d overlay my_overlay

这里与普通创建网络不同在于指定了overlay模式的网络,-d也可以写为--driver

访问Consul的页面,如我的是192.168.87.133:8500

Docker跨服务器通信Overlay怎么实现

我们的配置在Key/Value处,

Docker跨服务器通信Overlay怎么实现

点击docker -> nodes

Docker跨服务器通信Overlay怎么实现

Docker跨服务器通信Overlay怎么实现

出现上边的两个节点,分别是两个docker daemon (守护进程) 注册的值

测试

新建两个centos的容器分别在两台服务器上,使用overlay 我们刚才创建的网络

133服务器

$ docker run -di --network my_overlay --name mycentos1 centos:7

139服务器

$ docker run -di --network my_overlay --name mycentos2 centos:7

--net全拼为--network--开头的可不加=

查看133服务器mycentos1容器的IP

$ docker inspect -f "{{ .NetworkSettings.Networks.my_overlay.IPAddress}}" mycentos110.0.1.2

查看139服务器mycentos2容器的IP

$ docker inspect -f "{{ .NetworkSettings.Networks.my_overlay.IPAddress}}" mycentos210.0.1.3

分别从133服务器ping 139服务器的mycentos2的内网IP

Docker跨服务器通信Overlay怎么实现

反过来ping也是一样的,但是并不是让我们通过外部去访问的,通过同一overlay网络的容器就可以,不信我们作如下尝试

133服务器

$ docker exec -it mycentos1 bash# ping 10.0.1.3

Docker跨服务器通信Overlay怎么实现

访问得通,没有丢包,反过来也是一样的,篇幅有限就不试验了

到此,相信大家对“Docker跨服务器通信Overlay怎么实现”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Docker跨服务器通信Overlay怎么实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Docker跨服务器通信Overlay怎么实现

本篇内容主要讲解“Docker跨服务器通信Overlay怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Docker跨服务器通信Overlay怎么实现”吧!场景公司微服务快上线了,微服务都
2023-06-21

利用overlay怎么实现docker容器间跨宿主机通信

这期内容当中小编将会给大家带来有关利用overlay怎么实现docker容器间跨宿主机通信,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。overlay网络解析内置跨主机的网络通信一直是Docker备受期待
2023-06-06

docker跨主机通信怎么实现

要实现Docker跨主机通信,可以使用以下几种方法:使用Docker的网络模式:可以使用Docker的overlay网络模式来创建一个虚拟的网络,使得容器可以在不同的主机上通过网络进行通信。在创建容器时,可以指定使用overlay网络,并将
2023-10-27

Docker容器怎么实现跨主机通信

本篇内容介绍了“Docker容器怎么实现跨主机通信”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、Docker主机间容器通信的解决方案Do
2023-06-29

Vue中iframe怎么结合window.postMessage实现跨域通信

这篇文章主要介绍“Vue中iframe怎么结合window.postMessage实现跨域通信”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue中iframe怎么结合window.postMess
2023-07-04

Vue怎么使用postMessage实现父子跨域通信

这篇文章主要讲解了“Vue怎么使用postMessage实现父子跨域通信”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue怎么使用postMessage实现父子跨域通信”吧!一、跨域通信1
2023-07-04

使用iframe和postMessage怎么实现页面跨域通信

这篇文章将为大家详细讲解有关使用iframe和postMessage怎么实现页面跨域通信,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。通常情况下,对于两个不同页面的脚本,只有当执行它们的页面
2023-06-09

docker两个容器互通怎么实现

要实现两个 Docker 容器之间的互通,可以通过以下几种方式:使用网络方式:在创建容器时,可以指定它们使用相同的网络。比如可以创建一个自定义的网络,然后将两个容器加入到该网络中,这样它们就可以通过容器名称来相互通信。具体操作可以参考 Do
2023-10-22

python客户端与服务器端通信怎么实现

Python客户端与服务器端通信可以通过套接字(socket)实现。1. 服务器端首先需要创建一个套接字,并绑定到指定的IP地址和端口上:```pythonimport socket# 创建一个套接字对象server_socket = so
2023-09-08

python客户端与服务器端通信怎么实现

使用套接字进行Python客户端和服务器端通信分四步:创建服务器端、创建客户端端、发送和接收数据,关闭连接。示例代码展示了如何使用套接字在服务器端和客户端端之间建立连接、发送和接收数据。包括其他注意事项,例如防火墙配置、数据序列化和错误处理。
python客户端与服务器端通信怎么实现
2024-04-12

java跨服务器文件传输怎么实现

Java跨服务器文件传输实现Java提供了多种方法实现跨服务器文件传输,包括:基于流传输(InputStream/OutputStream、FileChannel)基于协议传输(FTP、SFTP、HTTP)第三方库(ApacheCommonsNet、JSch、ApacheHttpClient)根据具体需求选择合适的方法,考虑因素包括性能、安全性、易用性和跨平台支持。
java跨服务器文件传输怎么实现
2024-04-13

实现与阿里云服务器的通信

本文将详细介绍如何实现与阿里云服务器的通信。首先,我们将介绍阿里云服务器的基本信息和其通信协议。然后,我们将介绍如何使用阿里云的SDK进行服务器通信。最后,我们将介绍一些常见的问题及其解决方案。一、阿里云服务器的基本信息阿里云服务器是阿里云提供的云计算服务,具有高可用性、高性能、低成本、易于管理等特点。阿里云服务
实现与阿里云服务器的通信
2023-11-11

编程热搜

目录