群晖NAS Docker容器实战:从权限配置到最佳容器选型避坑指南
1. 为什么群晖上跑Docker和普通Linux主机完全不是一回事
很多人第一次在群晖上装Docker,脑子里想的是"不就是台Linux嘛,apt install docker-ce走起"。结果SSH进去敲了两行命令就发现,群晖的DSM系统压根不是标准Linux发行版那套玩法——没有systemd,包管理器是它自己的opkg,内核版本被Synology锁得死死的,连iptables规则都被DSM的防火墙模块接管了。你要是按网上那些Ubuntu装Docker的教程硬来,轻则Docker服务起不来,重则把DSM的网络配置搞崩,最后只能重置系统。
我在自己的DS920+和一台老DS218+上折腾了三年多,前前后后跑过四十多个容器,踩过的坑足够写一本小册子。这篇内容就是把这几年积累下来的经验整理出来,告诉你哪些容器真正值得在群晖上长期跑,哪些看起来很美实际上会把你拖进无尽的排错深渊,以及每个容器在群晖这个特殊环境里需要注意什么。
先说清楚群晖Docker的三个特殊性,这决定了后面所有容器选型和配置的逻辑。
第一,群晖的Docker是Synology自己打包的版本。 DSM 7.x之后套件中心里的"Container Manager"(以前叫Docker套件)底层还是Docker Engine,但版本更新完全跟着DSM走,你没法自己升级。DSM 7.2自带的大概是Docker 24.x,这个版本不算新但足够用。问题在于,有些容器镜像要求更高的API版本,或者依赖某些新内核特性(比如cgroup v2的完整支持),在群晖上就会出各种幺蛾子。
第二,群晖的存储路径和权限模型很特别。 你的数据卷都在/volume1、/volume2下面,但Docker容器默认以root运行,而群晖的共享文件夹权限是给DSM用户设计的。这就导致一个经典问题:容器写文件到挂载的目录时,要么权限不够写不进去,要么写进去的文件属主变成了一串奇怪的UID,你在File Station里看着就是"未知用户",想删都删不掉。解决办法后面会详细讲,核心就是PUID/PGID这两个环境变量的正确设置。
第三,群晖的内存和CPU资源有限。 大部分家用群晖是赛扬或AMD嵌入式处理器,内存从2GB到8GB不等。你不可能像在服务器上那样随便跑几十个容器,必须精挑细选。一个MySQL容器吃你1GB内存,一个GitLab吃你4GB,再跑个监控系统,机器直接卡死。所以"最佳容器"这个命题,在群晖语境下首先要回答的是"哪些容器在资源受限的情况下依然能稳定提供价值"。
理解了这三点,我们才能进入正题。下面我会按功能分类,把每个容器的选型理由、群晖上的特殊配置、以及我实际跑下来的体验都讲清楚。
2. 媒体与影音类:群晖NAS最核心的使用场景
买群晖的人十个里有八个是为了搞家庭影音库,所以媒体类容器是重中之重。但这里有个误区:很多人一上来就装Plex或Jellyfin,结果发现群晖自带的Video Station其实也能用。那到底该不该上容器版的媒体服务器?我的答案是:如果你有转码需求、需要多设备同步观看进度、或者想用更强大的刮削器,那必须上容器;如果只是局域网内简单看看,Video Station凑合能用。
2.1 Jellyfin:开源媒体服务器的首选
Jellyfin是我在群晖上跑得最久的容器,没有之一。选它而不是Plex的理由很简单:Plex的硬件转码要买Plex Pass,而且它的账号体系依赖外部服务器,哪天网络抽风你就看不了自己的电影。Jellyfin完全本地化,开源免费,硬件转码在支持的群晖机型上直接可用。
在群晖上部署Jellyfin,官方推荐用jellyfin/jellyfin镜像,但我要提醒你注意几个关键点。
硬件转码的配置。 群晖的Intel机型(比如DS920+、DS1520+)带Intel Quick Sync Video,Jellyfin可以通过/dev/dri设备访问它。但DSM默认不给普通容器访问这个设备,你需要在创建容器时勾选"启用执行命令"或者用SSH方式加--device /dev/dri:/dev/dri参数。更麻烦的是,群晖的/dev/dri权限默认只有root能访问,你得SSH进去执行chmod 666 /dev/dri/renderD128,而且这个权限在DSM重启后会重置,需要写个开机脚本。
我实测下来,DS920+用Jellyfin硬解4K HEVC 10bit,CPU占用从软解的90%降到15%左右,效果非常明显。但如果你用的是ARM架构的群晖(比如DS223),那就别指望硬解了,老老实实看1080p吧。
媒体库路径的挂载。 群晖的媒体文件通常放在/volume1/video这样的共享文件夹里。挂载到容器时,建议用只读模式(:ro),防止Jellyfin误删你的原片。配置路径和缓存路径则要挂载到有写入权限的目录,我一般放在/volume1/docker/jellyfin/config和/volume1/docker/jellyfin/cache。
PUID和PGID的设置。 这是群晖Docker最关键的配置。你需要SSH进去执行id 你的用户名,拿到UID和GID(通常是1026和100)。然后在容器的环境变量里设置PUID=1026、PGID=100。这样Jellyfin写入的文件属主就是你的DSM用户,在File Station里能正常管理。