Docker Macvlan 应用部署

交换机的vlan是根据端口来划分的,如果一个PC接入vlan10的端口它就在vlan10中,否则就在其他vlan中。而 MAC VLAN 则可以有效解决这个问题,它根据 终端设备的 MAC 地址来划分 VLAN。这样,即使用户改变了接入端口,也仍然处在原 VLAN 中。

  macvlan 允许你在主机的一个网络接口上配置多个虚拟的网络接口,这些网络 interface 有自己独立的 mac 地址,也可以配置上 ip 地址进行通信。macvlan 下的虚拟机或者容器网络和主机在同一个网段中,共享同一个广播域。macvlan 和 bridge 比较相似,但因为它省去了 bridge 的存在,所以配置和调试起来比较简单,而且效率也相对高。除此之外,macvlan 自身也完美支持 VLAN。

       同一Vlan间数据传输是通过二层互访,即mac地址实现的,不需要使用路由。不同vlan的用户单播默认不能直接通信,如果想要通信,还需要三层设备做路由,Macvlan也是如此。用Macvlan技术虚拟出来的虚拟网卡,在逻辑上和物理网卡是对等的。物理网卡也就相当于一个交换机,记录着对应的虚拟网卡和MAC地址,当物理网卡收到数据包后,会根据目的mac地址判断这个包属于哪一个虚拟网卡。

1.1 条件

  1. Macvlan是Linux内核支持的网络接口。要求的Linux内部版本是v3.9–3.19和4.0+。
  2. 大多数云服务商限制了macvlan。确保自身的网络设备可以使用
  3. 只适合在linux服务器上运行。Mac和windows版本的Docker并不支持,在Windows Server中Docker EE也不支持
  4. 请将网卡名称 eth0 改成自己的网卡名称

  1.2 工作原理

  1. 通过为物理网卡创建Macvlan子接口,允许一块物理网卡拥有多个独立的MAC地址和IP地址。虚拟出来的子接口将直接暴露在底层物理网络中。从外界看来,就像是把网线分成多股,分别接到了不同的主机上一样。
  2. 物理网卡收到包后,会根据收到包的目的MAC地址判断这个包需要交给哪个虚拟网卡。

  1.3 工作模式

  • VEPA(Virtual Ethernet Port Aggregator)mode:需要主接口连接的交换机支持 VEPA/802.1Qbg 特性。所有发送出去的报文都会经过交换机,交换机作为再发送到对应的目标地址(即使目标地址就是主机上的其他 macvlan 接口),也就是 hairpin mode 模式,这个模式用在交互机上需要做过滤、统计等功能的场景。
  • Brideg mode: 常用  通过虚拟的交换机将主接口的所有 macvlan 接口连接在一起,这样的话,不同 macvlan 接口之间能够直接通信,不需要将报文发送到主机之外。这个模式下,主机外是看不到主机上 macvlan interface 之间通信的报文的
  • Private mode: 过滤掉所有来自其他 macvlan 接口的报文,因此不同 macvlan 接口之间无法互相通信
  • Passthru mode:

配置Docker Macvlan

2.1 系统环境

节点 IP  kernel
macvlan-01 192.168.1.221 3.10.0-693.el7.x86_64
macvlan-02 192.168.1.222 3.10.0-693.el7.x86_64

MacVLAN有两种桥接模式

  • Bridge模式:不创建子接口的情况下直接去桥接物理接口。直接桥接到与宿主级的同网段。
  • VLAN Bridge模式:创建子接口去桥接物理接口。可划分多个VLAN。

Macvlan Bridge模式 容器专属网络                  

1、节点1节点2操作:创建macvlan网络

[root@macvlan-01 ~]# docker network create -d macvlan --subnet=172.100.1.0/24 --gateway=172.100.1.1 -o parent=ens33 macvlan_net
1fba93fda898ed05dc1356f0d469e72d872c33ef5a6ea27fa5e7ed75dfd41b25
docker network create 创建网络
-d 指定网络驱动程序为macvlan
--subnet 指定一个子网段
--gateway 指定网关
-o parent=ens33 指定宿主接口
macvlan_net 自定义网络名称

命令解析
[root@macvlan-01 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
4a571c4dae3e        bridge              bridge              local
03cf5e32ed93        host                host                local
1fba93fda898        macvlan_net         macvlan             local
2f461342dd7b        none                null                local
[root@macvlan-2 ~]# docker network create -d macvlan --subnet=172.100.1.0/24 --gateway=172.100.1.1 -o parent=ens33 macvlan_net
cd740b4417662283b8e4c70d96426ab9d995eac111a15df111b5110c84cfc699
[root@macvlan-2 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
a8f47ed48090        bridge              bridge              local
7c0c22cca61d        host                host                local
cd740b441766        macvlan_net         macvlan             local
904ed969c396        none                null                local

注:如果需要访问外网,需要将网络设置为与宿主级相同网络下。

注:本地不可访问,因为桥接的本地网络。

注:单个网卡只能绑定一次如重复添加会报如下错误。

# ens33网卡已被绑定,不多次绑定。
Error response from daemon: network dm-0a48ab454840 is already using parent interface ens33

# 删除绑定网卡网络集
docker network rm ID号

测试通信

[root@macvlan-01 ~]# docker run -it --net macvlan_net --ip=172.100.1.10 busybox
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
322973677ef5: Pull complete 
Digest: sha256:1828edd60c5efd34b2bf5dd3282ec0cc04d47b2ff9caa0b6d4f07a21d1c08084
Status: Downloaded newer image for busybox:latest
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:64:01:0A  
          inet addr:172.100.1.10  Bcast:172.100.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:65 errors:0 dropped:11 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:4032 (3.9 KiB)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

/ # ping 172.100.1.11
PING 172.100.1.11 (172.100.1.11): 56 data bytes
64 bytes from 172.100.1.11: seq=0 ttl=64 time=0.542 ms
64 bytes from 172.100.1.11: seq=1 ttl=64 time=0.516 ms
64 bytes from 172.100.1.11: seq=2 ttl=64 time=0.547 ms
64 bytes from 172.100.1.11: seq=3 ttl=64 time=0.951 ms
64 bytes from 172.100.1.11: seq=4 ttl=64 time=1.417 ms
^C
--- 172.100.1.11 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 0.516/0.794/1.417 ms
/ # 
[root@macvlan-2 ~]# docker run -it --net macvlan_net --ip=172.100.1.11 busybox
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
322973677ef5: Pull complete 
Digest: sha256:1828edd60c5efd34b2bf5dd3282ec0cc04d47b2ff9caa0b6d4f07a21d1c08084
Status: Downloaded newer image for busybox:latest
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:64:01:0B  
          inet addr:172.100.1.11  Bcast:172.100.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:10 errors:0 dropped:2 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:624 (624.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

/ # ping 172.100.1.10
PING 172.100.1.10 (172.100.1.10): 56 data bytes
64 bytes from 172.100.1.10: seq=0 ttl=64 time=3.031 ms
64 bytes from 172.100.1.10: seq=1 ttl=64 time=1.223 ms
64 bytes from 172.100.1.10: seq=2 ttl=64 time=0.921 ms
64 bytes from 172.100.1.10: seq=3 ttl=64 time=0.683 ms
^C
--- 172.100.1.10 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.683/1.464/3.031 ms
/ # 

Macvlan VLAN Bridge模式 容器专属网络              

1、节点1节点2操作:创建一个VLAN,VLAN ID 50

节点1
[root@localhost ~]# ip link add link ens33 name ens33.50 type vlan id 50
[root@localhost ~]# systemctl restart docker
节点2
[root@localhost ~]# ip link add link ens33 name ens33.50 type vlan id 50
[root@localhost ~]# systemctl restart docker

2、节点1节点2操作:创建Macvlan网络

节点1
[root@localhost ~]# docker network create -d macvlan --subnet=172.99.0.0/24 --gateway=172.99.0.1 -o parent=ens33.50 macvlan_net99
5f98cb03e8eea0899ee8e5a04258b5a7a895d0f9455e9bef572a22a215592798
docker network create 创建网络
-d 指定网络驱动程序为macvlan
--subnet 指定一个子网段
--gateway 指定网关
-o parent=ens33 指定宿主接口
macvlan_net99 自定义网络名称

命令解析
[root@localhost ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
d44397fdd827        bridge              bridge              local
03cf5e32ed93        host                host                local
5f98cb03e8ee        macvlan_net99       macvlan             local
2f461342dd7b        none                null                local
节点2
[root@localhost ~]# docker network create -d macvlan --subnet=172.99.0.0/24 --gateway=172.99.0.1 -o parent=ens33.50 macvlan_net99
53715dd1fcd5db475770e9f091c757f720c5fa65a837217246afa82fe3e2fa14
[root@localhost ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
01893ed0bb21        bridge              bridge              local
7c0c22cca61d        host                host                local
53715dd1fcd5        macvlan_net99       macvlan             local
904ed969c396        none                null                local

3、测试互通

posted @ 2019-12-26 14:54  星火撩原  阅读(962)  评论(0编辑  收藏  举报