CentOS8 使用 Docker 搭建 Jellyfin 家庭影音服务器
CentOS8 使用 Docker 搭建 Jellyfin 家庭影音服务器
一、前言
由于 Jellyfin 的 GPL 协议和 Intel 的 media-driver (iHD) Linux 驱动(部分开源)在协议上不兼容的缘故,Jellyfin 官方的 Docker 镜像:jellyfin/jellyfin 并不包含 Intel Linux 核显驱动。但是 Intel 的 QuickSync QSV 硬件加速依赖于该驱动,并且 Intel 10 代酷睿(Comet Lake)以及更新的处理器需要该驱动才能正常使用硬件加速。另外 VPP/OpenCL 色调映射也需要该驱动才能正常运作。为此,大佬 nyanmisaka 制作了一个开箱即用的Docker镜像,包含最新的驱动、jellyfin-ffmpeg、补丁、CJK 系统字体等。详情见:Jellyfin中国特供版+Docker镜像,含驱动,免折腾开箱即用。
二、创建并配置 jellyfin 容器
1. 1 docker 拉取镜像
若想拉取docker镜像,只需使用命令docker pull nyanmisaka/jellyfin:latest
。
调用管理员权限,使用命令:
sudo docker image ls
查看已下载的镜像。
可以观察到拉取镜像的信息如ID、tag和大小等。
此外,还可以通过命令:
sudo docker inspect nyanmisaka/jellyfin:latest
来进一步查看容器的详细信息:
比如,nyanmisaka 在 2025.07.14 发布的 jellyfin 容器的哈希值为:sha256:c31464aa3c35d8a409de3ae697c605f59eba67b72455168917b6eb768dfa9e9e
通过 docker inspect
命令查看到的详细信息可以对比哈希值是否一致。根据所得信息可知,哈希值一致,拉取镜像成功。
1.2 创建容器前的准备工作
为方便长期维护以及后续容器更新的数据迁移,创建 jellyfin 容器前需要先创建用于保存配置、缓存的文件目录。由于 jellyfin 属于本服务器对外提供的服务程序,则在 /srv 目录下创建所需文件目录。
srv 目录主要用来存储本机或本服务器提供的服务或数据(用户主动生产的数据、对外提供服务)。
使用命令:
sudo mkdir -p /srv/jellyfin/{config,cache}
# -p :确保目录名称存在,不存在的就建一个。
1.3 创建 jellyfin 容器
使用命令,创建 jellyfin 容器:
docker run -d --name=jellyfin \
-p 8096:8096 -p 8920:8920 \
-p 7359:7359/udp -p 1900:1900/udp \
-v /srv/jellyfin/config:/config \
-v /srv/jellyfin/cache:/cache \
-v /media:/media \
-e TZ=Asia/Shanghai \
-e PUID=0 -e PGID=0 \
--device=/dev/dri:/dev/dri \
--restart unless-stopped \
nyanmisaka/jellyfin:latest
关于上述命令中参数的详细说明,如下表所示:
参数 | 说明 |
---|---|
-d | 后台运行。--detach 的缩写,使容器在后台运行,即便关闭终端也能保持在后台运行,不会占用当前终端。 |
--name=jellyfin | 指定容器名称。为容器分配一个固定的名字 “jellyfin”,方便后续管理(如停止、重启、查看日志等)。 |
-p 8096:8096 | 端口映射 (HTTP)。将主机的 8096 端口映射到容器的 8096 端口,这是 jellyfin 的主 Web 访问端口。 |
-p 8920:8920 | 端口映射 (HTTPS)。映射 HTTPS 端口,如果为 jellyfin 配置了 SSL,将通过此端口访问。 |
-p 7359:7359/udp | 端口映射 (自动发现)。映射 UDP 端口,用于局域网内的客户端自动发现 jellyfin 服务器。 |
-p 1900:1900/udp | 端口映射 (DLNA)。映射 DLNA 服务端口,用于兼容 DLNA 的设备(如智能电视)发现和播放媒体。 |
-v /srv/jellyfin/config:/config | 数据卷挂载 (配置)。将主机的 /srv/jellyfin/config 目录映射到容器的 /config 目录,用于持久化存储所有核心配置文件和数据库。确保数据不丢失,方便维护和后续更新。 |
-v /srv/jellyfin/cache:/cache | 数据卷挂载 (缓存)。将主机的 /srv/jellyfin/cache 目录映射到容器的 /cache 目录,用于存放图片、转码等缓存文件。确保数据不丢失,方便维护和后续更新。 |
-v /media:/media | 数据卷挂载 (媒体库)。将主机的 /media 目录(或你存放媒体文件的实际目录)映射到容器的 /media 目录,让 jellyfin 可以访问到电影、电视剧、音乐等文件。 |
-e TZ=Asia/Shanghai | 设置环境变量 (时区)。将容器的系统时区设置为上海,确保日志和界面显示时间正确。 |
-e PUID=0 -e PGID=0 | 设置环境变量 (用户/组)。设置容器内 jellyfin 进程的用户ID (PUID) 和组ID (PGID) 为 0,即 root 用户。这可以最大限度地避免因文件权限问题导致的媒体库访问失败。 |
--device=/dev/dri:/dev/dri | 设备直通 (硬件加速)。将主机的显卡设备 (/dev/dri ) 直接分配给容器使用,以启用硬件转码(硬解),可以大幅降低 CPU 占用率。 |
--restart unless-stopped | 设置重启策略。除非手动执行 docker stop ,否则在 Docker 重启或宿主机开机时,容器都会自动重新启动,确保服务高可用。 |
nyanmisaka/jellyfin:latest | 指定基础镜像。声明此容器是基于 nyanmisaka 的 nyanmisaka/jellyfin 镜像的 latest (最新) 版本来创建的。 |
1.4 查看 jellyfin 容器信息及安装驱动
使用命令:
sudo docker ps
查看查看当前 docker 运行的容器,确认刚刚创建的 jellyfin 容器是否成功运行。
由于我所使用的 CPU 为 AMD 14 年前发布的上古老 U: e350, 其集成了 HD6130 显卡(我想升级成 G5500T QAQ)。而 nyanmisaka 大佬的容器镜像中集成的显卡驱动并不支持我的老旧显卡,所以对于我来说还做不到真正意义上的“开箱即用”,还需要继续在容器中安装驱动程序。
接下来进入 jellyfin 容器,并在其中启动一个可交互的 Bash 终端会话:
sudo docker exec -it jellyfin /bin/bash
参数 | 说明 |
---|---|
exec | 在一个已经处于运行状态的容器内部执行一条新的命令 |
-it | 两个参数 -i 和 -t 的合并写法,通常一起使用;-i 保持标准输入(STDIN)的开启状态,-t 分配一个伪终端(pseudo-TTY)。将 -it 结合在一起,就创建了一个功能完善的、可以与容器内环境进行实时交互的终端。 |
/bin/bash | 希望在容器内部执行的具体命令。/bin/bash 是 Bash Shell 的可执行文件路径。执行它就意味着在容器内部启动一个新的 Bash 进程,从而提供一个命令提示符。 |
更新容器内仓库:
apt update
直通显卡确认:
ls /dev/dir
查看未安装驱动情况下容器内的解码支持信息:
/usr/lib/jellyfin-ffmpeg/vainfo
输出如下图所示:
从输出信息可知,容器内识别到了 HD6130 需要 r600_drv_video.so
这个驱动,但是 r600: driver missing
指出这个显卡驱动缺失。
同时 libva info: Trying to open /usr/lib/jellyfin-ffmpeg/lib/dri/radeonsi_drv_video.so
这条信息指出由于找不到正确的 r600 驱动,系统尝试加载了 radeonsi 驱动。但 radeonsi 是为更新的 AMD 显卡设计的,与当前硬件不兼容,所以也失败了。说明当前显卡的硬件直通是成功的,但是缺少了对应的驱动文件。
这时需要安装 mesa-va-drivers
这一软件包, 其包含了 r600_drv_video.so 这一驱动。
使用如下命令安装:
apt install mesa-va-drivers
成功安装 mesa-va-drivers 软件包后,再次使用命令:/usr/lib/jellyfin-ffmpeg/vainfo
等到解码支持的信息:
发现现在可以采用 VAAPI 驱动进行硬件加速,但是只能支持 H264, MPEG2, VC1
这三种编码格式,现代主流的编码格式基本都不支持(再一次想换 G5500T QAQ)。详细 jellyfin 中的硬件解码支持如下表所示:
格式 | 硬件解码支持 | 备注 |
---|---|---|
H264 | ✅ | 最常见的视频编码格式,覆盖绝大多数1080p及以下的视频。 |
HEVC (H.265) | ❌ | 一种高效的现代的视频压缩标准,也被称为 H.265 或 MPEG-H Part 2 |
MPEG2 | ✅ | 主要用于DVD和一些较老的数字电视录像。 |
VC1 | ✅ | 用于部分蓝光碟和Windows Media视频。 |
VP8 | ❌ | 一种较早的网页视频格式。 |
VP9 | ❌ | 主流的网页视频格式。 |
AV1 | ❌ | 最新的高效视频格式,需要新硬件才能支持硬解。 |
HEVC 10bit | ❌ | HEVC本身就不支持,其10-bit版本更不支持。转码 HDR 视频只能通过 CPU 软解 |
VP9 10bit | ❌ | VP9本身就不支持,其10-bit版本也不支持。 |
确认没有问题之后便可以使用命令 exit
退出容器了。
2.1 配置防火墙
将 jellyfin 服务器所需的几个端口在防火墙上放行,使用命令:
# 添加 TCP 端口
sudo firewall-cmd --permanent --zone=public --add-port=8096/tcp
sudo firewall-cmd --permanent --zone=public --add-port=8920/tcp# 添加 UDP 端口
sudo firewall-cmd --permanent --zone=public --add-port=7359/udp
sudo firewall-cmd --permanent --zone=public --add-port=1900/udp# 重新加载防火墙使其生效
sudo firewall-cmd --reload# 查看端口是否放行
sudo firewall-cmd --list-ports
2.2 配置 jellyfin
本文中 jellyfin 容器的 http 端口被映射到本地端口的 8096, 所以通过 IP:8096
即可访问到 jellyfin 的 web端。
按照引导提示完成基本配置后,进入 控制台
:
2.2.1 媒体库设置
在 媒体库
一栏中添加并管理媒体库。其中更多设置可按需开启或关闭。
2.2.2 播放设置
在 播放
一栏中选择合适的驱动,本文所采用的驱动为 VAAPI
, 并且在下方硬件设备中填入容器直通的设备路径,如 /dev/dri/renderD128
.
在 启用硬件解码
一栏中,本文中的 GPU 由于性能限制,只能选择如上图所示的三项编码格式,各位可根据自身 GPU 支持的解码格式来选择。
勾选 启用硬件编码
,其余设置保持默认即可。
可按需选择是否开启。
2.2.3 网络设置
完成了媒体库和最核心的播放转码设置后,下一步就是对 Jellyfin 的网络进行配置。合理的网络配置是确保您能在各种环境下(内网、外网)稳定访问服务的关键。
在控制台的“网络”一栏中,包含了所有与连接、端口、远程访问相关的选项。
服务器地址设置
这部分主要定义了 jellyfin 服务监听的基础网络参数。
-
本地 HTTP/HTTPS 端口号:默认为
8096
和8920
。这两个端口就是在创建 docker 容器时,通过-p 8096:8096
和-p 8920:8920
参数映射到主机的端口。通常情况下,保持默认即可。只有当这两个端口与服务器上其他服务冲突时,才需要修改,并且修改后需要同步更新docker run
命令中的端口映射。 -
基础 URL:此选项用于反向代理的场景。例如,如果希望通过
http://example.com/jellyfin
来访问服务,那么这里就需要填入jellyfin
。对于直接使用 IP 访问的用户,留空即可。 -
监听的本地网络地址:
- 留空(默认):Jellyfin 会监听在所有可用的网络接口上(即
0.0.0.0
),这是最常用、最灵活的设置。 - 指定 IP:如本文中填写的
192.168.1.221
,jellyfin 将只会绑定到这一个具体的内网 IP 地址上。这样做可以增强一定的安全性,确保服务只在特定的网卡上暴露。但如果平时服务器 IP 地址发生变化,可能会导致服务无法访问。对于大多数家庭用户,留空即可。
- 留空(默认):Jellyfin 会监听在所有可用的网络接口上(即
-
LAN 网络:此功能用于区分“内网”和“外网”,主要目的是为了应用不同的带宽限制。
- 工作方式:在这里填写的 IP 地址段被 jellyfin 视为“局域网(内网)”,在这些地址上访问的用户不会受到带宽限制。所有不在此列表中的地址都将被视为“广域网(外网)”,并受到设置的“外部网络带宽限制”。以本文的
192.168.1.0/255.255.255.0, 192.168.31.0/255.255.255.0
为例,它告诉 jellyfin,192.168.1.x
和192.168.31.x
这两个网段都属于内网。如果家庭网络比较复杂(例如有主路由和旁路由),这个设置就非常有用。如果网络结构简单,留空即可,jellyfin 会自动将服务器所在的子网视为内网。
- 工作方式:在这里填写的 IP 地址段被 jellyfin 视为“局域网(内网)”,在这些地址上访问的用户不会受到带宽限制。所有不在此列表中的地址都将被视为“广域网(外网)”,并受到设置的“外部网络带宽限制”。以本文的
-
已知代理:用于高级反向代理场景。当 jellyfin 前面有多层代理时,在这里填入反向代理服务器的 IP 地址,可以帮助 Jellyfin 正确解析
X-Forwarded-For
请求头,从而获取到真实的客户端 IP 地址。对于大多数用户,此项应留空。
HTTPS 设置
如果希望通过 HTTPS 加密访问您的 Jellyfin,可以在这里配置。
-
强制 HTTPS:一个简单的开关,开启后,所有到
8096
端口的 HTTP 请求都会被自动重定向到8920
的 HTTPS 端口。前提是必须已经成功配置了 HTTPS。 -
自定义 SSL 证书路径:允许直接在 Jellyfin 中配置 SSL 证书。需要提供一个
.pfx
或.p12
格式的证书文件。不过,更常见和推荐的做法是在反向代理层面(如 Nginx Proxy Manager, Caddy, Traefik)来处理 SSL,而不是在 jellyfin 应用本身中配置。
远程访问设置
这部分控制着在外网访问 Jellyfin 的权限。
- 允许与此服务器进行远程连接:这是外网访问的总开关。取消勾选后,jellyfin 将只允许来自在“LAN 网络”中定义的内网 IP 的访问。
- 开启自动端口映射 (UPnP):此功能会尝试命令路由器自动完成端口转发,免去手动登录路由器设置的麻烦。
注意:UPnP 功能虽然方便,但在某些路由器上可能不稳定或不兼容,且从安全角度考虑,不推荐在服务器上开启此功能。最佳实践是手动在路由器上设置端口转发规则,将外网的
8096
和8920
端口指向 jellyfin 服务器的内网 IP。 - 已发布的服务器 URIs:当配置了域名和反向代理后,在这里填入公开访问地址。jellyfin 会在生成一些访问链接(如邮件分享)时使用这个地址,确保外部用户可以正确访问。
配置完以上所有网络选项后,根据提示,部分设置可能需要重启 jellyfin 容器才能生效。至此,jellyfin 服务器就已经根据个人的网络环境和访问需求,配置得明明白白了。
三、结语
至此,本文已经从零开始,走完了在 CentOS 8 上通过 Docker 部署 Jellyfin 的全部流程。从选择 nyanmisaka
大佬优化的特供版镜像,到创建和配置容器;从解决我这台上古硬件“开箱不即用”的驱动难题,到精细化配置防火墙、播放和网络选项,每一步都体现着“折腾至上”。
本文的经历恰好说明,即便硬件条件不甚理想(再次默念想换 G5500T QAQ),通过清晰的思路和正确的调试方法,依然能够最大限度地发挥其潜力,成功搭建起一个稳定、高效、且支持硬件加速的家庭影音服务器。这个过程不仅是对技术的探索,更是亲手“折腾”,让老旧设备重获新生的那份独特成就感。
当然,jellyfin 的玩法远不止于此。当拥有一个稳定运行的服务后,还可以进一步探索,例如:
- 配置反向代理:使用 Nginx Proxy Manager 或 Caddy 为 jellyfin 套上域名和 HTTPS,实现更安全、更优雅的远程访问。
- 自动化媒体管理:结合
Sonarr
,Radarr
,Bazarr
等工具,打造全自动的追剧、电影搜刮和字幕下载流程。 - 刮削与索引:可以使用 tmm(tiny media manager) 来实现便捷的资源刮削整理。
希望本篇教程能帮助您顺利搭建起属于自己的家庭影音中心,将收藏的珍贵影片整理得井井有条,随时随地与家人朋友分享。如果在部署过程中遇到任何问题,欢迎在评论区留言讨论。
祝观影愉快!
参考
- https://www.chiphell.com/thread-2375777-1-1.html.
- https://zhuanlan.zhihu.com/p/624670198.
版权声明: 本文为博主「zbyisgudi」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接: https://www.cnblogs.com/zbyisgudi/p/19005327