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 二层无法通信,可以借助三层路由完成通信。

docker的macvlan网络相关推荐

  1. 群晖DSM7实现Docker的macvlan

    参考:NAS相关 篇十二:群晖DSM7下,docker中macvlan网络模式配置简单教程 实现macvlan与host网络互通,及互通服务自启动_NAS存储_什么值得买 感谢转身就买大佬,群晖教程本 ...

  2. 使用Docker的macvlan为容器提供桥接网络及跨主机通讯

    对于了解Docker容器网络的朋友,我想对虚拟机的网络也不会陌生,毕竟我们是跟随这个时代一起学习和进步的人.相比VM,Docker的网络也在逐步走向成熟,本文主要针对其中的macvlan做下简单的介绍 ...

  3. Docker容器之macvlan网络

    Docker容器之macvlan网络 一.查看当前dokcer的版本 二.创建macvlan网络 三.查看现有网络类型 四.运行macvlan网络类型的容器 一.查看当前dokcer的版本 [root ...

  4. Docker Macvlan网络实验

    实验环境 虚机 IP 角色 OS docker1 190.100.100.41 docker宿主机 CentOS7.5 docker2 190.100.100.42 docker宿主机 CentOS7 ...

  5. 056、macvlan网络结构分析(2019-03-25 周一)

    参考https://www.cnblogs.com/CloudMan6/p/7383919.html macvlan不依赖linux bridge brctl show 可以确认没有创建新的bridg ...

  6. Docker 跨主机网络方案分析

    PS:文章首发公众号,欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家. 上篇文章介绍了容器网络的单主机网络,本文将进一步介绍多 ...

  7. Docker 自定义容器网络

    CNM&libnetwork libnetwork是Docker团队将Docker的网络功能从Docker的核心代码中分离出来形成的一个单独的库,libnetwork通过插件的形式为Docke ...

  8. Docker中的网络详解

    本节主要是介绍Docker默认的网络行为,包含创建的默认网络类型以及如何创建用户自定义网络,也会介绍如何在单一主机或者跨主机集群上创建网络的资源需求. 1.默认网络 当你安装了docker,她自动创建 ...

  9. Docker 容器的网络连接

    2019独角兽企业重金招聘Python工程师标准>>> 文章首发于公众号<程序员果果> 地址:https://mp.weixin.qq.com/s/DzF-ZwaY4Qt ...

  10. Docker学习之网络篇

    Docker 中的网络功能介绍 Docker 允许通过外部访问容器或容器互联的方式来提供网络服务. 外部访问容器 容器中运行的网络应用,外部要访问这些应用.可以通过-P 或 -p 参数指定端口映射. ...

最新文章

  1. Eclipse导入项目: No projects are found to import
  2. VB 长整型和字节数组的转换问题 (LongByte)
  3. 7 pe系统安装_【软件课程之家】PE系统安装教程
  4. 编程语言里函数方法类型检查的重要性
  5. python热成像_盘点Terabee传感器家族:TOF测距、3D相机、热成像
  6. bulk批量下载影像
  7. 13.相机和图像——缩放和移动是不一样的,移动变焦镜头,镜头并不完美,镜像系统_5
  8. python api调用百度ai平台_Python 百度AI接口调用
  9. MySql中的count函数
  10. 盘点那些改变世界的代码
  11. HTTP错误状态码详解
  12. 八款优秀的 Linux 轻量级 Web 浏览器
  13. 【技巧】pytorch tif转成jpg
  14. 大厂秋招~华为荣耀字节腾讯美团滴滴
  15. 跨站脚本攻击-----为什么要过滤危险字符串
  16. C++ 动态开辟空间
  17. ideaIU_13.1.3安装图解。
  18. 整理全网文档管理平台,持续跟更新
  19. 生鲜超市 学习进阶第三天 xadmin的后台管理
  20. 好玩的Matlab 3D心形代码

热门文章

  1. Unity3D_(插件)小地图自刷新制作Minimap小地图
  2. Spring read-only=true 只读事务的一些概念
  3. 38.线程交换与线程移动
  4. VB中PictureBox控件使用教程
  5. java中的控制执行流程
  6. 英语六级翻译训练:教育专题
  7. Linux查看某个进程的磁盘IO读写情况
  8. python之 模块与包
  9. Android 退出app,后台推送的服务也停止了,怎么可以做到不停止后台服务呢?
  10. 总编下午茶:技术老男人的创业经