Docker 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 条件
- Macvlan是Linux内核支持的网络接口。要求的Linux内部版本是v3.9–3.19和4.0+。
- 大多数云服务商限制了macvlan。确保自身的网络设备可以使用
- 只适合在linux服务器上运行。Mac和windows版本的Docker并不支持,在Windows Server中Docker EE也不支持
- 请将网卡名称 eth0 改成自己的网卡名称
1.2 工作原理
- 通过为物理网卡创建Macvlan子接口,允许一块物理网卡拥有多个独立的MAC地址和IP地址。虚拟出来的子接口将直接暴露在底层物理网络中。从外界看来,就像是把网线分成多股,分别接到了不同的主机上一样。
- 物理网卡收到包后,会根据收到包的目的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 系统环境
节点 | IP | kernel |
macvlan-01 | 192.168.1.221 | 3.10.0-693.el7.x86_64 |
macvlan-02 | 192.168.1.222 | 3.10.0-693.el7.x86_64 |
MacVLAN有两种桥接模式
- Bridge模式:不创建子接口的情况下直接去桥接物理接口。直接桥接到与宿主级的同网段。
- VLAN Bridge模式:创建子接口去桥接物理接口。可划分多个VLAN。
Macvlan Bridge模式 容器专属网络
1、节点1节点2操作:创建macvlan网络
[root@macvlan-01 ~]# docker network create -d macvlan --subnet=172.100.1.0/24 --gateway=172.100.1.1 -o parent=ens33 macvlan_net 1fba93fda898ed05dc1356f0d469e72d872c33ef5a6ea27fa5e7ed75dfd41b25 docker network create 创建网络 -d 指定网络驱动程序为macvlan --subnet 指定一个子网段 --gateway 指定网关 -o parent=ens33 指定宿主接口 macvlan_net 自定义网络名称 命令解析 [root@macvlan-01 ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 4a571c4dae3e bridge bridge local 03cf5e32ed93 host host local 1fba93fda898 macvlan_net macvlan local 2f461342dd7b none null local
[root@macvlan-2 ~]# docker network create -d macvlan --subnet=172.100.1.0/24 --gateway=172.100.1.1 -o parent=ens33 macvlan_net cd740b4417662283b8e4c70d96426ab9d995eac111a15df111b5110c84cfc699 [root@macvlan-2 ~]# docker network ls NETWORK ID NAME DRIVER SCOPE a8f47ed48090 bridge bridge local 7c0c22cca61d host host local cd740b441766 macvlan_net macvlan local 904ed969c396 none null local
注:如果需要访问外网,需要将网络设置为与宿主级相同网络下。
注:本地不可访问,因为桥接的本地网络。
注:单个网卡只能绑定一次如重复添加会报如下错误。
# ens33网卡已被绑定,不多次绑定。
Error response from daemon: network dm-0a48ab454840 is already using parent interface ens33
# 删除绑定网卡网络集
docker network rm ID号
测试通信
[root@macvlan-01 ~]# docker run -it --net macvlan_net --ip=172.100.1.10 busybox Unable to find image 'busybox:latest' locally latest: Pulling from library/busybox 322973677ef5: Pull complete Digest: sha256:1828edd60c5efd34b2bf5dd3282ec0cc04d47b2ff9caa0b6d4f07a21d1c08084 Status: Downloaded newer image for busybox:latest / # ifconfig eth0 Link encap:Ethernet HWaddr 02:42:AC:64:01:0A inet addr:172.100.1.10 Bcast:172.100.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:65 errors:0 dropped:11 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:4032 (3.9 KiB) TX bytes:0 (0.0 B) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) / # ping 172.100.1.11 PING 172.100.1.11 (172.100.1.11): 56 data bytes 64 bytes from 172.100.1.11: seq=0 ttl=64 time=0.542 ms 64 bytes from 172.100.1.11: seq=1 ttl=64 time=0.516 ms 64 bytes from 172.100.1.11: seq=2 ttl=64 time=0.547 ms 64 bytes from 172.100.1.11: seq=3 ttl=64 time=0.951 ms 64 bytes from 172.100.1.11: seq=4 ttl=64 time=1.417 ms ^C --- 172.100.1.11 ping statistics --- 5 packets transmitted, 5 packets received, 0% packet loss round-trip min/avg/max = 0.516/0.794/1.417 ms / #
[root@macvlan-2 ~]# docker run -it --net macvlan_net --ip=172.100.1.11 busybox Unable to find image 'busybox:latest' locally latest: Pulling from library/busybox 322973677ef5: Pull complete Digest: sha256:1828edd60c5efd34b2bf5dd3282ec0cc04d47b2ff9caa0b6d4f07a21d1c08084 Status: Downloaded newer image for busybox:latest / # ifconfig eth0 Link encap:Ethernet HWaddr 02:42:AC:64:01:0B inet addr:172.100.1.11 Bcast:172.100.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:10 errors:0 dropped:2 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:624 (624.0 B) TX bytes:0 (0.0 B) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) / # ping 172.100.1.10 PING 172.100.1.10 (172.100.1.10): 56 data bytes 64 bytes from 172.100.1.10: seq=0 ttl=64 time=3.031 ms 64 bytes from 172.100.1.10: seq=1 ttl=64 time=1.223 ms 64 bytes from 172.100.1.10: seq=2 ttl=64 time=0.921 ms 64 bytes from 172.100.1.10: seq=3 ttl=64 time=0.683 ms ^C --- 172.100.1.10 ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max = 0.683/1.464/3.031 ms / #
Macvlan VLAN Bridge模式 容器专属网络
1、节点1节点2操作:创建一个VLAN,VLAN ID 50
节点1 [root@localhost ~]# ip link add link ens33 name ens33.50 type vlan id 50
[root@localhost ~]# systemctl restart docker
节点2 [root@localhost ~]# ip link add link ens33 name ens33.50 type vlan id 50
[root@localhost ~]# systemctl restart docker
2、节点1节点2操作:创建Macvlan网络
节点1 [root@localhost ~]# docker network create -d macvlan --subnet=172.99.0.0/24 --gateway=172.99.0.1 -o parent=ens33.50 macvlan_net99 5f98cb03e8eea0899ee8e5a04258b5a7a895d0f9455e9bef572a22a215592798 docker network create 创建网络 -d 指定网络驱动程序为macvlan --subnet 指定一个子网段 --gateway 指定网关 -o parent=ens33 指定宿主接口 macvlan_net99 自定义网络名称 命令解析 [root@localhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE d44397fdd827 bridge bridge local 03cf5e32ed93 host host local 5f98cb03e8ee macvlan_net99 macvlan local 2f461342dd7b none null local
节点2 [root@localhost ~]# docker network create -d macvlan --subnet=172.99.0.0/24 --gateway=172.99.0.1 -o parent=ens33.50 macvlan_net99 53715dd1fcd5db475770e9f091c757f720c5fa65a837217246afa82fe3e2fa14 [root@localhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 01893ed0bb21 bridge bridge local 7c0c22cca61d host host local 53715dd1fcd5 macvlan_net99 macvlan local 904ed969c396 none null local
3、测试互通
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?