千家信息网

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

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容主要讲解"Docker跨服务器通信Overlay怎么实现",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Docker跨服务器通信Overlay怎么实
千家信息网最后更新 2026年11月03日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的网络互通

分析

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

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

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

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

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

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

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

概念与选型

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

以下简单说下Overlay:

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

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

我们这里使用 Consul,相比其它K-V数据库,Consul提供的界面化方便管理,所以这里使用Consul实现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,主要是因为这个镜像实在太老了,四年前的如果有漏洞也没能及时修复,所以自己去去趟了遍官方的坑!????

注意事项

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

$ sudo hostnamectl set-hostname your-new-hostname

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

动手做

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

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

$ ifconfig#已经去除干扰网卡,记录网卡名为ens33ens33: flags=4163  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        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

保存退出.

  • 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服务,另一台服务器操作方式相同,注意网卡名称

$ 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

我们的配置在Key/Value处,

点击docker -> nodes

出现上边的两个节点,分别是两个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

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

133服务器

$ docker exec -it mycentos1 bash# ping 10.0.1.3

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

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

服务 服务器 网络 容器 网卡 主机 通信 模式 两个 口号 地址 端口 宿主 宿主机 方式 环境 网关 配置 效果 数据 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 手磨咖啡 互联网是第几次科技革命的成果 互联网科技公司起名 广州百单互联网科技有限公司 圆梦互联网科技 世界互联网领先科技成果 电子科技大学互联网 互联网高科技企业 左右互联网络科技 互联网公司会议桌创意科技软装饰 互联网系的金融科技公司 南山科技园互联网公司有哪些 青海科技产业互联网发展 东莞新华互联网科技学校 江苏互联网智能科技产品出厂价 中国新注册互联网科技 互联网时代高科技布局 互联网科技和医药行业 互联网科技大会大佬 安徽九吞吴互联网科技有限公司 西安纸贵互联网科技有限公司 互联网科技有限公司经营范围 百单互联网科技有限公司 电子科技大学互联网 青海省互联网新科技 富国互联网科技创新基金 北京市互联网新科技 兰石爱特工业互联网科技分公司 众联互联网络科技 株洲百竞科技的互联网营销顾问
0