docker妙用 篇十四:docker的macvlan网络不会搞?它其实很简单

2023-06-18 14:32:06 28点赞 169收藏 40评论

提示:本篇文章约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。

威联通(QNAP)TS-h973AX8G9盘位万兆nas网络存储服务器混合式硬盘配置私有云盘(无内置硬盘)7800元旗舰级9盘位Nas存储,双2.5GbE+10GbE有线网口,四核心八线程处理器。京东去购买

注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

随机生成IPv6本地地址随机生成IPv6本地地址

然后根据你的实际需要运行上述命令,即可新建一个macvlan网络。

最后,可以去Portainer中查看结果。

macvlan网络macvlan网络

容器使用macvlan网络

这里以qb为例:

第一步:下载容器镜像;

下载qb镜像下载qb镜像

第二步:映射文件夹;

映射文件夹映射文件夹

第三步:设置网络;

设置网络设置网络

第四步:更改自动重启策略;

更改自动重启策略更改自动重启策略

注:这里因为每个加入macvlan网络的容器都有自己独立的IP,所以不需要映射网络端口或更改-e参数。

第五步:建立容器。

测试

IPv4测试:

IPv4访问成功IPv4访问成功

使用IPv6:

这里再强调一遍,请先看下列教程,不然你很难搞明白我在干什么。

网络环境:iKuai主路由,开启IPv6,使用无状态+无状态绑定模式。

ikuai网络设置ikuai网络设置

Portainer进入容器详情页,打开容器终端;

连接容器终端连接容器终端

点击连接点击连接

输入ifconfig命令,找到链路本地地址:

找到IPv6链路本地地址找到IPv6链路本地地址

复制这个地址,加入前缀静态分配

加入前缀静态分配加入前缀静态分配

再次使用ifconfig命令,就能看到获取到的公网IPv6地址了

获取到公网IPv6地址获取到公网IPv6地址

宿主机与容器互通?

有必要吗?

根据前面基础知识的铺垫,我们知道,建立在macvlan的容器不能与宿主机互通。但是这仅仅是不能与宿主机通信,建立在macvlan网络下的docker容器之间是可以互通的

测试

同上,我们再建立一个qb2容器:

配置qb2网络配置qb2网络

经过测试,我们发现qb1和qb2之间可以相互ping通

容器之间可以相互ping通容器之间可以相互ping通

但容器无法ping通宿主机:

无法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

以上命令会在重启后失效,因此需要建立脚本进行固化操作。

群晖系统可以把这些命令写入计划任务即可

好的,根据你给出的脚本,我们可以按照以下步骤将其设置为系统启动脚本:

  1. 首先,把你的脚本保存为一个文件。我们可以把它命名为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

  2. 把这个脚本文件移动到/etc/init.d/目录下(或者/etc/rc.d/,取决于你的系统)。

    sudo mv cvlan_setup.sh /etc/init.d/

  3. 确保脚本具有可执行权限:

    sudo cod +x /etc/init.d/cvlan_setup.sh

  4. 现在,你需要使用chkconfigupdate-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网络模式的应用基本讲清楚了,值友们在使用过程中有什么问题或者本文有什么疏漏,欢迎各位在评论区批评指正。

这就是本期的全部内容了,如果这篇文章对您有帮助的话,欢迎您在评论区多多讨论,也欢迎关注、点赞、打赏一键三连,您的支持对我非常重要。

我是冥冰薇,点个关注不迷路,我们下期再见。

docker的macvlan网络不会搞?它其实很简单

作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

展开 收起

QNAP 威联通 TS-464C2 四盘位 NAS网络存储(赛扬N5095、8GB)黑色

QNAP 威联通 TS-464C2 四盘位 NAS网络存储(赛扬N5095、8GB)黑色

2699元起

QNAP 威联通 TS-466C 四盘位NAS(奔腾N6005、8GB)

QNAP 威联通 TS-466C 四盘位NAS(奔腾N6005、8GB)

3299元起

QNAP 威联通 TS-464C 4盘位NAS(赛扬N5095、8GB)

QNAP 威联通 TS-464C 4盘位NAS(赛扬N5095、8GB)

2099元起

QNAP 威联通 TS-216 双盘位NAS (ARM Cortex A55、2GB)

QNAP 威联通 TS-216 双盘位NAS (ARM Cortex A55、2GB)

1199元起

QNAP 威联通 TS-462C 4盘位NAS(赛扬N4505、4GB)

QNAP 威联通 TS-462C 4盘位NAS(赛扬N4505、4GB)

1899元起

QNAP 威联通 TS-564 五盘位NAS (N5105、8GB)

QNAP 威联通 TS-564 五盘位NAS (N5105、8GB)

2000元起

QNAP 威联通 TS-464C2 4盘位NAS(赛扬N5095、8GB)

QNAP 威联通 TS-464C2 4盘位NAS(赛扬N5095、8GB)

2699元起

QNAP 威联通 TS-262C 双盘位NAS(赛扬N4505、4GB)

QNAP 威联通 TS-262C 双盘位NAS(赛扬N4505、4GB)

1699元起

QNAP 威联通 TS-464C 4盘位NAS 黑色(赛扬N5095、8GB)

QNAP 威联通 TS-464C 4盘位NAS 黑色(赛扬N5095、8GB)

3499元起

QNAP 威联通 TS-873A 8盘NAS(V1500B、8GB)

QNAP 威联通 TS-873A 8盘NAS(V1500B、8GB)

7480元起

QNAP 威联通 TS-416 四盘位NAS(Cortex-A55、4GB)

QNAP 威联通 TS-416 四盘位NAS(Cortex-A55、4GB)

1599元起

QNAP 威联通 TS-264C-4G 双盘位 NAS存储(N5105、4GB)

QNAP 威联通 TS-264C-4G 双盘位 NAS存储(N5105、4GB)

2000.13元起

QNAP 威联通 TS-264C 宇宙魔方 8G内存2盘位四核心处理器网络存储服务器内置双 M.2 插槽NAS私有云

QNAP 威联通 TS-264C 宇宙魔方 8G内存2盘位四核心处理器网络存储服务器内置双 M.2 插槽NAS私有云

1899元起

QNAP 威联通 TS-212P3 双盘位NAS(Realtek RTD1295、1GB)

QNAP 威联通 TS-212P3 双盘位NAS(Realtek RTD1295、1GB)

799元起

QNAP 威联通 TS-453Bmini 4盘位NAS(J3455、4GB)

QNAP 威联通 TS-453Bmini 4盘位NAS(J3455、4GB)

1899元起

QNAP 威联通 TS-551 5盘位NAS(赛扬J3355、2GB)

QNAP 威联通 TS-551 5盘位NAS(赛扬J3355、2GB)

暂无报价

文中相关商品

京东 QNAP 威联通 TS-h973AX 9盘位NAS(V1500B、8GB)
40评论

  • 精彩
  • 最新
  • 置顶 显示出来的命令有问题,属于张大妈编辑器问题,并非我提交的问题,如需使用请不要直接复制命令

    校验提示文案

    提交
    如部署过程中有任何问题,请直接在本条评论下面回复

    校验提示文案

    提交
    大佬,一开始是在哪里输命令 [喜极而泣]

    校验提示文案

    提交
    还有1条回复
    收起所有回复
  • 置顶 各位,是我最近写的太难了吗。来点评论啊 [喜极而泣] [喜极而泣]

    校验提示文案

    提交
    那我来评论一个。我创建了好几个容器,都是用macvlan方式,同时都统一用80端口映射到对应容器的端口。奇怪的是这些容器,都不能用80端口访问,只能使用容器本身的端口访问。也就是说这个端口映射并没有起作用,这是为什么呢?macvlan和端口映射方式,只能2选1吗?

    校验提示文案

    提交
    收起所有回复
  • 技术贴,先顶一下。以前一直现在威联通下创建 macvlan,但是没成功。技术文档好像说威联通要用自己的 qnet。可惜建完 qnet 后连不上。等有时间,按照楼主的教程试试 [赞一个]

    校验提示文案

    提交
    我这个就是在威联通的nas上建的,实测没问题,祝你成功 [高兴]

    校验提示文案

    提交
    收起所有回复
  • 大佬 我有块1T3.5的硬盘 想入门nas 能够支持docker 最经济稳定的是怎样选择 一直没找到能分析透的文章

    校验提示文案

    提交
    面对这种需求一般建议就是找个旧电脑接上硬盘,装个windows先玩一玩。高端一点,去某宝找一个能装黑群晖的店铺指导你在线装一个。就docker来说,全平台都支持,哪个平台都能用。nas最主要的需求实际上是你有没有精力和兴趣去折腾,你看我这篇教程,即便再详细,也需要你一步一步跟着操作,可能中间还会产生我每提到的各种问题,这都需要时间和精力去解决。所以,不着急买设备,先找一台旧设备练练手。

    校验提示文案

    提交
    好的 感谢 我先重公司笔记本开始 [跑步鸭_嗨]

    校验提示文案

    提交
    收起所有回复
  • 请问大佬,我的现在问题就是,nastool在brige,qb在macvlan,nastool找不到qb,按您说的,把nastool加到macvlan,就是让nastool既在brige 又在macvlan?
    请问怎么操作,谢谢

    校验提示文案

    提交
    nastool加进macvlan就行,赋予一个单独的IP地址,这个是最简单的

    校验提示文案

    提交
    就是原来bridge的nastool不要了,重新在macvlan里面建立nastool?

    校验提示文案

    提交
    还有3条回复
    收起所有回复
  • 写的很好,portainer里查看macvlan也创建成功了,创建容器时选择macvlan总是提示什么request 500之类的,看了好几个帖子都没有搞成 [狂汗]

    校验提示文案

    提交
    你用的什么nas,绿联的话现在可以创建macvlan,但是无法加入容器的

    校验提示文案

    提交
    威联通。 Docker run/ docker compose/, Portainer/,各种创建方式都尝试过了 [皱眉]

    校验提示文案

    提交
    还有2条回复
    收起所有回复
  • 之前尝试过 openwrt 在 docker 下运行时 macvlan 必要且好用

    校验提示文案

    提交
  • docker查询注册表失败,怎么解决啊?

    校验提示文案

    提交
    docker创建一个op,或者新建一个op虚拟机。
    op做旁路由。
    具体可以看b站各路大神视频,和站里的教程

    校验提示文案

    提交
    收起所有回复
  • 支持一下,挺有用的

    校验提示文案

    提交
  • 有点复杂

    校验提示文案

    提交
  • 有空试一下

    校验提示文案

    提交
  • 正在学习中

    校验提示文案

    提交
  • 功能好强大啊

    校验提示文案

    提交
  • 618优惠还是双十一优惠?

    校验提示文案

    提交
  • 学习使我快乐!随时看不大懂

    校验提示文案

    提交
  • 加油大佬

    校验提示文案

    提交
  • 没太看懂,但是我移动大内网有IPV6,没有4,开始也是开了防火墙,Docker里面的应用一个都不能DDNS访问,后面改成host就可以了,大佬这个是不我这情况解决起来更麻烦?感觉需要每个dock应用一个对应v6的ddns?而我现在只要改端口就行

    校验提示文案

    提交
  • 有个问题,macvlan模式下docker的ipv6是无状态的,导致爱快无法管理到,如何ddns

    校验提示文案

    提交
  • #配置宿主机和容器通讯
    #宿主机创建一个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就没了

    校验提示文案

    提交
  • 把nt,jellyfin,emby,qb,pt分配到macvlan下面,各自获取到了ipv4和ipv6,目前唯一的问题是无法给这些docker获取到的ipv6地址做ddns,因为没有唯一的UDI,测试了各种办法,无解。

    校验提示文案

    提交
提示信息

取消
确认
评论举报

相关好价推荐
查看更多好价

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
169
扫一下,分享更方便,购买更轻松