小知识: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(接口)

?
1
[root@sqm-docker01 ~]# ip link set ens33 promisc on
?
1
2
##查看网卡的状态:
[root@sqm-docker01 ~]# ip link show ens33

%小知识:docker部署Macvlan实现跨主机网络通信的实现-猿站网-插图

(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 busybox

%小知识:docker部署Macvlan实现跨主机网络通信的实现-1猿站网-插图

docker02:(与docker01相同操作)

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

%小知识:docker部署Macvlan实现跨主机网络通信的实现-2猿站网-插图

?
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)测试两个主机间的两个容器相互通信:

%小知识:docker部署Macvlan实现跨主机网络通信的实现-3猿站网-插图

注意事项:

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

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

(1)首先查看主机内核的8021q模块:

?
1
[root@sqm-docker01 ~]# modinfo 8021q

%小知识:docker部署Macvlan实现跨主机网络通信的实现-4猿站网-插图

?
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

%小知识:docker部署Macvlan实现跨主机网络通信的实现-5猿站网-插图

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

%小知识:docker部署Macvlan实现跨主机网络通信的实现-6猿站网-插图

基于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
##只保留以下选项:

%小知识:docker部署Macvlan实现跨主机网络通信的实现-7猿站网-插图

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

%小知识:docker部署Macvlan实现跨主机网络通信的实现-8猿站网-插图

(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

%小知识:docker部署Macvlan实现跨主机网络通信的实现-9猿站网-插图

(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

%小知识:docker部署Macvlan实现跨主机网络通信的实现-10猿站网-插图

?
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

%小知识:docker部署Macvlan实现跨主机网络通信的实现-11猿站网-插图

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

%小知识:docker部署Macvlan实现跨主机网络通信的实现-12猿站网-插图

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

[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

//确保容器正常运行:

%小知识:docker部署Macvlan实现跨主机网络通信的实现-13猿站网-插图

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

test3与test1通信(相同网段):

%小知识:docker部署Macvlan实现跨主机网络通信的实现-14猿站网-插图

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

%小知识:docker部署Macvlan实现跨主机网络通信的实现-15猿站网-插图

排错思路:如果部署完主机间无法通信的话,首先确认防火墙或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

%小知识:docker部署Macvlan实现跨主机网络通信的实现-16猿站网-插图

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

%小知识:docker部署Macvlan实现跨主机网络通信的实现-17猿站网-插图 //接下来在t1容器中操作:[root@sqm-docker03 ~]# docker exec -it t1 bin/sh

%小知识:docker部署Macvlan实现跨主机网络通信的实现-18猿站网-插图

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

%小知识:docker部署Macvlan实现跨主机网络通信的实现-19猿站网-插图

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

原文链接:https://blog.51cto.com/13972012/2446646

声明: 猿站网有关资源均来自网络搜集与网友提供,任何涉及商业盈利目的的均不得使用,否则产生的一切后果将由您自己承担! 本平台资源仅供个人学习交流、测试使用 所有内容请在下载后24小时内删除,制止非法恶意传播,不对任何下载或转载者造成的危害负任何法律责任!也请大家支持、购置正版! 。本站一律禁止以任何方式发布或转载任何违法的相关信息访客发现请向站长举报,会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。本网站的资源部分来源于网络,如有侵权烦请发送邮件至:2697268773@qq.com进行处理。
建站知识

小知识:Docker搭建Portainer可视化界面步骤详解

2023-4-1 11:46:30

建站知识

小知识:十分钟学会用docker部署微服务

2023-4-1 12:01:18

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索