千家信息网

docker部署Macvlan实现跨主机网络通信

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,基本概念:Macvlan工作原理:Macvlan是Linux内核支持的网络接口。要求的Linux内部版本是v3.9-3.19和4.0+;通过为物理网卡创建Macvlan子接口,允许一块物理网卡拥有多个
千家信息网最后更新 2026年11月01日docker部署Macvlan实现跨主机网络通信

基本概念:

Macvlan工作原理:

  • Macvlan是Linux内核支持的网络接口。要求的Linux内部版本是v3.9-3.19和4.0+;
  • 通过为物理网卡创建Macvlan子接口,允许一块物理网卡拥有多个独立的MAC地址和IP地址。虚拟出来的子接口将直接暴露在相邻物理网络中。从外部看来,就像是把网线隔开多股,分别接受了不同的主机上一样;
  • 物理网卡收到包后,会根据收到包的目的MAC地址判断这个包需要交给其中虚拟网卡。

当容器需要直连入物理网络时,可以使用Macvlan。Macvlan本身不创建网络,本质上首先使宿主机物理网卡工作在'混杂模式',这样物理网卡的MAC地址将会失效,所有二层网络中的流量物理网卡都能收到。接下来就是在这张物理网卡上创建虚拟网卡,并为虚拟网卡指定MAC地址,实现一卡多用,在物理网络看来,每张虚拟网卡都是一个单独的接口。

  • 使用Macvlan需要注意以下几点:
  • 容器直接连接物理网络,由物理网络负责分配IP地址,可能的结果是物理网络IP地址被耗尽,另一个后果是网络性能问题,物理网络中接入的主机变多,广播包占比快速升高而引起的网络性能下降问题;
  • 宿主机上的某张网上需要工作在'混乱模式'下;
  • 前面说到,工作在混乱模式下的物理网卡,其MAC地址会失效,所以,此模式中运行的容器并不能与外网进行通信,但是不会影响宿主机与外网通信;
  • 从长远来看bridge网络与overlay网络是更好的选择,原因就是虚拟网络应该与物理网络隔离而不是共享。

项目环境:

两台docker主机:(centos7)
docker01: 172.16.1.30
docker02: 172.16.1.31

项目操作:

实例一:macvlan跨主机单网络解决方案:

docker01:

(1)开启ens33网卡的混杂模式,开启网卡的多个虚拟interface(接口)[root@sqm-docker01 ~]# ip link set ens33 promisc on
##查看网卡的状态:[root@sqm-docker01 ~]# ip link show  ens33

(2)创建macvlan网络:[root@sqm-docker01 ~]# docker network  create -d macvlan --subnet 172.16.100.0/24 --gateway 172.16.100.1 -o parent=ens33 mac_net1

参数解释:
-o: 绑定在哪张网卡之上(基于ens33网卡)

(3)基于刚创建的网络运行一个容器:[root@sqm-docker01 ~]# docker run -itd --name box1 --ip 172.16.100.10 --network mac_net1 busybox

docker02:(与docker01相同操作)

开启混杂模式[root@sqm-docker02 ~]# ip link set ens33 promisc on[root@sqm-docker02 ~]# ip link  show ens33

//创建macvlan网络[root@sqm-docker02 ~]# docker network  create  -d macvlan --subnet  172.16.100.0/24 --gateway 172.16.100.1 -o parent=ens33 mac_net1
//运行一个容器:[root@sqm-docker02 ~]# docker run -itd --name box2 --network mac_net1 --ip 172.16.100.20 busybox

(4)测试两个主机间的两个容器相互通信:

注意事项:
能ping通的原因是两个容器都是基于真实的ens33网卡的,所以宿主机上的ens33网卡必须能够相互通信。这种方式只能够ping通ip地址,是无法ping通容器名的。

实例二:macvlan跨主机多网络解决方案:

(1)首先查看主机内核的8021q模块:[root@sqm-docker01 ~]# modinfo  8021q

##如果没有查看到该模块,需要执行以下命令进行加载:[root@sqm-docker01 ~]# modprobe  8021q
开启路由转发:[root@sqm-docker01 ~]# echo "net.ipv4.ip_forward = 1" > /etc/sysctl.conf [root@sqm-docker01 ~]# sysctl -pnet.ipv4.ip_forward = 1

(2)修改网络配置信息:
docker01:

[root@sqm-docker01 ~]# cd /etc/sysconfig/network-scripts/[root@sqm-docker01 network-scripts]# ls


[root@sqm-docker01 network-scripts]# vim ifcfg-ens33

基于ens33网卡进行创建子网卡:

[root@sqm-docker01 network-scripts]# cp -p ifcfg-ens33  ifcfg-ens33.10  #网卡名称自定义[root@sqm-docker01 network-scripts]# cp -p ifcfg-ens33  ifcfg-ens33.20

-p:表示保留原有属性(权限)

//修改ens33.10网卡:[root@sqm-docker01 network-scripts]# vim ifcfg-ens33.10##只保留以下选项:

//修改ens33.20网卡:[root@sqm-docker01 network-scripts]# vim ifcfg-ens33.20 配置与ens33.10相同,只需修改ip地址:

(3)启动子网卡:

[root@sqm-docker01 network-scripts]# ifup ifcfg-ens33.10 [root@sqm-docker01 network-scripts]# ifup ifcfg-ens33.20 
//查看网络信息[root@sqm-docker01 network-scripts]# ifconfig

(4)基于ens33.10和ens33.20创建macvlan网络:
注意:网段不同,网络名称不同

[root@sqm-docker01 ~]# docker network  create -d macvlan --subnet 172.16.200.0/24 --gateway 172.16.200.1 -o parent=ens33.10 mac_net10[root@sqm-docker01 ~]# docker network  create -d macvlan --subnet 172.16.210.0/24 --gateway 172.16.210.1 -o parent=ens33.20 mac_net20

(5)基于以上网络分别运行2个容器:

[root@sqm-docker01 ~]# docker run -itd --name test1 --ip 172.16.200.10 --network mac_net10 busybox[root@sqm-docker01 ~]# docker run -itd --name test2 --ip 172.16.210.10 --network mac_net20 busybox

部署docker02:
基本与docker01操作相同,注意网段的相同,但主机ip得不同。
#以下操作将不做解释:

开启路由转发:[root@sqm-docker01 ~]# echo "net.ipv4.ip_forward = 1" > /etc/sysctl.conf [root@sqm-docker01 ~]# sysctl -pnet.ipv4.ip_forward = 1
[root@sqm-docker02 network-scripts]# pwd/etc/sysconfig/network-scripts[root@sqm-docker02 network-scripts]# vim ifcfg-ens33 

[root@sqm-docker02 network-scripts]# cp -p ifcfg-ens33  ifcfg-ens33.10[root@sqm-docker02 network-scripts]# cp -p ifcfg-ens33  ifcfg-ens33.20

[root@sqm-docker02 network-scripts]# vim ifcfg-ens33.10

[root@sqm-docker02 network-scripts]# vim ifcfg-ens33.20

[root@sqm-docker02 network-scripts]# ifup ifcfg-ens33.10 [root@sqm-docker02 network-scripts]# ifup ifcfg-ens33.20
//创建macvlan网络:[root@sqm-docker02 ~]# docker network  create  -d macvlan  --subnet 172.16.200.0/24 --gateway 172.16.200.1 -o parent=ens33.10 mac_net10[root@sqm-docker02 ~]# docker network  create  -d macvlan  --subnet 172.16.210.0/24 --gateway 172.16.210.1 -o parent=ens33.20 mac_net20
//运行容器(ip地址不同):[root@sqm-docker02 ~]# docker run -itd --name  test3 --network mac_net10 --ip 172.16.200.11  busybox[root@sqm-docker02 ~]# docker run -itd --name  test4 --network mac_net20 --ip 172.16.210.11  busybox

//确保容器正常运行:

(6)测试容器之间能够跨主机通信:(注意:如果你是vmware环境的话,由于VMware虚拟机的原因,必须将两台主机默认的NAT模式修改为桥接模式才能够正常通信)
test3与test1通信(相同网段):

test4与test2通信(相同网段):

排错思路:如果部署完主机间无法通信的话,首先确认防火墙或iptables规则是否关闭或放行,是否禁用selinux,其次排查ens33的网卡配置文件及其子网卡内容是否修改错误,最后排查你创建macvlan网络是是否网段定义错误,或者在运行容器是否ip地址指定不正确。

----------------------macvlan多网络跨主机实现通信部署完毕---------------------

扩展知识点:
假设我们运行了一个t1容器,然后t2容器使用t1容器的网络栈。

[root@sqm-docker03 ~]# docker run -itd --name   t1 busybox[root@sqm-docker03 ~]# docker exec t1 ip a

[root@sqm-docker03 ~]# docker run -it --name t2 --network container:t1 busybox

//接下来在t1容器中操作:[root@sqm-docker03 ~]# docker exec -it   t1 bin/sh


然后在t2容器中也可以看到此服务:

以上就是部署网络栈的基本内容,自己也不是经常用到,就是为了实现其他容器能够共享其中一个容器中的资源。

-------- 本文至此结束,感谢阅读 --------

网络 网卡 容器 物理 主机 地址 通信 模式 运行 相同 不同 接口 网段 宿主 就是 工作 两个 原因 混杂 配置 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技有限公司 苏州找大状互联网科技有限公司 互联网科技深圳 金融科技创新监管互联网金融 狮子座互联网科技有限公司 互联网 新科技 科技互联网创业计划书 互联网科技类展会 哈尔滨新华互联网科技 深圳市运趣互联网科技有限公司 天速互联网络科技有限公司 互联网科技人工智能实验室 深圳艾果互联网通讯科技 互联网科技创新的路径 华中科技大学互联网的牛人 美国互联网科技实力 江苏苏星互联网科技有限公司 神州科技互联网有限公司 容联科技互联网电商 陕西九四连强互联网科技有限公司 互联网巨头反垄断金融科技 中国 科技 互联网 互联网科技论文 伴你行互联网科技有限公司 上海亿帐通互联网科技 现代互联网科技股 有人说阿里系是互联网科技企业 南京一网一红互联网科技有限公司 瑞安市蟠桃会互联网科技有限公司 每日互联网科技新闻
0