Docker- 7.1、跨主机网络-macvlan

news2024/12/23 5:14:31

一、macvlan介绍

macvlan 本身是 linxu kernel 模块,其功能是允许在同一个物理网卡上配置多个 MAC 地址而实现虚拟多块网卡,即多个 interface,每个 interface 可以配置自己的IP。macvlan 本质上是一种网卡虚拟化技术
macvlan 的最大优点是性能极好,相比其他实现,macvlan不需要创建Linux bridge,而是直接通过以太interface连接到物理网络。
 

二、准备实验环境

使用hosts1 和 hosts2上单独的网卡ens33 创建macvlan。
1、为保证多个 MAC 地址的网络包都可以从 ens33 通过,我们需要打开物理网卡的混杂模式:
ip link set ens33 promisc on
或者
ens33 开启混杂模式ifconfig ens33 promisc
ens33 关闭混杂模式ifconfig ens33 -promisc
2、macvlan 是 Linux 内核提供的一种网络驱动类型。如果内核没有加载 macvlan,可以通过命令加载:
   modprobe macvlan # 加载macvlan;可用于判断系统是否支持macvlan;若要卸载 macvlan:modprobe -r macvlan
   lsmod | grep macvlan # 确认是否已加载
如果第一个命令报错,或者第二个命令没有返回,说明当前系统不支持 macvlan,需要升级内核。
 

三、相同 macvlan 网络之间的通信

 
1、首先使用 docker network create 分别在两台主机上创建两个 macvlan 网络:
sudo docker network create --driver macvlan --subnet 172.16.10.0/24 --gateway 172.16.10.1 -o parent=ens33  macvlan_10  # 为了简单设置的网络与宿主机的网络为同一网段
  • --driver:指定 Docker 网络 driver;
  • --subnet:macvlan网络是local网络,为了保证跨主机能够通信,用户需要自己管理 IP subnet;
  • --gateway 与其他网络不同,docker不会为macvlan 创建网关,这里的网关应该是真实存在的,否则容器无法路由
  • -o parent 指定用来分配 macvlan 网络的物理网卡
docker network ls查看创建的macvlan网络:
 
2、在两台宿主机上分别增加一个容器
由于node1中的macvlan_10与node2中的macvlan_10本质上是独立的,为了避免自动分配造成 IP 冲突,最好通过 --ip 指定地址。
node1上运行容器,指定IP为172.16.10.2:
node2上运行容器,指定IP为172.16.10.3:
 
 
1、macvlan是不依赖Linux bridge的,创建好macvlan网络之后,通过brctl show可以确认没有创建新的网桥。
2、docker 没有为 macvlan 提供 DNS 服务,这点与 overlay 网络是不同的。
3、容器内的eth0是由macvlan所在物理接口ens33创建的一个逻辑网口,解释如下:
容器内,除了lo,容器只有一个eth0,eth0后面有个if2,这说明该接口有个对应的interface,全局编号为2,而在主机上执行ip link可以看到,ens33的编号也是2:
4、容器直接使用宿主机的网卡,性能较好,这种方案使得容器无需通过NAT和端口映射就能与外网相通(只要有网关),在网络上与其他独立主机没有区别。
5、需要注意的是,通过MacVLAN创建的网络,docker容器内的IP是不能与parent的网卡互通的因为 macvlan 网络会独占物理网卡,即一张物理网卡只能创建一个 macvlan 网络,如果想创建多个 macvlan 网络就得用多张网卡,但主机的物理网卡是有限的,这个时候需要用到VLAN子接口的功能实现。
 
 

四、不同 macvlan 网络之间的通信

由于 macvlan 网络会独占物理网卡,也就是说 一张物理网卡只能创建一个 macvlan 网络,如果我们想创建多个 macvlan 网络就得用多张网卡,但主机的物理网卡是有限的,怎么办呢?
可以 通过 VLAN 技术将一个网口划分出多个子网口,这样就可以基于子网口来创建 macvlan 网络了。

 
下面是具体的创建过程
1、首先分别在两台主机上将物理网口 ens33创建出两个 VLAN 子接口。
# 使用 vconfig 命令在 ens33配置两个 VLAN
sudo vconfig add ens33 100  # 使用vconfig需要执行sudo apt install vlan
sudo vconfig add ens33 200
 
# 设置 VLAN REORDER_HDR 参数,默认就行了
sudo vconfig set_flag ens33.100 1 1    
sudo vconfig set_flag ens33.200 1 1
  
# 启用接口
sudo ifconfig ens33.100 up
sudo ifconfig ens33.200 up
 
ifconfig查看:
 
2、分别在 node1 和 node2 上基于两个 VLAN 子接口创建 2 个 macvlan 网络,mac100 和 mac200。
docker network create -d macvlan --subnet=172.16.100.0/24 --gateway=172.16.100.1 -o parent=ens33.100  mac100
docker network create -d macvlan --subnet=172.16.200.0/24 --gateway=172.16.200.1 -o parent=ens33.200  mac200
 
3、分别在 node1 和 node2 上运行容器,并指定不同的 macvlan 网络
node1
root@node1:~$ docker run -itd --name d1 --ip=172.16.100.10 --network mac100 busybox
root@node1:~$ docker run -itd --name d2 --ip=172.16.200.10 --network mac200 busybox
  
# node2
zhang@node2:~$ docker run -itd --name d3 --ip=172.16.100.11 --network mac100 busybox
zhang@node2:~$ docker run -itd --name d4 --ip=172.16.200.11 --network mac200 busybox
通过验证,d1 和 d3,d2 和 d4 在同一 macvlan 网络下,互相可以 ping 通,d1 和 d2,d1 和 d4 在不同的 macvlan 网络下,互相 ping 不通。
  
初始测试,d1与d3不通,d2和d4不通。
后将测试机器改为桥接模式:
d1可以ping通d3,但ping不通d2:
d2可以ping通d4:
这个原因也很明确,不同 macvlan 网络处于不同的网络,而且通过 VLAN 隔离,自然 ping 不了。
但这也只是在二层上通不了,通过三层的路由是可以通的,我们这就来验证下。
  
  
重新找一台主机node3,通过打开 ip_forward 把它改造成一台虚拟路由器,用来打通两个 macvlan 网络,大概的图示如下所示:

1 首先对 node3 执行 vi /etc/sysctl.d/99-sysctl.conf  net.ipv4.ip_forward=1   sysctl -p开路由开关。
2 然后创建两个 VLAN 子接口,一个作为 macvlan 网络 mac10 的网关,一个作为 mac20 的网关。
# 使用 vconfig 命令在 ens33配置两个 VLAN
[root@node3~]~$ vconfig add ens33 100
[root@node3 ~]~$ vconfig add ens33 200
 
# 设置 VLAN REORDER_HDR 参数,默认就行了
[root@node3 ~]~$ vconfig set_flag ens33.100 1 1  
[root@node3 ~]~$ vconfig set_flag ens33.200 1 1
  
# vlan 子接口配置网关 IP 并启用
[root@node3 ~]~$ ifconfig ens33.100 172.16.100.1 netmask 255.255.255.0 up
[root@node3 ~]~$ ifconfig ens33.200 172.16.200.1 netmask 255.255.255.0 up
3、此时,d1还是ping不通d4
4、node3上添加iptable规则,转发不通VLAN的数据。
iptables-save查看规则:
添加规则:
iptables -t nat -A POSTROUTING -o ens33.100 -j MASQUERADE
iptables -t nat -A POSTROUTING -o ens33.200 -j MASQUERADE
  
iptables -A FORWARD -i ens33.100 -o ens33.200 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i ens33.200 -o ens33.100 -m state --state RELATED,ESTABLISHED -j ACCEPT
  
iptables -A FORWARD -i ens33.100 -o ens33.200 -j ACCEPT
iptables -A FORWARD -i ens33.200 -o ens33.100 -j ACCEPT
 
再查看ipatbles规则:
5、此时,d1可以ping通d4,也可以ping通d2。
6、分析数据包是如何从d1(172.16.100.10)到达d4(172.16.200.11)
    1、因为d1与d4在不同的IP网段,根据d1的路由表:
    
    数据包将发往网关172.16.100.1.
    2、路由器从ens33.100收到数据包,发现目的地址是172.16.200.11,查看自己的路由表:
    
    于是将数据包从ens33.200转发出去。
    3、通过ARP记录的信息,路由器能够得知172.16.200.11在host2上,于是将数据包发往hosts2.
    
    4、hosts3根据目的地址和VLAN信息将数据包发往d4。
  

五、总结

macvlan 是一种网卡虚拟化技术,能够将一张网卡虚拟出多张网卡。
macvlan网络的连通与隔离完依赖VLAN、IP subnet和路由,docker本身不做任何限制,用户可以像管理传统VLAN网络那样管理macvlan。
macvlan 的四种通信模式,常用模式是 bridge。
在 Docker 中,macvlan 只支持 bridge 模式。
相同 macvlan 可以通信,不同 macvlan 二层无法通信,可以借助三层路由完成通信。
 

六、参考

macvlan 网络结构分析 - 每天5分钟玩转 Docker 容器技术(56) (qq.com)

Docker学习笔记(五)Docker跨主机网络–macvlan方案 | 码农家园 (codenong.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/124450.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

教你这样找到Mac“其他”文件并删除它

当我们通过「关于本机」>「存储空间」查看硬盘的空间占用情况时。系统会将存储空间根据不同文件类别所占的空间大小显示在条状图上,大部分类型看文字都比较好理解,但对于“其他”这一类很多小伙伴都感觉很困惑,会产生一些问题如&#xff1…

如何在PPT中嵌入交互式图表?LightningChart助力炫酷展示

我们在PPT演示文稿中嵌入图表很容易,但嵌入交互式图表似乎就没听说过了,接下来我们就一起来看看通过交互式图表在PPT中展示病人心跳的效果: PPT中展示病人心跳下方是一个实时地图在PPT中的展现实例 LightningChart2以上在PPT中展示实时交互的…

Nacos服务注册发现、配置管理

Nacos服务注册发现 引入依赖 <dependencyManagement><dependencies><!-- nacos管理依赖 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>…

T-SQL程序练习03

目录 一、利用 &#x1d446;&#x1d452;&#x1d44e;&#x1d460;&#x1d45c;&#x1d45b; 表&#xff0c;参照结果&#xff0c;写一个存储过程&#x1d446;&#x1d452;&#x1d44e;&#x1d460;&#x1d45c;&#x1d45b;&#x1d43f;&#x1d44e;&#x1d4…

【机器学习】ID3_C4.5_CART算法总结与对比

问题 ID3、C4.5、CART算法总结与对比 前言 ID3、C4.5、CART算法是三种不同的决策树算法&#xff0c;区别主要在最优划分属性的选择上&#xff0c;下面把之前在随机森林中汇总过的复制过来&#xff0c;然后再总结下三者的不同。 三种算法所用的最优属性选择方法详述 信息增…

知识图谱系统课程笔记(二)——知识抽取与挖掘

知识图谱系统课程笔记&#xff08;二&#xff09;——知识抽取与挖掘 文章目录知识图谱系统课程笔记&#xff08;二&#xff09;——知识抽取与挖掘OWL、RDF与RDFS关系知识抽取任务定义和相关比赛知识抽取技术知识获取关键技术与难点知识抽取的子任务实体抽取命名实体识别非结构…

【微服务架构实战】第2篇之Spring Cloud Gateway介绍

我们的项目采用 Spring Cloud Gateway gateway 的版本为&#xff1a;2.2.8.RELEASE 简介&#xff1a; Spring Cloud Gateway&#xff08;2.2.8.RELEASE&#xff09; 是 Spring 公司基于 Spring 5.0&#xff0c; Spring Boot 2.0 和 Project Reactor 等技术开发的网关&#xf…

Linux系统运行时参数命令--网络IO性能监控

目录 5 网络IO性能监控 5.1 性能指标 5.2 网络信息 5.2.1 套接字信息 5.2.2 协议栈统计信息-netstat命令 5.2.3 网络吞吐-sar命令 5.2.4 连通性和延时 5.3 其他常用的网络相关命令 telnet nc mtr连通性测试 nslookup traceroute iptraf强大的网络监控 tcpdump- …

(二十五)Vue之mixin混入/合

文章目录mixin局部混入全局混入Vue学习目录 上一篇&#xff1a;&#xff08;二十四&#xff09;Vue之props配置项 下一篇&#xff1a;&#xff08;二十六&#xff09;Vue之插件 mixin 在有些业务逻辑中&#xff0c;发现在多个组件的功能业务逻辑一样&#xff0c;可以把多个…

秋招荆棘之路

找工作期间&#xff0c;在牛客网上面看到很多前辈的面经和经验总结&#xff0c;给我面试带来了很多的帮助&#xff0c;本着互助原则&#xff0c;我也总结下自己秋招的经验&#xff0c;算是一种反馈了&#xff0c;给即将毕业的学弟学妹问一些经验。 1.1 背景 首先介绍下我的背景…

Project 2: CS61BYoG

Project 2主要分为两个部分&#xff1a;phase 1&#xff08;World Generation&#xff09;和 phase 2&#xff08;Interactivity&#xff09;。 最难的个人认为是phase 1中的生成随机地图的算法。这里也主要总结以下phase1。 自己一开始在这个位置卡了一天&#xff0c;一开始做…

Android动态代理源码分析

前言 前面我们简单介绍了代理模式的使用Android设计模式详解之代理模式&#xff0c;我们也明白了动态代理模式的重要性&#xff0c;那动态代理究竟是如何实现将方法交给InvocationHandler.invoke执行的呢&#xff1f;本文就从源码的角度一步步去探究这个问题&#xff1b; 源码…

开发工具与低代码开发平台丨上海道宁联合Grapecity为您提供各类软件开发工具和服务

Grapecity 提供软件开发技术和低代码平台 通过各类软件开发工具和服务 提升开发效率 推动软件产业发展 葡萄城研发各类开发控件和 商业智能报表工具 提供控件技术和数据分析工具 基于专业控件的技术积累 发布低代码开发平台 开发商介绍 葡萄城成立于1980年&#xff0c…

C# XML基本操作

一 XML的内容 二 XML的处理方式 1 DOM 文档对象模型&#xff08;Document Object Model&#xff09; 2 SAX XML解析的简单API&#xff08;Simple API for XML&#xff09; 3 .NET提供了XML支持&#xff1a;System.XML名称空间 三 常用的XML类 1 XmlDocument .LoadXml()…

linux安装mongodb的详细教程

目录 一、下载MongoDB Community Server(社区版) 三、启动mongodb 四、利用配置文件启动mongodb服务 一、下载MongoDB Community Server(社区版) 1.1、下载地址 Download MongoDB Community Server | MongoDB 1.2、选择安装版本 二、上传下载后的mongodb安装包&#xff0c;如…

vue路由写法小结

咱们先说路由的匹配语法&#xff0c;动态路由在项目中经常用到&#xff0c;在某些情况下我们要对路径参数进行正则表达式校验。 基础用法&#xff1a; 使用正则表达式后&#xff08;仅匹配数字&#xff09;&#xff1a; 加入*传入多个params参数&#xff0c;此时参数可以传多个…

使用Nordic的nrf52832进行主从机连接抓包分析

主机使用例程&#xff1a;nRF5_SDK_17.1.0_ddde560\examples\ble_central\ble_app_blinky_c\pca10040\s132\arm5_no_packs 从机使用例程&#xff1a;nRF5_SDK_17.1.0_ddde560\examples\ble_peripheral\ble_app_blinky\pca10040\s132\arm5_no_packs nrf528321. 空中数据包格式1.…

基于Amlogic 安卓9.0, 驱动简说(二):字符设备驱动,自动创建设备

文章目录一、前言二、系列文章三、替换部分3.1 自动分配设备号3.2 自动创建设备四、解析&#xff1a;完整源码4.1 helloworld_amlogic_char_driver_auto_mknode.c4.2 Makefile五、编译执行&#xff08;1&#xff09;编译及部署&#xff08;2&#xff09;加载ko文件&#xff08;…

HCIP作业三

文章目录一&#xff0c;建立拓扑图1&#xff0c;目的&#xff1a;实现全网可达二&#xff0c;在OSPF1区域1&#xff0c;所有路由器配置IP地址&#xff08;包含OSPF100区域&#xff09;2&#xff0c;进行O1的宣告&#xff0c;不能宣告ISP网段3&#xff0c;在O1区域的R3写缺省去I…

MIT6.830-2022-lab3实验思路详细讲解

文章目录一、实验概览二、实验过程成本估算&#xff08;Cost Estimation&#xff09;&#xff1a;基数和选择率Exercise 1: IntHistogramExercise 2: TableStatsExercise 3: Join Cost EstimationExercise 4: Join Cost EstimationExtra Credit总结一、实验概览 对于这次lab&a…