千家信息网

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

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,今天就跟大家聊聊有关docker部署Macvlan实现跨主机网络通信的实现,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。基本概念:Macvla
千家信息网最后更新 2026年11月02日docker部署Macvlan实现跨主机网络通信的实现

今天就跟大家聊聊有关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容器中也可以看到此服务:

看完上述内容,你们对docker部署Macvlan实现跨主机网络通信的实现有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

网络 网卡 容器 物理 主机 通信 地址 模式 运行 相同 不同 内容 接口 网段 宿主 工作 两个 原因 就是 支持 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技资迅 北京互联网科技 深圳互联网科技公司 金融科技与互联网金融 互联网金融公司科技 成都互联网科技公司 天下捷融互联网科技 广州善班互联网科技 互联网高科技股票 厦门比较好的科技互联网公司 岳阳华臻互联网科技有限公司 互联网科技公司实习生 元气玛特互联网科技公司是外包吗 智帮互联网科技公司最近动向 珠海东科互联网科技有限公司 江苏互联网智能科技产品出厂价 广州三三互联网科技有限公司 保山浩联互联网科技有限公司 杭州科技互联网公司有哪些 中国主要互联网科技公司 互联网科技 中智农互联网科技 苏州找大状互联网科技有限公司 互联网科技工作委员会毛军 老年人脱离互联网科技的作文 富国互联网科技创新基金 中国的互联网科技企业的崛起 杭州壁岐互联网科技有限公司 河南住房之家互联网科技 上海创道互联网络科技有限公司
0