1.macvlan基本介绍
macvlan 允许你在主机的一个网络接口上配置多个虚拟的网络接口,这些网络 interface 有自己独立的 mac 地址,也可以配置上 ip 地址进行通信。macvlan 下的虚拟机或者容器网络和主机在同一个网段中,共享同一个广播域。macvlan 和 bridge 比较相似,但因为它省去了 bridge 的存在,所以配置和调试起来比较简单,而且效率也相对高。除此之外,macvlan 自身也完美支持 VLAN。
如果我们的macvlan 直接基于主机的网卡enp17s0f0,则他会独占主机网卡,也就是说一个网卡只能创建一个 macvlan 网络。
但主机的网卡数量是有限的,因此常规的操作是macvlan来占用网卡的 sub-interface,VLAN 是现代网络常用的网络虚拟化技术,它可以将物理的二层网络划分成多达 4094 个逻辑网络,这些逻辑网络在二层上是隔离的,每个逻辑网络(即 VLAN)由 VLAN ID 区分,VLAN ID 的取值为 1-4094。因此如果需要多个macvlan而又不独占主机网卡,我们就让macvlan来独占网卡的 sub-interface。拓扑图如下所示:
2.创建子网口的方法
基于主机网口enp17s0f0创建二个sub-interface mac1、mac2
创建的格式为 ip link add link <PARENT> <NAME> type macvlan,其中 <PARENT> 是 macvlan 接口的父 interface 名称,<NAME> 是新建的 macvlan 接口的名称,这个名字可以任意取。
命令:ip link add link enp17s0f0 mac1 type macvlan mode bridge; ip link add link enp17s0f0 mac2 type macvlan mode bridge;(使用bridge模式,默认使用的是 vepa 模式。)
注意:macvlan有四种工作模式private 模式、vepa(virtual ethernet port aggregator) 模式(默认模式)、bridge 模式、passthru 模式。
具体四种模式详解请看:
ip link显示结果如下:
3.docker中使用macvlan网络配置
Docker macvlan 是一种跨主机的网络模型,并且只支持 bridge 模式
1)用上文创建的子网卡mac1(macvlan 不仅可以连接到 interface(如 enp17s0f0),也可以连接到 sub-interface,如mac1)来创建容器的macvlan网络mac_net,并且分配网段:docker network create -d macvlan --subnet=192.168.100.0/24 --gateway=192.168.100.1 -o parent=mac1 mac_net
2)创建二个具有相同mac_net网络的容器:mac_net1、mac_net2
docker run -it --net=mac_net --name=mac_net1 75d5c4ea55ce sh
docker run -it --net=mac_net --name=mac_net1 75d5c4ea55ce sh
3)这样容器里面就会有相应的网络,这里查看mac_net1的网络为例:docker exec -it mac_net1 ip a
从图可以看出,容器的ip由docker网络自己分配,容器mac_net1为192.168.100.2 同样方式可以看到容器mac_net2的网络为192.168.100.3
4)从上图的网卡名eth0后的@if4,这表明该 interface 有一个对应的 interface,其全局的编号为 4(包含容器里面的,例如上图28,说明之前27个网络接口已经被占)。根据 macvlan 的原理,我们可以猜测这个 interface 就是主机的enp17s0f0,确认如下:
如图,编号是4的就是主机网卡enp17s0f0。可见,容器的 eth0 就是 enp17s0f0 通过 macvlan 虚拟出来的 interface。容器的 interface 直接与主机的网卡连接,这种方案使得容器无需通过 NAT 和端口映射就能与外网直接通信(只要有网关),在网络上与其他独立主机没有区别。
5)容器间是互通的,可以通过命令docker exec mac_net1 ping 192.168.100.3,可以ping通mac_net2。
注意,只有同一个macvlan网络的二个容器才能通哈!!!具体可以参见另一片文章:
6)此时,我们可以看下mac_net网络的具体信息:docker network inspect mac_net
[
{
"Name": "mac_net",//macvlan网络名称
"Id": "17b3a94b1ae73e8b3c1fb2daa2fd509e144516fa4c0fd196e0068a1ca6756efa",
"Created": "2019-08-31T18:49:19.366345504+08:00",//创建时间
"Scope": "local",
"Driver": "macvlan",//驱动
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.100.0/24",//子网段
"Gateway": "192.168.100.1"//gw
}
]
},
"Internal": false,
"Attachable": false,
"Containers": {//属于macvlan网络mac_net的容器网络信息
"47d3ce9511c83550d3b96e14168666531430b7e24dcbf21eb93ebfa773ea5367": {
"Name": "mac_net1",//容器名
"EndpointID": "69b04111dd1432859039cfff0adef95df9bf73da883c54e2b25fe49b84057b0e",
"MacAddress": "02:42:c0:a8:64:02",//容器网口mac
"IPv4Address": "192.168.100.2/24",//macvlan网络给容器分配的ip
"IPv6Address": ""
},
"d3656ad024e2c10c33649f2a8bf1c6087b63a8891a06cd18e073d022aee12d3f": {
"Name": "mac_net2",
"EndpointID": "7da9f30f4d38ecd894e30d8f36ebbfc6fc0109654ae86cc6b4f5f10695a409e1",
"MacAddress": "02:42:c0:a8:64:03",
"IPv4Address": "192.168.100.3/24",
"IPv6Address": ""
}
},
"Options": {
"parent": "mac1"
},
"Labels": {}
}
]
4.总结
1)macvlan 是一种网卡虚拟化技术,能够将一张网卡虚拟出多张网卡。
2)macvlan 的四种通信模式,常用模式是 bridge。
3)在 Docker 中,macvlan 只支持 bridge 模式。
4)相同 macvlan 可以通信,不同 macvlan 二层无法通信,可以借助三层路由完成通信。