参考博客: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. BugPhobia开发篇章:Alaph阶段Scurm Meeting

    [github]   https://github.com/bugphobia/XuebaOnline 0x01 :目录与摘要 If you weeped for the missing sunset ...

  2. Daily Scrum (2015/11/4)

    因为距离部署的时间临近,而之前我们的进度偏慢.这天晚上我们大多数成员几乎所有时间都用在了这个项目上,成果还算令人满意. 成员 今日任务 时间 明日任务 符美潇 1.修复了一个BUG,此BUG会导致所爬 ...

  3. C++:模板——函数模板1

    一.为什么使用函数模板 假设我们在程序中需要比较两个变量的大小,但变量的类型可能是int.float或者double,此时为了满足程序的要求我们可能会在程序中编写多个函数,如: //比较两个int型变 ...

  4. 1001. A+B Format (20)题解

    git链接 作业描述 Calculate a + b and output the sum in standard format -- that is, the digits must be sepa ...

  5. Alpha版本冲刺(四)

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:丹丹 组员7:何家伟 组员8:政演 组员9:鸿杰 组员10:刘一好 组员:何宇恒 展示组内最新 ...

  6. 深入理解Java虚拟机 &GC分代年龄

    堆内存 Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象.在 Java 中,堆被划分成两个不同的区域:新生代 ( Young ).老年代 ( Old ).新生代 ( ...

  7. web.config文件详解[转]

    一).Web.Config是以XML文件规范存储,配置文件分为以下格式1.配置节处理程序声明特点: 位于配置文件的顶部,包含在<configSections>标志中.2.特定应用程序配置特 ...

  8. QPainter 基础绘图

    调用QPainter的接口来绘制一些基本的图形 头文件: #include <QMainWindow> #include <QPainter> namespace Ui { c ...

  9. Visual Categorization with Bags of Keypoints

    1.Introduction and backgrounds 作为本周的论文之一,这是一篇bag of features的基本文章之一,主要了解其中的基本思路,以及用到的基本技术,尽量使得细节更加清楚 ...

  10. 查看MySQL最近执行的语句

    首先登入MySQL. Reading table information for completion of table and column names You can turn off this ...