群晖 DSM 7.3 和 DSM 7.2 自带的 Container Manager,图形界面默认主要支持基础的 bridge 和 host 网络。如果 NAS 有多块网卡,例如 LAN1 接内网、LAN2 接独立软路由或另一个网段,而你希望某些容器固定走 LAN2,或者直接在 LAN2 网段拿到一个独立 IP,就需要借助 Docker 的 macvlan 网络。
常见需求可以分成两类:
- 让容器绑定某块物理网卡,并获得该网段的独立 IP;
- 让容器同时接入默认
bridge网络和指定网卡的macvlan网络。
下面以第二块网卡 ovs_eth1、LAN2 网段 192.168.2.0/24 为例说明。实际使用时,请按自己的网段、网关和网卡名称修改命令。
先确认物理网卡名称
先在 DSM 中开启 SSH,然后登录群晖执行:
|
|
如果群晖已经开启 Open vSwitch,网卡名称通常会变成 ovs_eth0、ovs_eth1 这类形式。安装过 Virtual Machine Manager 的机器,多数会自动启用 Open vSwitch。
如果没有开启 Open vSwitch,网卡名称通常是 eth0、eth1。
假设要让容器走第二块网卡,后面示例统一使用 ovs_eth1。如果你的机器没有启用 Open vSwitch,就把命令里的 ovs_eth1 改成实际看到的 eth1 或其他名称。
场景一:容器使用指定网卡的独立 IP
这是最常见的用法,适合 Pi-hole、AdGuard Home、下载器、网关类服务等场景。目标是让容器直接出现在 LAN2 网段里,拥有一个类似物理设备的 IP,而不是只藏在群晖默认 Docker 网段后面。
Container Manager 图形界面不能直接创建 macvlan 网络,需要先通过 SSH 创建一次:
|
|
参数含义如下:
-d macvlan:使用macvlan驱动;--subnet=192.168.2.0/24:LAN2 所在的完整网段;--gateway=192.168.2.1:LAN2 网段的网关,一般是路由器 IP;--ip-range=192.168.2.200/29:限制 Docker 可分配的 IP 范围,避免和手机、电脑、电视等设备冲突;-o parent=ovs_eth1:指定绑定哪块物理网卡;custom_lan2_net:给这个 Docker 网络起的名字。
创建完成后,打开 DSM 的 Container Manager,进入左侧“网络”页面,就能看到 custom_lan2_net。后续可以在图形界面里把已有容器加入这个网络,也可以在新建容器时选择它,并给容器指定该网段内的固定 IP。
场景二:容器同时连接多个网络
有些容器需要同时出现在多个网络里。例如它既要能被群晖宿主机通过默认 bridge 网段访问,又要在 LAN2 中拥有独立物理网段 IP。此时可以让容器同时拥有两块虚拟网卡。
方法 A:在图形界面追加网络
先按普通方式创建容器,并选择一个主网络,例如默认的 bridge。容器创建完成后先不要启动;如果已经启动,先停止容器。
然后进入 Container Manager 的“网络”页面,选中刚创建的 custom_lan2_net,点击“管理”,在列表中勾选目标容器并保存。这样容器启动后,内部通常会同时出现 eth0 和 eth1 两块虚拟网卡。
这个方法最适合偶尔配置一两个容器,操作简单,也不需要改 Compose 文件。
方法 B:用项目功能编写 Docker Compose
如果你习惯使用 Container Manager 的“项目”功能,也可以直接在 docker-compose.yml 中声明多个网络:
|
|
这里的 custom_lan2_net 是前面通过 SSH 创建好的 macvlan 网络。bridge 则引用群晖自带的 Docker 默认网络。
需要注意的是,示例中的 172.20.0.10 只有在你的默认桥接网络确实使用这个网段时才适用。普通群晖 Docker 默认 bridge 更常见的是 172.17.0.0/16,实际地址应以 docker network inspect bridge 的结果为准。
Macvlan 的宿主机互通问题
macvlan 有一个很容易踩坑的限制:Linux 内核默认不允许宿主机通过同一个 macvlan 接口直接访问容器。
也就是说,如果容器只加入 custom_lan2_net,群晖 DSM 本身可能无法通过 LAN2 的物理网段 IP 访问这个容器,容器也无法通过这个接口直接访问宿主机。
常见解决方式有两种:
- 让容器同时加入默认
bridge网络,群晖通过bridge分配的 Docker 内网地址访问它; - 在群晖上额外创建一个宿主机侧的
macvlan子接口,让宿主机也进入同一个macvlan通信域。
第二种方式更接近网络工程配置,维护成本也更高。大多数家庭或小型办公场景,用“bridge + macvlan 双网络”会更省心。
IP 冲突要提前规避
使用 macvlan 时,容器 IP 会直接出现在物理局域网里,所以一定要避免和 DHCP 自动分配的地址池冲突。
建议在主路由里把 Docker 专用地址段排除出去。例如你计划把 192.168.2.200/29 分给 Docker,就不要让路由器再把 192.168.2.200 到 192.168.2.207 分配给手机、电脑或其他设备。
如果路由器不方便设置 DHCP 排除范围,至少也要给容器使用一段不太可能被自动分配的高位地址,并做好记录。
如何开启 Open vSwitch
在 DSM 7.x 中,Open vSwitch 可以通过图形界面开启,不需要手动改底层配置。最省心的方法是安装群晖官方的 Virtual Machine Manager,因为虚拟机网络桥接依赖 Open vSwitch,安装向导会自动提示启用。
操作步骤:
- 打开 DSM 的“套件中心”;
- 搜索并安装
Virtual Machine Manager; - 打开套件,按向导提示启用 Open vSwitch;
- 等待网络服务重启。
如果不想安装 VMM,也可以在控制面板里手动开启:
- 打开“控制面板”;
- 进入“网络”;
- 切到“网络界面”标签页;
- 点击“管理”,选择“Open vSwitch 设置”;
- 勾选“启用 Open vSwitch”,然后应用。
应用后,群晖网卡会重新初始化,浏览器连接通常会短暂断开几秒。不要在 NAS 正在传输大文件或执行重要写入任务时操作。
验证 Open vSwitch 是否生效
图形界面里,可以回到“控制面板 -> 网络 -> 网络界面”查看网卡状态,管理菜单里也会显示 Open vSwitch 相关设置。
命令行里,可以再次执行:
|
|
或者:
|
|
如果看到 ovs_eth0、ovs_eth1 这类接口,说明 Open vSwitch 已经生效。之后创建 macvlan 网络时,-o parent= 后面就要填写带 ovs_ 前缀的接口名,例如:
|
|
如果仍然写成 eth1,Docker 容器可能无法通过预期的网卡联网。
配置前的检查清单
实际动手前,建议先确认这几件事:
- 群晖一共有几块物理网卡,哪些网口已经插线;
- 每个网口分别接入哪个交换机、路由器或 VLAN;
- 目标网卡在 DSM 中显示为
ethX还是ovs_ethX; --subnet和--gateway是否属于目标网卡所在网段;--ip-range是否已经从 DHCP 地址池中排除;- 容器是否需要被群晖宿主机访问,如果需要,最好同时加入
bridge网络。
只要网卡名称、网段和 IP 池没有写错,DSM 7.3 的 Container Manager 完全可以配合 macvlan 实现多网卡容器部署。图形界面负责日常管理,SSH 只需要用来创建底层网络,后续维护成本并不高。