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~]#iplinksetens33promiscon
##查看网卡的状态: [root@sqm-docker01~]#iplinkshowens33
(2)创建macvlan网络:
[root@sqm-docker01~]#dockernetworkcreate-dmacvlan--subnet172.16.100.0/24--gateway172.16.100.1-oparent=ens33mac_net1
参数解释:
-o:绑定在哪张网卡之上(基于ens33网卡)
(3)基于刚创建的网络运行一个容器:
[root@sqm-docker01~]#dockerrun-itd--namebox1--ip172.16.100.10--networkmac_net1busybox
docker02:(与docker01相同操作)
开启混杂模式 [root@sqm-docker02~]#iplinksetens33promiscon [root@sqm-docker02~]#iplinkshowens33
//创建macvlan网络 [root@sqm-docker02~]#dockernetworkcreate-dmacvlan--subnet172.16.100.0/24--gateway172.16.100.1-oparent=ens33mac_net1
//运行一个容器: [root@sqm-docker02~]#dockerrun-itd--namebox2--networkmac_net1--ip172.16.100.20busybox
(4)测试两个主机间的两个容器相互通信:
注意事项:
能ping通的原因是两个容器都是基于真实的ens33网卡的,所以宿主机上的ens33网卡必须能够相互通信。这种方式只能够ping通ip地址,是无法ping通容器名的。
实例二:macvlan跨主机多网络解决方案:
(1)首先查看主机内核的8021q模块:
[root@sqm-docker01~]#modinfo8021q
##如果没有查看到该模块,需要执行以下命令进行加载: [root@sqm-docker01~]#modprobe8021q
开启路由转发: [root@sqm-docker01~]#echo"net.ipv4.ip_forward=1">/etc/sysctl.conf [root@sqm-docker01~]#sysctl-p net.ipv4.ip_forward=1
(2)修改网络配置信息:
docker01:
[root@sqm-docker01~]#cd/etc/sysconfig/network-scripts/ [root@sqm-docker01network-scripts]#ls
[root@sqm-docker01network-scripts]#vimifcfg-ens33
基于ens33网卡进行创建子网卡:
[root@sqm-docker01network-scripts]#cp-pifcfg-ens33ifcfg-ens33.10#网卡名称自定义 [root@sqm-docker01network-scripts]#cp-pifcfg-ens33ifcfg-ens33.20
-p:表示保留原有属性(权限)
//修改ens33.10网卡: [root@sqm-docker01network-scripts]#vimifcfg-ens33.10 ##只保留以下选项:
//修改ens33.20网卡: [root@sqm-docker01network-scripts]#vimifcfg-ens33.20 配置与ens33.10相同,只需修改ip地址:
(3)启动子网卡:
[root@sqm-docker01network-scripts]#ifupifcfg-ens33.10 [root@sqm-docker01network-scripts]#ifupifcfg-ens33.20
//查看网络信息 [root@sqm-docker01network-scripts]#ifconfig
(4)基于ens33.10和ens33.20创建macvlan网络:
注意:网段不同,网络名称不同
[root@sqm-docker01~]#dockernetworkcreate-dmacvlan--subnet172.16.200.0/24--gateway172.16.200.1-oparent=ens33.10mac_net10 [root@sqm-docker01~]#dockernetworkcreate-dmacvlan--subnet172.16.210.0/24--gateway172.16.210.1-oparent=ens33.20mac_net20
(5)基于以上网络分别运行2个容器:
[root@sqm-docker01~]#dockerrun-itd--nametest1--ip172.16.200.10--networkmac_net10busybox [root@sqm-docker01~]#dockerrun-itd--nametest2--ip172.16.210.10--networkmac_net20busybox
部署docker02:
基本与docker01操作相同,注意网段的相同,但主机ip得不同。
#以下操作将不做解释:
开启路由转发: [root@sqm-docker01~]#echo"net.ipv4.ip_forward=1">/etc/sysctl.conf [root@sqm-docker01~]#sysctl-p net.ipv4.ip_forward=1
[root@sqm-docker02network-scripts]#pwd /etc/sysconfig/network-scripts [root@sqm-docker02network-scripts]#vimifcfg-ens33
[root@sqm-docker02network-scripts]#cp-pifcfg-ens33ifcfg-ens33.10 [root@sqm-docker02network-scripts]#cp-pifcfg-ens33ifcfg-ens33.20
[root@sqm-docker02network-scripts]#vimifcfg-ens33.10
[root@sqm-docker02network-scripts]#vimifcfg-ens33.20
[root@sqm-docker02network-scripts]#ifupifcfg-ens33.10[root@sqm-docker02network-scripts]#ifupifcfg-ens33.20
//创建macvlan网络:[root@sqm-docker02~]#dockernetworkcreate-dmacvlan--subnet172.16.200.0/24--gateway172.16.200.1-oparent=ens33.10mac_net10[root@sqm-docker02~]#dockernetworkcreate-dmacvlan--subnet172.16.210.0/24--gateway172.16.210.1-oparent=ens33.20mac_net20
//运行容器(ip地址不同):[root@sqm-docker02~]#dockerrun-itd--nametest3--networkmac_net10--ip172.16.200.11busybox[root@sqm-docker02~]#dockerrun-itd--nametest4--networkmac_net20--ip172.16.210.11busybox
//确保容器正常运行:
(6)测试容器之间能够跨主机通信:(注意:如果你是vmware环境的话,由于VMware虚拟机的原因,必须将两台主机默认的NAT模式修改为桥接模式才能够正常通信)
test3与test1通信(相同网段):
test4与test2通信(相同网段):
排错思路:如果部署完主机间无法通信的话,首先确认防火墙或iptables规则是否关闭或放行,是否禁用selinux,其次排查ens33的网卡配置文件及其子网卡内容是否修改错误,最后排查你创建macvlan网络是是否网段定义错误,或者在运行容器是否ip地址指定不正确。
----------------------macvlan多网络跨主机实现通信部署完毕---------------------
扩展知识点:
假设我们运行了一个t1容器,然后t2容器使用t1容器的网络栈。
[root@sqm-docker03~]#dockerrun-itd--namet1busybox[root@sqm-docker03~]#dockerexect1ipa
[root@sqm-docker03~]#dockerrun-it--namet2--networkcontainer:t1busybox
//接下来在t1容器中操作:[root@sqm-docker03~]#dockerexec-itt1bin/sh
然后在t2容器中也可以看到此服务:
以上就是部署网络栈的基本内容,自己也不是经常用到,就是为了实现其他容器能够共享其中一个容器中的资源。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。