这篇文章整理我在群晖 DSM 7.2 上使用 Container Manager(Docker)时,最常用的三类操作:
- 把现有容器“导出”为可复用的启动配置(便于迁移、重建、备份)
- 启用 Open vSwitch 并创建 macvlan 网络(让容器拥有局域网独立 IP)
- 解决宿主机默认无法访问 macvlan 容器的问题:创建 macvlan shim,并用 systemd 做开机/随 Docker 启停的持久化
示例环境使用
ovs_eth0、网段192.168.2.0/24、shim IP192.168.2.252、容器 IP192.168.2.253。请按实际网段与网卡名替换。
0. 前置条件
- DSM 7.2 已安装 Container Manager
- 已开启 SSH(用于执行
docker、ip、systemctl等命令) - 了解局域网网段、网关,并确认哪些 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)常见注意事项
- IP 冲突是 macvlan 最常见问题:容器 IP、shim IP 都必须避开 DHCP 和已有设备。
- shim IP 必须与 macvlan 同网段,否则路由不生效。
- 如果
ovs_eth0不存在,先用ip link show确认 OVS 开启后的真实接口名。
原创文章,作者:VAY冬冬,如若转载,请注明出处:https://blog.vay1314.top/archives/563