docker的macvlan网络

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 模式。
具体四种模式详解请看:https://blog.csdn.net/hzj_001/article/details/100182686
   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网络的二个容器才能通哈!!!具体可以参见另一片文章:https://blog.csdn.net/hzj_001/article/details/100184298
       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 二层无法通信,可以借助三层路由完成通信。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值