DSM 7.2(Container Manager)实用记录:导出容器配置、创建 macvlan、以及宿主机访问 macvlan 容器的持久化方案

这篇文章整理我在群晖 DSM 7.2 上使用 Container Manager(Docker)时,最常用的三类操作:

  1. 把现有容器“导出”为可复用的启动配置(便于迁移、重建、备份)
  2. 启用 Open vSwitch 并创建 macvlan 网络(让容器拥有局域网独立 IP)
  3. 解决宿主机默认无法访问 macvlan 容器的问题:创建 macvlan shim,并用 systemd 做开机/随 Docker 启停的持久化

示例环境使用 ovs_eth0、网段 192.168.2.0/24、shim IP 192.168.2.252、容器 IP 192.168.2.253。请按实际网段与网卡名替换。


0. 前置条件

  • DSM 7.2 已安装 Container Manager
  • 已开启 SSH(用于执行 dockeripsystemctl 等命令)
  • 了解局域网网段、网关,并确认哪些 IP 为空闲(避免冲突)

1)导出容器配置:从现有容器反推 docker run

有些容器是通过界面点出来的,时间久了很难完整回忆当时配置。用 docker inspect 可以快速整理出“启动参数底稿”(环境变量、挂载、镜像等),用于迁移或文档记录。

1.1 导出(env + mounts + image)

docker inspect --format 'docker run -d --name {{.Name}} {{range .Config.Env}} -e "{{.}}" {{end}} {{range .Mounts}} -v {{.Source}}:{{.Destination}} {{end}} {{.Config.Image}}' 容器名称 \
| sed 's/--name \//--name /'
  • .Config.Env:环境变量(-e
  • .Mounts:挂载(-v host:container
  • .Config.Image:镜像名

注意:这份命令通常不会完整包含端口映射(-p)、重启策略(--restart)、网络(--network)、设备映射(--device)、特权(--privileged)、cap-add、labels 等。建议把这条输出作为“底稿”,再结合 docker inspect 容器名称 的完整 JSON 核对补齐。


2)开启 Open vSwitch 并创建 macvlan 网络

macvlan 的核心价值:让容器在局域网里像“独立主机”一样拥有自己的 IP,省掉复杂的端口映射,适合需要直连/标准端口的服务。

2.1 DSM 界面开启 Open vSwitch

路径:

控制面板 → 网络 → 网络界面 → 管理 → Open vSwitch 设置 → 开启

开启后,Docker macvlan 的父接口通常是 ovs_eth0(具体以系统为准)。

2.2 确认父接口名

ip link show

找到类似 ovs_eth0 的接口名。

2.3 创建 macvlan 网络

docker network create -d macvlan \
  --subnet=192.168.2.0/24 \
  --gateway=192.168.2.1 \
  -o parent=ovs_eth0 \
  macnet

验证:

docker network ls

2.4 容器加入 macvlan 并指定静态 IP(示例)

docker run -d --name myapp \
  --network macnet \
  --ip 192.168.2.253 \
  镜像:标签

建议:

  • 给 macvlan 容器分配的 IP 尽量放在 DHCP 范围之外,避免冲突
  • 如果要管理一批容器,建议提前规划一个固定 IP 段

3)宿主机默认无法访问 macvlan 容器:macvlan shim 解决方案

3.1 问题说明

macvlan 常见特性:同一台宿主机(群晖本机)默认无法直接访问挂在 macvlan 上的容器。表现为:

  • 其他局域网设备能访问容器 IP
  • 群晖本机 ping/访问容器 IP 不通

解决方式是在宿主机上创建一个额外的 macvlan 子接口(shim),并添加路由,让宿主机到容器的流量走这个 shim。


4)手工创建 shim(临时生效,重启会丢)

若只想先验证可行性,可以先用这段;确认可用后再做 systemd 持久化。

ip link add macnet-bridge link ovs_eth0 type macvlan mode bridge
ip addr add 192.168.2.252 dev macnet-bridge
ip link set macnet-bridge up
ip route add 192.168.2.253 dev macnet-bridge

解释:

  • macnet-bridge:新建的 shim 接口名(随意)
  • ovs_eth0:开启 OVS 后的父接口
  • 192.168.2.252:shim 的 IP,必须与 macvlan 网段一致且不冲突
  • 宿主机到某个容器 IP(192.168.2.253)走 shim(影响面更小)

未测试:如果希望宿主机访问整个 macvlan 网段,也可以路由整个网段:

ip route add 192.168.2.0/24 dev macnet-bridge

5)用 systemd 持久化:随 ContainerManager 启停自动创建/清理

为避免重启丢失、也方便后续维护,把 shim 的创建/清理做成一个 systemd 服务,并挂到 pkgctl-ContainerManager.service(Container Manager)上。

5.1 新建 systemd unit

新建文件:

vi /usr/local/lib/systemd/system/macnet-bridge.service

内容:

[Unit]
Description=Macvlan shim to allow docker to route to host
# After=pkgctl-ContainerManager.service
# BindsTo=pkgctl-ContainerManager.service
ReloadPropagatedFrom=pkgctl-ContainerManager.service
PartOf=pkgctl-ContainerManager.service

[Service]
Type=oneshot
ExecStart=/bin/bash /usr/local/bin/macnet-bridge_start.sh
ExecStop=/bin/bash /usr/local/bin/macnet-bridge_stop.sh
RemainAfterExit=yes
Restart=no

[Install]
WantedBy=pkgctl-ContainerManager.service

5.2 启动脚本(start)

新建文件:

vi /usr/local/bin/macnet-bridge_start.sh

内容:

sleep 120
ip link add macnet-bridge link ovs_eth0 type macvlan mode bridge
ip addr add 192.168.2.252 dev macnet-bridge
ip link set macnet-bridge up
ip route add 192.168.2.253 dev macnet-bridge

说明:

  • sleep 120:等待系统网络/OVS/ContainerManager 初始化完成(否则可能找不到接口或时序不稳定)
  • 如果有多个容器 IP 需要路由,可以在这里追加多行 ip route add ...

5.3 停止脚本(stop)

新建文件:

vi /usr/local/bin/macnet-bridge_stop.sh

内容:

ip route del 192.168.2.253 dev macnet-bridge || true
ip link set macnet-bridge down || true
ip addr del 192.168.2.252 dev macnet-bridge || true
ip link del macnet-bridge || true

5.4 赋予脚本可执行权限

chmod +x /usr/local/bin/macnet-bridge_start.sh
chmod +x /usr/local/bin/macnet-bridge_stop.sh

5.5 重新加载 systemd,并设置开机自启

systemctl daemon-reload
systemctl enable macnet-bridge

取消开机自启:

systemctl disable macnet-bridge

手工控制与查看状态:

systemctl start macnet-bridge
systemctl stop macnet-bridge
systemctl status macnet-bridge

5.6 后续维护

以后如果:

  • 新增 macvlan 容器 IP
  • 调整 shim IP
  • 更换父接口(例如从 ovs_eth0 变成 ovs_bond0
  • 需要改成路由整个网段

只需要修改这两个脚本即可:

  • /usr/local/bin/macnet-bridge_start.sh
  • /usr/local/bin/macnet-bridge_stop.sh

改完执行:

systemctl restart macnet-bridge

6)常见注意事项

  1. IP 冲突是 macvlan 最常见问题:容器 IP、shim IP 都必须避开 DHCP 和已有设备。
  2. shim IP 必须与 macvlan 同网段,否则路由不生效。
  3. 如果 ovs_eth0 不存在,先用 ip link show 确认 OVS 开启后的真实接口名。

原创文章,作者:VAY冬冬,如若转载,请注明出处:https://blog.vay1314.top/archives/563

(0)
VAY冬冬的头像VAY冬冬
上一篇 2025年1月15日 19:35
下一篇 2020年1月12日 14:27

相关推荐

0 0 投票数
文章评分
订阅评论
提醒
guest
0 评论
最旧
最新 最多投票
内联反馈
查看所有评论