时间:2021-05-02
基本概念:
macvlan工作原理:
macvlan是linux内核支持的网络接口。要求的linux内部版本是v3.9–3.19和4.0+;通过为物理网卡创建macvlan子接口,允许一块物理网卡拥有多个独立的mac地址和ip地址。虚拟出来的子接口将直接暴露在相邻物理网络中。从外部看来,就像是把网线隔开多股,分别接受了不同的主机上一样;物理网卡收到包后,会根据收到包的目的mac地址判断这个包需要交给其中虚拟网卡。当容器需要直连入物理网络时,可以使用macvlan。macvlan本身不创建网络,本质上首先使宿主机物理网卡工作在‘混杂模式',这样物理网卡的mac地址将会失效,所有二层网络中的流量物理网卡都能收到。接下来就是在这张物理网卡上创建虚拟网卡,并为虚拟网卡指定mac地址,实现一卡多用,在物理网络看来,每张虚拟网卡都是一个单独的接口。
使用macvlan需要注意以下几点:项目环境:
两台docker主机:(centos7)
docker01: 172.16.1.30
docker02: 172.16.1.31
项目操作:
实例一:macvlan跨主机单网络解决方案:
docker01:
(1)开启ens33网卡的混杂模式,开启网卡的多个虚拟interface(接口)
? 1 [root@sqm-docker01 ~]# ip link set ens33 promisc on ? 1 2 ##查看网卡的状态: [root@sqm-docker01 ~]# ip link show ens33
(2)创建macvlan网络:
? 1 [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)基于刚创建的网络运行一个容器:
? 1 [root@sqm-docker01 ~]# docker run -itd --name box1 --ip 172.16.100.10 --network mac_net1 busyboxdocker02:(与docker01相同操作)
? 1 2 3 开启混杂模式 [root@sqm-docker02 ~]# ip link set ens33 promisc on [root@sqm-docker02 ~]# ip link show ens33 ? 1 2 //创建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 ? 1 2 //运行一个容器: [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模块:
? 1 [root@sqm-docker01 ~]# modinfo 8021q? 1 2 ##如果没有查看到该模块,需要执行以下命令进行加载: [root@sqm-docker01 ~]# modprobe 8021q ? 1 2 3 4 开启路由转发: [root@sqm-docker01 ~]# echo "net.ipv4.ip_forward = 1" > /etc/sysctl.conf [root@sqm-docker01 ~]# sysctl -p net.ipv4.ip_forward = 1
(2)修改网络配置信息:
docker01:
? 1 2 [root@sqm-docker01 ~]# cd /etc/sysconfig/network-scripts/ [root@sqm-docker01 network-scripts]# ls? 1 [root@sqm-docker01 network-scripts]# vim ifcfg-ens33
基于ens33网卡进行创建子网卡:
? 1 2 [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:表示保留原有属性(权限)
? 1 2 3 //修改ens33.10网卡: [root@sqm-docker01 network-scripts]# vim ifcfg-ens33.10 ##只保留以下选项: ? 1 2 3 //修改ens33.20网卡: [root@sqm-docker01 network-scripts]# vim ifcfg-ens33.20 配置与ens33.10相同,只需修改ip地址:
(3)启动子网卡:
? 1 2 [root@sqm-docker01 network-scripts]# ifup ifcfg-ens33.10 [root@sqm-docker01 network-scripts]# ifup ifcfg-ens33.20 ? 1 2 //查看网络信息 [root@sqm-docker01 network-scripts]# ifconfig
(4)基于ens33.10和ens33.20创建macvlan网络:
注意:网段不同,网络名称不同
? 1 2 3 [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个容器:
? 1 2 3 [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得不同。
#以下操作将不做解释:
? 1 2 3 4 开启路由转发: [root@sqm-docker01 ~]# echo "net.ipv4.ip_forward = 1" > /etc/sysctl.conf [root@sqm-docker01 ~]# sysctl -p net.ipv4.ip_forward = 1 ? 1 2 3 [root@sqm-docker02 network-scripts]# pwd /etc/sysconfig/network-scripts [root@sqm-docker02 network-scripts]# vim ifcfg-ens33? 1 2 [root@sqm-docker02 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33.10 [root@sqm-docker02 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33.20 ? 1 [root@sqm-docker02 network-scripts]# vim ifcfg-ens33.10
? 1 [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 -it --name t2 --network container:t1 busybox
然后在t2容器中也可以看到此服务:
以上就是部署网络栈的基本内容,自己也不是经常用到,就是为了实现其他容器能够共享其中一个容器中的资源。
原文链接:https://blog.51cto.com/13972012/2446646
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
一、MacVlan实现Docker的跨主机网络通信的方案有很多,如之前博文中写到的通过部署Consul服务实现Docker容器跨主机通信Macvlan工作原理:
一、docker跨主机通信docker跨主机网络方案包括:docker原生的overlay和macvlan。第三方方案:常用的包括flannel、weave和c
最近做项目是关于Docker的网络通信,需要多个主机进行链接通信,这里记录下,以后便于项目开发,大家需要的话也可以看下,少走些弯路。Docker多主机网络通信详
Docker的原生网络支持非常有限,且没有跨主机的集群网络方案。目前实现Docker网络的开源方案有Weave、Kubernetes、Flannel、Pipew
为支持容器跨主机通信,Docker提供了overlaydriver,使用户可以创建基于VxLAN的overlay网络。VxLAN可将二层数据封装到UDP进行传输