详解Docker 容器跨主机多网段通信解决方案

详解Docker 容器跨主机多网段通信解决方案,第1张

详解Docker容器跨主机多网段通信解决方案

本文主要介绍Docker容器跨主机多网段通信解决方案,通过示例代码进行了非常详细的介绍,对大家的学习或工作有一定的参考价值。有需要的朋友就跟着下面的边肖学习吧。

一、麦克法兰

实现Docker跨主机网络通信的解决方案有很多,比如之前的博文,描述了如何通过部署Consul服务实现Docker容器的跨主机通信。

MACVLAN工作原理:

Macvlan是Linux内核支持的网络接口。要求的Linux内部版本为v3.9-3.19和4.0+;
通过为物理网卡创建Macvlan子接口,允许一个物理网卡拥有多个独立的MAC地址和IP地址。虚拟子接口将直接暴露给相邻的物理网络。从外面看,就像是把多股网线分开,分别接纳在不同的主机上。
物理网卡收到数据包后,会根据收到的数据包的目的MAC地址,判断该数据包需要投递到虚拟网卡。

当容器需要直接连接到物理网络时,可以使用Macvlan。Macvlan本身不会创建网络。本质上,它首先让主机物理网卡工作在‘混杂模式’,这样物理网卡的MAC地址就会失效,二层网络的所有流量都可以被物理网卡接收。下一步是在这个物理网卡上创建一个虚拟网卡,并为虚拟网卡指定MAC地址,以便一卡多用。在物理网络中,每个虚拟网卡都是一个独立的接口。

使用Macvlan注意:

  • 容器直接连接到物理网络,物理网络负责分配IP地址。可能的结果是物理网络的IP地址被耗尽,另一个后果是网络性能问题,这是由于连接到物理网络的主机越来越多,广播包的比例迅速增加造成的。
  • 主机上的网络需要以“混沌模式”工作;
  • 如前所述,工作在混沌模式下的物理网卡的MAC地址会失效,因此运行在该模式下的容器无法与外网通信,但不会影响主机与外网的通信;
  • 从长远来看,桥接网络和覆盖网络是更好的选择,因为虚拟网络应该与物理网络隔离,而不是共享。
  • 工作图:


    二。配置示例

    示例1(基于容器的macvlan的单网段跨主机通信的实现)

    达到效果:

    两个centos7.3,分别运行docker服务;
    两台docker服务器创建同一个MacVlan网络,这样docker服务器上的容器就可以实现跨主机通信。

    开始配置

    1.第一个对接服务器的配置如下

    [root@docker01~]#iplinksetens33promiscon#开启ens33网卡的混杂模式 [root@docker01~]#iplinkshowens33#确定查看的信息包含以下标红的字样 2:ens33:<BROADCAST,MULTICAST,'PROMISC',UP,LOWER_UP>mtu1500qdiscpfifo_faststateUPmodeDEFAULTgroupdefaultqlen1000 link/ether00:0c:29:9f:33:9fbrdff:ff:ff:ff:ff:ff [root@docker01~]#dockernetworkcreate-dmacvlan--subnet172.22.16.0/24--gateway172.22.16.1-opa rent=ens33mac_net1 #创建macvlan网络,指定网关、网段等信息,“-o”指定绑定在哪张网卡之上 [root@docker01~]#dockerrun-itd--nametest1--ip172.22.16.10--networkmac_net1busybox#基于新创建的macvlan网络运行一个容器,并指定其IP

    确认运行容器的IP地址。

    [root@docker01~]#dockerexectest1ipa#查看IP,确定以下标红与配置的一样 1:lo:<LOOPBACK,UP,LOWER_UP>mtu65536qdiscnoqueueqlen1000 link/loopback00:00:00:00:00:00brd00:00:00:00:00:00 inet127.0.0.1/8scopehostlo valid_lftforeverpreferred_lftforever 6:eth0@if2:<BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN>mtu1500qdiscnoqueue link/ether02:42:ac:16:10:0abrdff:ff:ff:ff:ff:ff inet'172.22.16.10/24'brd172.22.16.255scopeglobaleth0 valid_lftforeverpreferred_lftforever

    2.第二对接服务器配置如下(基本上类似于第一对接服务器)

    [root@docker02~]#iplinksetens33promiscon#开启混杂模式 [root@docker02~]#iplinkshowens33 2:ens33:<BROADCAST,MULTICAST,'PROMISC',UP,LOWER_UP>mtu1500qdiscpfifo_faststateUPmodeDEFAULTgroupdefaultqlen1000 link/ether00:0c:29:b5:bc:edbrdff:ff:ff:ff:ff:ff [root@docker02~]#dockernetworkcreate-dmacvlan--subnet172.22.16.0/24--gateway=172.22.16.1-oparent=ens33mac_net1 #创建一个与第一台docker服务器的网段、网关相同的macvlan。并绑定到物理网卡上。 #为了可以直观的看出其他docker服务器上的macvlan和第这台是在同一个网段的。所以,建议设置的网络名称一样。 [root@docker02~]#dockerrun-itd--nametest2--ip172.22.16.11--networkmac_net1busybox #运行一个容器,并指定是基于macvlan网络的 #注意,其IP地址不要与其他docker服务器上的容器IP地址冲突

    确认运行容器的IP地址。

    [root@docker02~]#dockerexectest2ipa 1:lo:<LOOPBACK,UP,LOWER_UP>mtu65536qdiscnoqueueqlen1000 link/loopback00:00:00:00:00:00brd00:00:00:00:00:00 inet127.0.0.1/8scopehostlo valid_lftforeverpreferred_lftforever 6:eth0@if2:<BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN>mtu1500qdiscnoqueue link/ether02:42:ac:16:10:0bbrdff:ff:ff:ff:ff:ff inet'172.22.16.11/24'brd172.22.16.255scopeglobaleth0 valid_lftforeverpreferred_lftforever

    对第一个docker服务器上的容器test1和第二个docker服务器上的容器test2执行Ping *** 作


    好了,跨主机的容器通信是通过macvlan实现的。因为使用混杂模式时物理网卡的MAC地址会无效,所以容器无法通过该模式与外网通信。

    示例2(基于macvlan的跨主机网络多网段解决方案)

    取得的效果如下:

  • 两个centos7.3,分别运行docker服务;
  • 每个主机为容器创建了两个MacVlan网段(172.10.16.0/24和172.20.16.0/24);
  • 第一个docker服务器运行容器test1和test2,第二个docker服务器运行容器test3和test4。
  • 最后,跨主机的同一网段的容器可以相互通信。
  • 开始配置:

    1.第一个对接服务器的配置如下

    [root@docker01~]#iplinksetens33promiscon#开启ens33网卡的混杂模式 #也就是开启网卡的多个虚拟interface(接口) [root@docker01~]#iplinkshowens33#确定查看的信息包含以下标红的字样 2:ens33:<BROADCAST,MULTICAST,'PROMISC',UP,LOWER_UP>mtu1500qdiscpfifo_faststateUPmodeDEFAULTgroupdefaultqlen1000 link/ether00:0c:29:9f:33:9fbrdff:ff:ff:ff:ff:ff [root@docker01~]#modinfo8021q #查看是否加载8021q模块,如果有信息返回,则表示该模块已经加载

    modinfo8021q命令返回以下信息

    [root@docker01~]#modprobe8021q#若没有加载8021q模块,则执行此命令 [root@docker01~]#cd/etc/sysconfig/network-scripts/ [root@docker01network-scripts]#vimifcfg-ens33 ................... BOOTPROTO=manual#将此配置项改为“manual”,也是手动的意思 [root@docker01network-scripts]#cp-pifcfg-ens33ifcfg-ens33.10#复制一份网卡配置文件,-p保留原本文件的属性 [root@docker01network-scripts]#vimifcfg-ens33.10 BOOTPROTO=none NAME=ens33.10#注意更改名称 DEVICE=ens33.10#注意更改名称 ONBOOT=yes IPADDR=192.168.10.11#给虚拟网卡设置一个IP PREFIX=24 GATEWAY=192.168.10.2 VLAN=yes [root@docker01network-scripts]#cpifcfg-ens33.10ifcfg-ens33.20 [root@docker01network-scripts]#vimifcfg-ens33.20 BOOTPROTO=none NAME=ens33.20 DEVICE=ens33.20 ONBOOT=yes IPADDR=192.168.20.10#注意,此处的IP与ens33.10并不在同一网段 PREFIX=24 GATEWAY=192.168.20.2 VLAN=yes [root@docker01network-scripts]#ifdownens33;ifupens33#重启网卡,使更改生效 [root@docker01network-scripts]#ifupens33.10#启动该网卡 [root@docker01network-scripts]#ifupens33.20#启动 [root@docker01~]#dockernetworkcreate-dmacvlan--subnet172.10.16.0/24--gateway172.10.16.1-oparent=ens33.10mac_net10 #创建一个macvlan网络,给其定义一个网段、网关及绑定到ens33.10 [root@docker01~]#dockernetworkcreate-dmacvlan--subnet172.20.16.0/24--gateway172.20.16.1-oparent=ens33.20mac_net20 #创建一个macvlan网络,给其定义一个网段、网关及绑定到ens33.20 #接下来分别基于刚刚创建的macvlan网络运行一个容器

    2.第二个docker服务器的配置如下(基本和第一个的 *** 作差不多,注意IP不要冲突)

    [root@docker02~]#iplinksetens33promiscon#开启混杂模式 [root@docker02~]#iplinkshowens33 2:ens33:<BROADCAST,MULTICAST,'PROMISC',UP,LOWER_UP>mtu1500qdiscpfifo_faststateUPmodeDEFAULTgroupdefaultqlen1000 link/ether00:0c:29:b5:bc:edbrdff:ff:ff:ff:ff:ff [root@docker02~]#modinfo8021q 返回信息可参考图一 [root@docker02~]#modprobe8021q#若没有加载8021q模块,则执行此命令 [root@docker02~]#cd/etc/sysconfig/network-scripts/ [root@docker02network-scripts]#vimifcfg-ens33 ...............#省略部分内容 BOOTPROTO=manual [root@docker02network-scripts]#[email protected]:/etc/sysconfig/network-scripts/ifcfg-ens33.*.#要注意后面的“.” ifcfg-ens33.10100%12883.4KB/s00:00 ifcfg-ens33.20100%12475.0KB/s00:00 [root@docker02network-scripts]#vimifcfg-ens33.10 BOOTPROTO=none NAME=ens33.10 DEVICE=ens33.10 ONBOOT=yes IPADDR=192.168.10.11#更改IP,以防和第一台冲突 PREFIX=24 GATEWAY=192.168.10.2 VLAN=yes [root@docker02network-scripts]#vimifcfg-ens33.20 BOOTPROTO=none NAME=ens33.20 DEVICE=ens33.20 ONBOOT=yes IPADDR=192.168.20.11 PREFIX=24 GATEWAY=192.168.20.2 VLAN=yes [root@docker02network-scripts]#ifdownens33;ifupens33#重启网卡,使配置生效 [root@docker02network-scripts]#ifupens33.10#启动网卡 [root@docker02network-scripts]#ifupens33.20 #接下来创建macvlan网络,与第一台docker服务器创建的网络一样 [root@docker02~]#dockernetworkcreate-dmacvlan--subnet172.10.16.0/24--gateway172.10.16.1-oparent=ens33.10mac_net10 [root@docker02~]#dockernetworkcreate-dmacvlan--subnet172.20.16.0/24--gateway172.20.16.1-oparent=ens33.20mac_net20 [root@docker02~]#dockerrun-itd--nametest3--networkmac_net10--ip172.10.16.11busybox [root@docker02~]#dockerrun-itd--nametest4--networkmac_net20--ip172.20.16.21busybox

    此时,可以执行ping测试。如果配置正确,test3应该和test1通信(因为都是基于mac_net10网络);Test4应该与test2通信(以同样的方式)。

    但是test3和test1不能与test4和test2通信(因为它们不基于相同的VLAN)。

    Test3ping容器test1(注:如果使用vmware虚拟机进行测试,由于vmware的特性,需要将其网卡改为“桥模式”而不是NAT模式等。否则无法沟通)


    Test4ping容器test2测试:


    到目前为止,已经实现了跨主机网络的多网段,同样,每个容器也无法与外网通信。如果你有耐心,建议阅读docker官方文档。

    关于Docker容器跨主机多网段通信解决方案的这篇文章到此为止。关于Docker容器跨主机多网段通信的更多信息,请搜索我们之前的文章或者继续浏览下面的相关文章。希望大家以后能多多支持我们!

    欢迎分享,转载请注明来源:内存溢出

    原文地址: http://outofmemory.cn/zz/774397.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2022-05-03
    下一篇 2022-05-03

    发表评论

    登录后才能评论

    评论列表(0条)

    保存