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

发布时间:2020-06-29 19:21:15 作者:warrent
来源:网络 阅读:1699

一、MacVlan的概念

实现Docker的跨主机网络通信的方案有很多,比如在之前博文中写到的通过部署consul服务实现Docker容器跨主机通信 ,而这篇博文将Macvlan写下来

Macvlan工作原理:

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

使用Macvlan有几点需要注意:

工作示意图如下:

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

二、配置实例

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

实现效果:

开始配置:
(1)第一台docker服务器配置如下:

[root@docker ~]# ip link set ens33 promisc on    #开启ens33网卡的混杂模式。
#也就是开启网卡的多个虚拟interface(接口)  
[root@docker ~]# ip link show ens33    #确定查看的信息包含以下标红的字样
2: ens33: <BROADCAST,MULTICAST,'PROMISC',UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether 00:0c:29:2f:89:cb brd ff:ff:ff:ff:ff:ff
[root@docker ~]# docker network create -d macvlan --subnet 172.22.16.0/24 --gateway 172.22.16.1 -o parent=ens33 mac_net1
#创建macvlan网络,指定网段、网关等信息,“-o”指定绑定在哪张网卡之上
[root@docker ~]# docker run -tid --name box1 --ip 172.22.16.10 --network mac_net1 busybox
#基于新创建的macvlan网络运行一个容器,并指定其IP。

确认运行的容器的IP地址:
Docker容器跨主机多网段通信解决方案
(1)第二台docker服务器配置如下(与第一台docker服务器的配置基本相似):

[root@docker02 ~]# ip link set ens33 promisc on      #开启ens33网卡的混杂模式。
[root@docker02 ~]#  ip link show ens33      #确定查看的信息包含以下标红的字样
2: ens33: <BROADCAST,MULTICAST,'PROMISC',UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether 00:0c:29:c6:57:bc brd ff:ff:ff:ff:ff:ff
[root@docker02 ~]# docker network create -d macvlan --subnet 172.22.16.0/24 --gateway=172.22.16.1 -o parent=ens33 mac_net1
#创建一个与第一台docker服务器的网段、网关相同的macvlan。并绑定到物理网卡上。
#为了可以直观的看出其他docker服务器上的macvlan和第这台是在同一个网段的。
#所以,建议设置的网络名称一样。
[root@docker02 ~]# docker run -tid --name box2 --ip 172.22.16.11 --network mac_net1 busybox
#运行一个容器,并指定是基于macvlan网络的
#注意,其IP地址不要与其他docker服务器上的容器IP地址冲突

确认运行的容器的IP地址:
Docker容器跨主机多网段通信解决方案

使用第二台docker服务器上的容器box2对第一台docker服务器上的容器box1进行ping测试:

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

OK,跨主机的容器通信就通过macvlan实现了。由于使用混杂模式会造成物理网卡的MAC地址失效,所以容器并不能通过此模式进行与外网的通信。

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

实现的效果如下:

开始配置:
(1)第一台docker服务器配置如下:

[root@docker ~]# ip link set ens33 promisc on    #开启ens33网卡的混杂模式。
#也就是开启网卡的多个虚拟interface(接口)  
[root@docker ~]# ip link show ens33    #确定查看的信息包含以下标红的字样
2: ens33: <BROADCAST,MULTICAST,'PROMISC',UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether 00:0c:29:2f:89:cb brd ff:ff:ff:ff:ff:ff
[root@docker ~]# modinfo 8021q    #查看是否加载8021q模块,如果有信息返回,则表示该模块已经加载

modinfo 8021q命令返回的信息如下:
Docker容器跨主机多网段通信解决方案

[root@docker ~]# modprobe 8021q     #若没有加载8021q模块,则执行此命令
[root@docker ~]# cd /etc/sysconfig/network-scripts/
[root@docker network-scripts]# vim ifcfg-ens33     #更改物理网卡配置
            ...............#省略部分内容
BOOTPROTO=manual        #将此配置项该为“manual”,也是手动的意思
            ...............#省略部分内容
#更改完成后,保存退出即可
[root@docker network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33.10   #将网卡配置文件复制一份
# “-p”表示保留文件原本的属性
[root@docker network-scripts]# vim ifcfg-ens33.10     #更改复制出来的配置文件如下

BOOTPROTO=none
NAME=ens33.10       #注意更改名称
DEVICE=ens33.10     #注意更改名称
ONBOOT=yes
IPADDR=192.168.10.10    #给虚拟网卡设置一个IP
PREFIX=24
GATEWAY=192.168.10.2
VLAN=yes
#更改完成后,保存退出即可,注意,以上的IP与容器将要使用的IP并不是同一网段
[root@docker network-scripts]# cp ifcfg-ens33.10 ifcfg-ens33.20
[root@docker network-scripts]# vim ifcfg-ens33.20    #编辑如下
BOOTPROTO=none
NAME=ens33.20       #注意更改名称
DEVICE=ens33.20       #注意更改名称
ONBOOT=yes
IPADDR=192.168.30.10    #注意,此处的IP与ens33.10并不在同一网段
PREFIX=24
GATEWAY=192.168.30.2
VLAN=yes
#更改完成后,保存退出即可 
[root@docker network-scripts]# ifdown ens33;ifup ens33   #重启网卡,使更改生效
[root@docker network-scripts]# ifup ens33.10    #开启ens33.10
[root@docker network-scripts]# ifup ens33.20    #开启ens33.20
[root@docker ~]# docker network create -d macvlan --subnet 172.10.16.0/24 --gateway 172.10.16.1 -o parent=ens33.10 mac_net10
#创建一个macvlan网络,给其定义一个网段、网关及绑定到ens33.10
[root@docker ~]# docker network create -d macvlan --subnet 172.20.16.0/24 --gateway 172.20.16.1 -o parent=ens33.20 mac_net20
#创建一个macvlan网络,给其定义一个网段、网关及绑定到ens33.20
#接下来分别基于刚刚创建的macvlan网络运行一个容器
[root@docker ~]# docker run -itd --name bbox1 --network mac_net10 --ip 172.10.16.10 busybox
#基于网络mac_net10运行一个容器,并指定其IP
[root@docker ~]# docker run -itd --name bbox2 --network mac_net20 --ip 172.20.16.20 busybox
#基于网络mac_net10运行一个容器,并指定其IP

(2)第二台docker服务器配置如下(基本与第一台操作类似,只是要注意IP不要冲突):

[root@docker02 ~]# ip link set ens33 promisc on    #开启ens33网卡的混杂模式。
#也就是开启网卡的多个虚拟interface(接口)  
[root@docker02 ~]# ip link show ens33    #确定查看的信息包含以下标红的字样
2: ens33: <BROADCAST,MULTICAST,'PROMISC',UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether 00:0c:29:2f:89:cb brd ff:ff:ff:ff:ff:ff
[root@docker02 ~]# modinfo 8021q    #查看是否加载8021q模块,如果有信息返回,则表示该模块已经加载

modinfo 8021q命令返回的信息如下:
Docker容器跨主机多网段通信解决方案

[root@docker02 ~]# modprobe 8021q     #若没有加载8021q模块,则执行此命令
[root@docker02 ~]# cd /etc/sysconfig/network-scripts/
[root@docker02 network-scripts]# vim ifcfg-ens33     #更改物理网卡配置
            ...............#省略部分内容
BOOTPROTO=manual        #将此配置项该为“manual”,也是手动的意思
            ...............#省略部分内容
#更改完成后,保存退出即可
[root@docker02 network-scripts]# scp root@192.168.20.7:/etc/sysconfig/network-scripts/ifcfg-ens33.* .
#将第一台docker服务器上的虚拟网卡配置文件复制过来

root@192.168.20.7 s password:         #输入第一台docker服务器的用户密码
ifcfg-ens33.10                 100%  117     0.1KB/s   00:00    
ifcfg-ens33.20                 100%  117     0.1KB/s   00:00    
[root@docker02 network-scripts]# vim ifcfg-ens33.10    #只是更改其IP即可

BOOTPROTO=none
NAME=ens33.10
DEVICE=ens33.10
ONBOOT=yes
IPADDR=192.168.10.11      #更改IP是为了不要和第一台docker服务器的虚接口IP冲突
PREFIX=24
GATEWAY=192.168.10.2
VLAN=yes
[root@docker02 network-scripts]# vim ifcfg-ens33.20       #同上

BOOTPROTO=none
NAME=ens33.20
DEVICE=ens33.20
ONBOOT=yes
IPADDR=192.168.30.11    #更改其IP地址
PREFIX=24
GATEWAY=192.168.30.2
VLAN=yes
[root@docker02 network-scripts]# ifdown ens33;ifup ens33   #重启网卡,使更改生效
[root@docker02 network-scripts]# ifup ens33.10   #启动ens33.10
[root@docker02 network-scripts]# ifup ens33.20   #启动ens33.20
#接下来创建macvlan网络,与第一台docker服务器创建的网络一样
[root@docker02 ~]# docker network create -d macvlan --subnet 172.10.16.0/24 --gateway 172.10.16.1 -o parent=ens33.10 mac_net10
[root@docker02 ~]# docker network create -d macvlan --subnet 172.20.16.0/24 --gateway 172.20.16.1 -o parent=ens33.20 mac_net20
#接下来基于刚刚创建的网络运行两个容器
#基于mac_net10运行容器bbox3
[root@docker02 ~]# docker run -tid --name bbox3 --network mac_net10 --ip 172.10.16.11 busybox
#基于mac_net20运行容器bbox4
[root@docker02 ~]# docker run -itd --name bbox4 --network mac_net20 --ip 172.20.16.21 busybox

配置至此,即可进行ping测试了,如果配置无误,则bbox3应该和bbox1互通(因为其都是基于mac_net1010网络);bbox4应该和bbox2互通(同理)。

但bbox3和bbox1不能和bbox4和bbox2互通(因为其不是基于同一个虚拟局域网)。

容器bbox3 ping 容器bbox1测试(注意:若是使用vmware虚拟机进行测试,由于vmware的特性,需将其网络适配器改为“桥接模式”,而不是NAT模式等。否则无法通信)
Docker容器跨主机多网段通信解决方案

容器bbox4 ping 容器bbox2测试:
Docker容器跨主机多网段通信解决方案

至此,跨主机网络多网段已经实现,同样,各个容器无法与外网进行通信。

docker网络是一个比较复杂的概念,若有耐心,还是建议阅读docker官方文档

———————— 本文至此结束,感谢阅读 ————————

推荐阅读:
  1. docker之docker容器flannel模式多网段跨主机
  2. etcd和flannel实现docker多网段通信

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

docker的macvlan网络 docker容器实现多网络多网段通信 dock

上一篇:nagios监控安装及设置案例

下一篇:jsp 页面的9个隐含对象

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》