参考博客:https://blog.csdn.net/daye5465/article/details/77412619

一、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 系统环境

    hostname hostip kernel
docker2 172.16.200.218 4.15.7-1.el7.elrepo.x86_64
docker3 172.16.200.223 4.15.7-1.el7.elrepo.x86_64

  2.2 Bridge Macvlan

  1. 两台机器都做同样的操作

docker network create -d macvlan \
> --subnet=172.16.30.1/24 \
> --gateway=172.16.30.1 \
> -o parent=eno16777736 \
> my-macvlan-net # -d macvlan : 创建macvlan网络
# subnet : 子网
# gateway: 网关
# -o parent=eno16777736 :桥接到网卡(名称为自己机器的网卡名称)
# my-macvlan-net :新建的macvlan 网络的名称

  

  查看:

  

  

  2. 创建容器测试联通 

单机使用macvlan创建容器测试联通

# docker 2

docker run -it --net my-macvlan-net --ip=172.16.30.9 busybox

docker run -it --net my-macvlan-net --ip=172.16.30.10 busybox

# 测试联通
/ # ping 172.16.30.10
PING 172.16.30.10 (172.16.30.10): 56 data bytes
64 bytes from 172.16.30.10: seq=0 ttl=64 time=0.168 ms
64 bytes from 172.16.30.10: seq=1 ttl=64 time=0.048 ms
64 bytes from 172.16.30.10: seq=2 ttl=64 time=0.057 ms # 联通没有问题

  

  3. macvlan网络

  

  ① 查看C1和C2的网络设备

  

  除了lo,两个容器中都有一个eth0,并且后面都有@if2。这表明该 interface 有一个对应的 interface,其全局的编号为 4。Macvlan就是在物理网卡上虚拟出来新的虚拟网卡,所以有理由认为这个interface就是eno16777736(我本机网卡名称)

  ② 确认网卡

  

  可见eth0 就是 eno16777736 通过macvlan虚拟出来的interface。

  ③ 数据传输

  连接在虚拟网卡上的C1和C2同属于一个vlan(macvlan技术),它们之间传输数据不需要经过网关(路由),是通过二层转发,此时的物理网卡就相当于交换机。

  事实上,网关容器也ping不同(不用经过网关)。

  

  

  4. 双机macvlan联通

  在docker3这台机器上已经创建macvlan的网络 

# docker 3

[root@docker3 ~]# docker run -it --net my-macvlan-net --ip=172.16.30.11 busybox

/ # ping 172.16.30.10
PING 172.16.30.10 (172.16.30.10): 56 data bytes
64 bytes from 172.16.30.10: seq=0 ttl=64 time=0.552 ms
c64 bytes from 172.16.30.10: seq=1 ttl=64 time=0.169 ms
64 bytes from 172.16.30.10: seq=2 ttl=64 time=0.189 ms

  

  3个容器间都可以相互ping同,和上面讲的差不多,物理网卡相当于交换机,都是vlan间数据传输,只是外部多加了一个交换机。这和交换机的vlan有点类似:

   

  但交换机做的vlan,交换机和交换机之间接口要做trunk,才允许vlan数据包通过。而Macvlan是根据MAC地址来划分vlan的,并不需要设置trunk。

  注:容器并不能ping同网关、物理网卡地址和外网地址,这是macvlan自身安全性和隔离性的体现,并不是docker容器的原因。

三、用子接口实现多macvlan网络

  Macvlan 会独占主机的网卡,也就是说网卡只能创建一个macvlan网络:

[root@docker3 ~]# docker network create -d macvlan --subnet=172.16.90.0/24 --gateway=172.16.90.1 -o parent=eno16777736 my-macvlan-net2
Error response from daemon: network dm-d6a68779842b is already using parent interface eno16777736 # 再在同一个网卡上创建macvlan网络,就报错了

  主机的网卡数量有限,但是macvlan不仅可以连接到interface,也可以连接到sub-interface(如:eno16777736.xxx)

  一个网络接口可以创建的子接口数量为4094

先删除原本的macvlan网络

docker network rm my_macvlan_net

  

  1. 创建子接口 

[root@docker3 ~]# ip link add link eno16777736 name eno16777736.100 type vlan id 100

[root@docker3 ~]# ip link add link eno16777736 name eno16777736.101 type vlan id 101
[root@docker3 ~]# ifconfig

  

  如果这两个子接口没有起来,重启一下服务器

  2. 根据子接口创建macvlan网络 

[root@docker3 ~]# docker network create -d macvlan \
> --subnet=172.16.100.0/24 \
> --gateway=172.16.100.1 \
> -o parent=eno16777736.100 \
> macvlan_net100 # parent 选择刚创建的子接口

  3. 根据新的macvlan网络创建容器  

[root@docker3 ~]# docker run -it --net macvlan_net100 --name box1 --ip=172.16.100.11 busybox

[root@docker3 ~]# docker run -it --net macvlan_net100 --name box2 --ip=172.16.100.12 busybox

  4. 测试网络连通  

[root@docker3 ~]# docker exec box1 ping 172.16.100.12
PING 172.16.100.12 (172.16.100.12): 56 data bytes
64 bytes from 172.16.100.12: seq=0 ttl=64 time=0.157 ms
64 bytes from 172.16.100.12: seq=1 ttl=64 time=0.059 ms
64 bytes from 172.16.100.12: seq=2 ttl=64 time=0.047 ms
64 bytes from 172.16.100.12: seq=3 ttl=64 time=0.048 ms

  表明在同一台机器上,同一个子接口下的vlan中的设备是互通的

  5.测试不同子接口下vlan间的互通

  其实vlan间默认单播不能直接通信,如果想要通信需要三层路由。Macvlan也是如此:

  创建子接口101的容器(先创建macvlan_net101网络)  

docker run -it --name box3 --net macvlan_net101 --ip 172.16.101.10 busybox

docker run -it --name box4 --net macvlan_net101 --ip 172.16.101.9 busybox

  测试:

[root@docker3 ~]# docker exec box3 ping 172.16.101.9
PING 172.16.101.9 (172.16.101.9): 56 data bytes
64 bytes from 172.16.101.9: seq=0 ttl=64 time=0.223 ms
64 bytes from 172.16.101.9: seq=1 ttl=64 time=0.050 ms
64 bytes from 172.16.101.9: seq=2 ttl=64 time=0.050 ms
64 bytes from 172.16.101.9: seq=3 ttl=64 time=0.052 ms
64 bytes from 172.16.101.9: seq=4 ttl=64 time=0.052 ms
^C
[root@docker3 ~]# docker exec box3 ping 172.16.100.11
^C # 可以看出同一个vlan中的容器是可以直接通信的 # 不同vlan即不同子接口下的容器不能直接通信

  6.多主机间多子接口通信  

  多机间Macvlan子接口vlan通信和 Macvlan Bridge是一样的,同一个vlan间的容器是可以互访的,不同子接口下即不同vlan间默认不能直接通信。

  在docker2上面也创建两个子接口100和101 ,其实重复docker3的操作

  创建两个容器,分别属于vlan100 和 vlan 101

[root@docker2 ~]# docker run -itd --name box21 --net macvlan_net100 --ip 172.16.100.21 busybox
3934bc62132d4cd8dec9a1cfae64f36ac2d056013a53c5d73a3345afaefee482 [root@docker2 ~]# docker run -itd --name box22 --net macvlan_net101 --ip 172.16.101.22 busybox
2e1c223ae54d430d6c6808fd89b5db8488591edf7c799ec6bd57cb40c2fff421 # box21 : vlan100 172.16.100.21 # box22: vlan101 172.16.101.22

  测试双机间的互联: 

root@docker2 ~]# docker exec box21 ping 172.16.100.11
PING 172.16.100.11 (172.16.100.11): 56 data bytes
64 bytes from 172.16.100.11: seq=0 ttl=64 time=4.585 ms
64 bytes from 172.16.100.11: seq=1 ttl=64 time=0.198 ms
64 bytes from 172.16.100.11: seq=2 ttl=64 time=0.205 ms
64 bytes from 172.16.100.11: seq=3 ttl=64 time=0.225 ms
^C [root@docker2 ~]# docker exec box21 ping 172.16.101.22 ^C
[root@docker2 ~]# docker exec box22 ping 172.16.101.9
PING 172.16.101.9 (172.16.101.9): 56 data bytes
64 bytes from 172.16.101.9: seq=0 ttl=64 time=4.789 ms
64 bytes from 172.16.101.9: seq=1 ttl=64 time=0.197 ms
64 bytes from 172.16.101.9: seq=2 ttl=64 time=0.182 ms
^C # 上述显示 双机间同vlan 间可以相互通信 # 不同vlan间不能直接通信

Docker Macvlan的更多相关文章

  1. Docker Macvlan 介绍 or 工作原理

    Docker Macvlan Network Macvlan Network:属于Docker的网络驱动. Macvlan Network:Docker主机网卡接口逻辑上分为多个子接口,每个子接口标识 ...

  2. Docker Macvlan 应用部署

    Docker Macvlan 应用部署 MacVLAN有两种桥接模式 Bridge模式:不创建子接口的情况下直接去桥接物理接口.直接桥接到与宿主级的同网段. VLAN Bridge模式:创建子接口去桥 ...

  3. [docker] macvlan最佳实战

    macvlan和ipvlan的对比 http://hicu.be/macvlan-vs-ipvlan macvlan ipvlan 参考: https://yq.aliyun.com/articles ...

  4. [docker]macvlan实现双vlan互通

    关于vlan的冷知识 vlan范围:0~4095 0,4095 保留 仅限系统使用 用户不能查看和使用这些VLAN 1 正常 Cisco默认VLAN 用户能够使用该VLAN,但不能删除它 2-1001 ...

  5. Docker Macvlan网络部署

    Macvlan Bridge模式 节点1创建 docker network create -d macvlan --subnet=172.100.1.0/24 --gateway=172.100.1. ...

  6. (转) docker跨主机 macvlan 网络配置

    原文链接 https://github.com/alfredhuang211/study-docker-doc/blob/master/docker%E8%B7%A8%E4%B8%BB%E6%9C%B ...

  7. Docker 网络模型之 macvlan 详解,图解,实验完整

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 上一篇文章我们 ...

  8. Docker 运维高级应用管理

     Docker 基本应用 1.Docker 介绍及安装 2.Docket 使用命令 3.Docker run命令参数整理 4.Docker 构建镜像 Docker Compose 高级应用 1.Doc ...

  9. GitHub: Oracle RAC Database on Docker 未测试 改天试试

    https://github.com/oracle/docker-images/blob/master/OracleDatabase/RAC/OracleRealApplicationClusters ...

随机推荐

  1. 使用SSD目标检测c++接口编译问题解决记录

    本来SSD做测试的Python接口用起来也是比较方便的,但是如果部署集成的话,肯定要用c++环境,于是动手鼓捣了一下. 编译用的cmake,写的CMakeList.txt,期间碰到一些小问题,简单记录 ...

  2. Python之并发编程-多进程

    目录 一.multiprocessiong模块介绍 二.Process类的介绍 三.进一步介绍(守护进程.锁.队列.管道.事件等) 1.守护进程 2.锁(同步锁.互斥锁) 3.信号量(了解) 4.队列 ...

  3. 第二阶段Sprint3

    昨天:查看资料,开始视频录制部分的代码实现 今天:事实现保存到指定路径,并能够选择播放 遇到的问题:自动生成文件名,是否需要自己命名?怎么实现?

  4. Leetcode题库——4.寻找两个有序数组的中位数

    @author: ZZQ @software: PyCharm @file: findMedianSortedArrays.py @time: 2018/10/10 19:24 说明:给定两个大小为 ...

  5. asp.net如何隐藏表格(table)的一行

    直接用jquery $("#id1").click(function(){ $("#trId").css("display""no ...

  6. 信息安全C散列函数的应用及其安全性2016011992

    1:散列函数的具体应用 使用一个散列函数可以很直观的检测出数据在传输时发生的错误. MD5 Hash算法的"数字指纹"特性,使它成为目前应用最广泛的一种文件完整性校验(Checks ...

  7. 基于windowsphone7的控制ppt播放

    最近突然想起了一个学长的一个利用手机控制ppt播放的一个创意,并想将其在windows phone7上实现一下. 经过几天的努力已经可以控制ppt的播放,暂停,上一张,下一张了,并且电脑会将当前ppt ...

  8. Beta阶段DAY2

    一.提供当天站立式会议照片一张 二.每个人的工作 1.讨论项目每个成员的昨天进展 刘阳航:删除多余按钮,调整界面. 林庭亦:删除麻烦的颜色设置. 郑子熙:添加新增按钮. 陈文俊:重新规划面板及功能. ...

  9. httpstat的简单使用

    httpstat 应该是一个 python 封装后的 curl 工具能够展现 一些客户端连接网站的时间消耗,最近在看tls 感觉挺有用处的 简单学习一下 1. centos7 安装python 和 p ...

  10. yii2微博第三方登录

    原作者:杜文建 原博客:http://www.cnblogs.com/dwj97/p/6530568.html yii2微博第三方登录   微博登录是最常用的第三方账号登录之一.由于其网站用户量大,可 ...