docker妙用 篇十四:docker的macvlan网络不会搞?它其实很简单
提示:本篇文章约6787字符,阅读大约需要8分钟。
写在前面
今天来讲点硬货,因为张大妈上玩NAS的博主,很少有可以精通网络的。所以它们很难把docker的macvlan讲透彻,尤其是IPv6这部分。于是大部分人跟着教程,看着就会云里雾里,很难搞明白。
但是在公网IPv4地址稀缺、国家又在大力推广IPv6的状态下,你家可能没有公网IPv4,但大概率会有公网IPv6,这就成了很多人提高BT/PT下载速度、内网穿透等的神器。但是,docker默认状态的bridge网络是不带IPv6支持的,即便修改docker配置文件使其支持IPv6,也会产生不少问题。因此,在docker上配置一个macvlan网络,给每个容器分配独立的IPv4地址和IPv6地址,就成了目前最佳的选择。
但是,在众多博主的教程中,搞明白macvlan网络似乎是一件很复杂的事情。那今天本薇就告诉你,配置macvlan网络这事很简单,给它加上IPv6支持也不是什么难事!所以,一起来看看吧。
注1:本文使用设备为威联通TS-h973AX,支持QuTS hero操作系统,支持3.5寸、2.5寸和U.2固态,虽然已经是三年前发布的了,但仍然是目前很值得入手的万兆NAS。
注2:本文教程适用于Linux版本的docker,其余Mac、Windows等客户端均不支持macvlan网络。
注3:阅读本文前的必备教程有三篇,其中《不影响整体网络稳定性——iKuai只向特定设备分配IPV6地址》请一定要看一下,无论你是否使用了iKuai作为主路由使用,这篇文章都会帮助你更好地理解本文内容。
Macvlan网络的定义和工作原理
这个之前在第三期已经简单讲过原理了,今天就偷个懒,不画新图了,简单提一下,详细可以参考一下本专栏第三期,了解一下docker的三种网络模式下到底有什么区别。
Macvlan是一种特殊类型的网络设备,它允许单个物理设备拥有多个MAC地址。这样做的结果是,你可以在物理网络接口上创建一个新的虚拟网络接口,这个接口有自己的MAC地址,IP地址,以及其他网络设置。
Macvlan工作的原理是通过在数据链路层插入虚拟网络接口,使得每个接口都有自己的MAC地址,从而可以独立的接收和发送数据包。这种设计使得Macvlan设备看起来就像一台独立的物理机器,连接在同一网络中。
通俗来说,就是创建了Macvlan网络之后,如果你的容器接入了该网络,那么它就像是一台电脑,有胳(网)膊(口)有腿(网线),接在了你的路由器上,这样就可以直接获取到和你其他设备同网段的IP地址,而不需要有docker0接口再进行一层NAT,分配到一个类似于172.17.0.3的地址。
Macvlan网络的优点和缺点
Macvlan网络有一些显著的优点。首先,由于Macvlan设备直接在数据链路层工作,它们可以提供接近物理网络的性能。其次,由于Macvlan设备有自己的MAC和IP地址,它们可以直接访问网络,无需通过宿主机进行路由或NAT转换。
然而,Macvlan网络也有一些限制。最重要的一点是,由于以太网的工作原理,Macvlan设备不能和宿主机直接通信。这是因为宿主机和Macvlan设备都在同一物理网络接口上,一个网络接口不能接收到自己发送的数据包。这意味着,如果你的应用需要和宿主机通信,你需要使用其他的解决方案,例如创建一个ipvlan设备或者另一个Macvlan网络使得宿主机和docker容器进行通信。
总的来说,Macvlan网络提供了一种强大而灵活的方式,可以让Docker容器直接访问物理网络。但是,你也需要了解其局限性,以确保它适合你的应用需求。在下一部分中,我们将深入讨论如何在Docker中创建和配置Macvlan网络,包括如何配置IPv6地址。
建立macvlan
先放命令,然后我们来一步一步告诉你怎么根据自己的网络进行修改。
doer network create -d cvlan --subnet=10.10.10.0/24 --gateway=10.10.10.1 --ipv6 --subnet=fd1e:6551:6c39::/64 --gateway=fd1e:6551:6c39::1 -o parent=eth2 mbw-net
这个命令将创建一个名为mbw-net
的Docker网络,它使用macvlan驱动,IPv4子网为10.10.10.0/24
,IPv4网关为10.10.10.1
,IPv6子网为你提供的fd1e:6551:6c39::/64
,IPv6网关为fd1e:6551:6c39::1
,并且将网口指定为eth2
。
首先我们要先查看我们的网卡信息,这里使用ifconfig命令:
然后找到当前正在使用的网卡信息,我这里确认为eth2;
稍微有点网络尝试的人应该都知道IPv4这部分怎么设置,即只要设置成和你当前设备同网段的就行。
重点我们来看一下IPv6部分……
其实不用看,这里建议直接照抄。因为这部分属于我在IPv6科普文章中讲过的唯一区域地址,只能在本地网络中使用。因此其与宿主机和路由器没有任何关系,它的用途只会出现在设置docker容器时,选择与它同网段的即可。
如果,你非常有个性,实在不想照抄,那就自己随机生成一个吧:
你可以使用以下命令在fd00::/8
范围内随机生成一个/64
子网:
printf 'fd%x:%x:%x::/64n' $((RANDOM%256)) $((RANDOM%65536)) $((RANDOM%65536))
这将生成一个像fd3c:9b2d:c5c3::/64
这样的地址。然后你可以在Docker网络创建命令中使用这个地址作为你的IPv6子网,IPv6网关通常设置为子网的第一个地址,如fd3c:9b2d:c5c3::1
。
然后根据你的实际需要运行上述命令,即可新建一个macvlan网络。
最后,可以去Portainer中查看结果。
容器使用macvlan网络
这里以qb为例:
第一步:下载容器镜像;
第二步:映射文件夹;
第三步:设置网络;
第四步:更改自动重启策略;
注:这里因为每个加入macvlan网络的容器都有自己独立的IP,所以不需要映射网络端口或更改-e参数。
第五步:建立容器。
测试
IPv4测试:
使用IPv6:
这里再强调一遍,请先看下列教程,不然你很难搞明白我在干什么。
网络环境:iKuai主路由,开启IPv6,使用无状态+无状态绑定模式。
Portainer进入容器详情页,打开容器终端;
输入ifconfig命令,找到链路本地地址:
复制这个地址,加入前缀静态分配;
再次使用ifconfig命令,就能看到获取到的公网IPv6地址了。
宿主机与容器互通?
有必要吗?
根据前面基础知识的铺垫,我们知道,建立在macvlan的容器不能与宿主机互通。但是这仅仅是不能与宿主机通信,建立在macvlan网络下的docker容器之间是可以互通的。
测试
同上,我们再建立一个qb2容器:
经过测试,我们发现qb1和qb2之间可以相互ping通:
但容器无法ping通宿主机:
所以如果我们的容器需求比较少,且都建立在macvlan网络下,那就没必要建立宿主机与容器之间的通信。比如我们常用的nastool容器,其关联容器都可以建立在macvlan网络下,那么他们之间可以相互访问,就基本没必要和宿主机连通。
简易版思路
那都写到这了,肯定还是要讲一下宿主机如何和macvlan网络之间通信的。
我们刚刚写到macvlan网络是绑定网口的,那么我们可以将宿主机的另一个网口和这个绑定的网口,同时接到交换机上,然后把宿主机的需要用到的服务绑定到另一个网口,那么理论上就实现了宿主机和macvlan网络之间通信。
但是这种方法需要系统支持,比如威联通就支持绑定服务到特定端口。因此局限性较大。
通用方法
因为macvlan网路之间可以互访,那么我们只需要再另外建立一个macvlan网络,使得主机通过另一个macvlan网络来访问当前docker的macvlan网络。
第一步,在原网卡上新建macvlan网络;
ip link add cvlan-mbw link eth2 type cvlan mode bridge
第二步,设置虚拟接口IP,使其位于同一网段内;
ip addr add 10.10.10.254 dev cvlan-mbw
第三步,启动接口;
ip link set cvlan-mbw up
第四步,将建立在macvlan网络上的容器路由至该虚拟接口即可。
ip route add 10.10.10.21 dev cvlan-mbw ip route add 10.10.10.22 dev cvlan-mbw
以上命令会在重启后失效,因此需要建立脚本进行固化操作。
群晖系统可以把这些命令写入计划任务即可
好的,根据你给出的脚本,我们可以按照以下步骤将其设置为系统启动脚本:
首先,把你的脚本保存为一个文件。我们可以把它命名为
macvlan_setup.sh
。确认它的内容如下:#!/bin/ship link add cvlan-mbw link eth2 type cvlan mode bridge ip addr add 10.10.10.254 dev cvlan-mbw ip link set cvlan-mbw up ip route add 10.10.10.21 dev cvlan-mbw ip route add 10.10.10.22 dev cvlan-mbw
把这个脚本文件移动到
/etc/init.d/
目录下(或者/etc/rc.d/
,取决于你的系统)。sudo mv cvlan_setup.sh /etc/init.d/
确保脚本具有可执行权限:
sudo cod +x /etc/init.d/cvlan_setup.sh
现在,你需要使用
chkconfig
或update-rc.d
将你的脚本添加到系统服务中。这个步骤依赖于你的系统:
在基于Red Hat的系统中(如CentOS或Fedora),你可以使用
chkconfig
命令:sudo chkconfig —add macvlan_setup.sh
在基于Debian的系统中(如Ubuntu或Debian本身),你可以使用
update-rc.d
命令:sudo update-rc.d macvlan_setup.sh defaults
以上步骤在系统启动时将会执行你的脚本。但是需要注意,该脚本运行所需的所有权限都必须在系统启动时可用。换句话说,如果你的脚本需要特定的用户权限或环境变量,你需要确保这些在系统启动时已经设置好。
总结
今天基本就把docker的macvlan网络模式的应用基本讲清楚了,值友们在使用过程中有什么问题或者本文有什么疏漏,欢迎各位在评论区批评指正。
这就是本期的全部内容了,如果这篇文章对您有帮助的话,欢迎您在评论区多多讨论,也欢迎关注、点赞、打赏一键三连,您的支持对我非常重要。
我是冥冰薇,点个关注不迷路,我们下期再见。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
冥冰薇
校验提示文案
冥冰薇
校验提示文案
大地鼠
校验提示文案
奔放拿一血
校验提示文案
值友1820851302
请问怎么操作,谢谢
校验提示文案
V怪客
校验提示文案
藏锋入鞘
校验提示文案
show89
校验提示文案
值友4101817968
校验提示文案
拙计
校验提示文案
黑人_彬
校验提示文案
闲逛的花花草草
校验提示文案
爱折腾的老狐狸
校验提示文案
啥都没有
校验提示文案
隔壁的七大叔
校验提示文案
技术宅是我梦想
校验提示文案
值友6840629272
校验提示文案
值友3748872358
校验提示文案
吴顶天
#宿主机创建一个macvlan
ip link add macvlan2 link br-lan type macvlan mode bridge
#设置macvlan ip 并启用
ip addr add 192.168.31.240 dev macvlan2
#启用新建网络
ip link set macvlan2 up
#增加路由表
ip route add 192.168.31.45 dev macvlan2
按照这个方法 重启以后macvlan就没了
校验提示文案
值友3748872358
校验提示文案
V怪客
校验提示文案
garryguo123
校验提示文案
garryguo123
校验提示文案
杯具上演帝
校验提示文案
值友3748872358
校验提示文案
吴顶天
#宿主机创建一个macvlan
ip link add macvlan2 link br-lan type macvlan mode bridge
#设置macvlan ip 并启用
ip addr add 192.168.31.240 dev macvlan2
#启用新建网络
ip link set macvlan2 up
#增加路由表
ip route add 192.168.31.45 dev macvlan2
按照这个方法 重启以后macvlan就没了
校验提示文案
值友3748872358
校验提示文案
值友1820851302
请问怎么操作,谢谢
校验提示文案
值友6840629272
校验提示文案
技术宅是我梦想
校验提示文案
隔壁的七大叔
校验提示文案
啥都没有
校验提示文案
show89
校验提示文案
爱折腾的老狐狸
校验提示文案
奔放拿一血
校验提示文案
藏锋入鞘
校验提示文案
冥冰薇
校验提示文案
闲逛的花花草草
校验提示文案
黑人_彬
校验提示文案
拙计
校验提示文案