基本概念:
Macvlan工作原理:当容器需要直连入物理网络时 , 可以使用Macvlan 。Macvlan本身不创建网络 , 本质上首先使宿主机物理网卡工作在‘混杂模式' , 这样物理网卡的MAC地址将会失效 , 所有二层网络中的流量物理网卡都能收到 。接下来就是在这张物理网卡上创建虚拟网卡 , 并为虚拟网卡指定MAC地址 , 实现一卡多用 , 在物理网络看来 , 每张虚拟网卡都是一个单独的接口 。
Macvlan是Linux内核支持的网络接口 。要求的Linux内部版本是v3.9–3.19和4.0+;通过为物理网卡创建Macvlan子接口 , 允许一块物理网卡拥有多个独立的MAC地址和IP地址 。虚拟出来的子接口将直接暴露在相邻物理网络中 。从外部看来 , 就像是把网线隔开多股 , 分别接受了不同的主机上一样;物理网卡收到包后 , 会根据收到包的目的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
参数解释:(3)基于刚创建的网络运行一个容器:
-o: 绑定在哪张网卡之上(基于ens33网卡)
[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个容器:
【docker部署Macvlan实现跨主机网络通信的实现】[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 --namet1 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 -itt1 bin/sh
文章插图
然后在t2容器中也可以看到此服务:

文章插图
以上就是部署网络栈的基本内容 , 自己也不是经常用到 , 就是为了实现其他容器能够共享其中一个容器中的资源 。
- 春季老年人吃什么养肝?土豆、米饭换着吃
- 三八妇女节节日祝福分享 三八妇女节节日语录
- 老人谨慎!选好你的“第三只脚”
- 校方进行了深刻的反思 青岛一大学生坠亡校方整改校规
- 脸皮厚的人长寿!有这特征的老人最长寿
- 长寿秘诀:记住这10大妙招 100%增寿
- 春季老年人心血管病高发 3条保命要诀
- 眼睛花不花要看四十八 老年人怎样延缓老花眼
- 香槟然能防治老年痴呆症? 一天三杯它人到90不痴呆
- 老人手抖的原因 为什么老人手会抖
