写在前面
今天来讲点硬货,因为张大妈上玩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网络模式的应用基本讲清楚了,值友们在使用过程中有什么问题或者本文有什么疏漏,欢迎各位在评论区批评指正。