技术笔记

Container Manager 与 Virtual Machine Manager:群晖上跑 Docker 和虚拟机的正确姿势

yaobingbin yaobingbin · · 约 9 分钟 · 0 条评论

先搞清楚一件事:Docker 不是虚拟机

很多 NAS 新手的第一误区,是把 Docker 当成”轻量虚拟机”。这个理解会让后面一堆配置变得莫名其妙。

容器(Docker) 虚拟机(VMM)
隔离层 共享宿主机内核 独立内核,完整虚拟化
启动速度 秒级 几十秒到几分钟
资源占用 很低 较高,要预留固定资源
能否跑非 Linux 不能 能(Windows、Linux 各发行版)
能否改内核参数 不能 能
迁移性 强,镜像通用 弱,镜像和平台绑定紧

判断准则就一条:如果你只是想跑一个服务(网站、数据库、下载工具、影音套件),用容器。如果你需要一个完整的操作系统环境,才用虚拟机。

群晖上 90% 的需求是前者。

Container Manager:DSM 7.2 之后的变化

Docker 套件在 DSM 7.2 之后更名为 Container Manager,界面和功能都有调整。

主要变化:

项目 老 Docker 套件 Container Manager
项目(Compose)支持 较弱 一等公民,界面直接编辑 YAML
镜像仓库管理 简单 更完善,支持多 registry
网络管理 bridge 为主 界面能看到 macvlan 等网络
日志 简陋 有独立的日志面板

还有一个重要变化:不再支持 Node.js v14/v16 和旧版 PHP,这条是在 DSM 7.3 里砍掉的,会波及一些依赖旧运行时的第三方套件。

项目模式(Docker Compose)才是正确用法

群晖界面里可以直接点”容器→创建单个容器”,但我强烈建议用项目(Project)模式。

原因:

1. 可复现。配置写在 YAML 里,重装系统后一行命令就能跑回来 2. 便于迁移。同一份 compose 文件可以贴在任何支持 Docker 的设备上 3. 管理集中。一个项目的所有容器、网络、卷一目了然 4. 便于备份。compose 文件本身就是文档

一个标准的 compose 示例

version: "3.8"

services:
  jellyfin:
    image: jellyfin/jellyfin:latest
    container_name: jellyfin
    restart: unless-stopped
    environment:
      - TZ=Asia/Shanghai
      - PUID=1026
      - PGID=100
    volumes:
      - /volume1/docker/jellyfin/config:/config
      - /volume1/docker/jellyfin/cache:/cache
      - /volume1/media:/media:ro
    devices:
      - /dev/dri:/dev/dri
    ports:
      - 8096:8096
    network_mode: bridge

几点说明:

  • restart: unless-stopped 比 always 更合理,手动停了不会自动重启
  • PUID/PGID 用 SSH 执行 id 用户名 查
  • /dev/dri 是硬件转码的关键,只有 Intel 核显机型才有
  • 媒体目录 :ro 只读挂载,防止容器内程序误删源文件

目录布局建议

强烈建议在共享文件夹下建立统一的 docker 目录:

/volume1/docker/
├── jellyfin/
│   ├── config/
│   └── cache/
├── nginx/
│   └── config/
└── compose/
    └── jellyfin.yml

这样做的好处:

  • Hyper Backup 只要备份 docker 目录就覆盖了所有容器配置
  • 迁移时整个目录打包带走
  • 权限统一处理,不会出现到处找文件的情况

注意:不要把容器配置散落在各个随机目录,也不要直接放在 volume1 根下。

网络模式怎么选

这是群晖 Docker 最容易踩坑的地方。

模式 特点 适用场景
bridge(默认) 容器在独立网段,通过端口映射访问 绝大多数场景
host 容器直接用宿主机网络栈 需要大量端口、或需要广播发现的服务
macvlan 容器获得局域网独立 IP 需要容器像独立设备一样出现在局域网

默认建议用 bridge。简单、安全,出问题容易排查。

什么时候用 macvlan?

典型场景:你想跑一个服务,它需要在局域网里被自动发现(比如某些 DLNA 服务器、Home Assistant 的设备发现),或者你不想做一堆端口映射。

macvlan 的两个已知坑:

1. 宿主机和容器之间无法直接通信(这是 macvlan 协议的固有限制),解决方法是用专门的 workaround 或增加一条 host 网络 route 2. 群晖重启后偶尔出现网络不通,需要重启容器或重建网络

所以对新手:除非明确知道为什么需要 macvlan,否则不要用。

更新容器的正确流程

群晖界面上有”更新”按钮,但更稳妥的做法:

1. 先看清楚容器是否正在占用重要数据 2. 检查目标镜像的更新日志(尤其是 major version 变更) 3. 把 compose 文件里的 tag 改明确,不要用 latest 盲目追新 4. 拉取新镜像 → 重建容器(UI 里的”重置”或 compose 的 up -d) 5. 确认服务起来了再把旧镜像删掉

关于 latest 标签:方便,但危险。生产环境(哪怕是家庭的生产环境)建议锁定主版本号,比如 jellyfin/jellyfin:10.9,然后手动决定何时升。

Virtual Machine Manager:什么时候才该用

VMM 是群晖基于 KVM 的虚拟机套件,DSM 7 之后的版本功能已经比较完整。

适合用虚拟机的场景:

  • 需要跑 Windows(跑个国产软件、老版 Office)
  • 需要完整 Linux 发行版做开发测试
  • 需要改内核、加载特殊模块
  • 需要跑完整发行版做开发、编译、内核实验
  • 做软路由(OpenWrt)

不适合用虚拟机的场景:

  • 只是想跑个服务 → 用容器
  • 老旧入门机型 → 根本跑不动

机型适配的真实情况

VMM 对硬件有要求,不是所有群晖都能跑:

建议 机型
可以跑 Plus 系列(DS225+、DS425+、DS725+、DS925+、DS1525+ 等)、XS 系列、部分机架机型
勉强能跑 老 Plus(DS920+、DS1621+ 等),跑一两个轻量 VM
别碰 J 系列(ARM CPU,不支持 VMM)

内存是第一瓶颈。跑一个 Windows 虚拟机,给 4GB 内存是比较合理的起点,而很多群晖机型出厂只有 2GB 或 4GB。

所以虚拟机用户的第一笔投资通常是:加内存 + 加 SSD。

关于 SSD:

  • 虚拟机磁盘一定要放在 SSD 存储池上,放机械盘会慢到无法使用
  • 有 M.2 槽的机型,建议用两条 NVMe 做 RAID 1 存储池专门放虚拟机
  • 没有 M.2 的机型,可以考虑用 SATA SSD 替换一块盘位

两者的搭配建议

典型的家庭/小办公室组合:

层 技术 例子
基础设施 Container Manager Nginx 反向代理、DDNS、监控(Uptime Kuma)
服务层 Container Manager Jellyfin、Home Assistant、数据库、下载工具
特殊需求 VMM Windows 跑特定软件、OpenWrt 软路由
存储 NAS 共享文件夹 通过 NFS/SMB 挂载给容器或 VM

一个实用技巧:用 Nginx Proxy Manager(容器)做统一入口 + 群晖申请 Let’s Encrypt 证书,这样所有服务都能用 https://xxx.你的域名 访问,不用记一堆端口号。

资源控制的经验值

给容器和虚拟机设限制,避免一个服务失控拖垮整个 NAS:

资源 建议
容器内存限制 按服务文档建议值 ×1.5,不要不设限
虚拟机内存 固定分配,不要过度承诺(overcommit)
CPU 限制 家庭环境一般不用设,但下载类容器建议限一下
总资源占用 给 DSM 自己留至少 1~2GB 内存

群晖的资源监控面板在 Resource Monitor 里,养成偶尔看一眼的习惯。

备份策略

这是最容易被跳过但最重要的一环:

容器要备份的是两部分:

1. 配置文件(docker/xxx/config 目录)→ 纳入 Hyper Backup 2. compose 文件本身 → 建议放在 NAS 上并有版本管理,甚至可以放一份到 Git

虚拟机要备份:

  • VMM 有快照功能,做操作前打快照
  • 整机导出可以做冷备
  • 更重要的是 Hyper Backup 里勾选 VMM 相关目录

记住原则:容器和虚拟机里不要存任何不可重建的数据。所有重要数据都应该通过挂载卷放在 NAS 的共享文件夹里,这样它天然享受你配置的备份和快照保护。

常见故障速查

现象 常见原因 处理
容器起来就退出 配置有误或端口冲突 看日志,先查 compose 里的端口是否被占用
无法访问服务 端口未映射、防火墙 检查 ports 配置和 DSM 防火墙
容器内无法写文件 权限不匹配 查 PUID/PGID,或给目录加 Everyone 权限测试
硬件转码不生效 设备未映射或 CPU 不支持 确认 /dev/dri 存在且 CPU 有核显
macvlan 容器失联 macvlan 协议限制 换回 bridge,或增加 host route
VMM 无法启动 机型不支持或 BIOS 虚拟化未开 查官方兼容性列表
微信搜一搜 纳思Note
评论经后台审核通过后显示 · 请勿发布广告、外链或无关内容

发表评论

邮箱地址不会被公开。填写昵称与邮箱后方可评论。