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

拉取 nyanmisaka jellyfin docker 镜像

调用管理员权限,使用命令:

sudo docker image ls

查看已下载的镜像。

jellyfin docker 容器信息

可以观察到拉取镜像的信息如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 进程,从而提供一个命令提示符。

进入容器内 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

成功安装 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 10bitHEVC本身就不支持,其10-bit版本更不支持。转码 HDR 视频只能通过 CPU 软解
VP9 10bitVP9本身就不支持,其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 端口号:默认为 80968920。这两个端口就是在创建 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 地址发生变化,可能会导致服务无法访问。对于大多数家庭用户,留空即可。
  • LAN 网络:此功能用于区分“内网”和“外网”,主要目的是为了应用不同的带宽限制。

    • 工作方式:在这里填写的 IP 地址段被 jellyfin 视为“局域网(内网)”,在这些地址上访问的用户不会受到带宽限制。所有不在此列表中的地址都将被视为“广域网(外网)”,并受到设置的“外部网络带宽限制”。以本文的 192.168.1.0/255.255.255.0, 192.168.31.0/255.255.255.0 为例,它告诉 jellyfin,192.168.1.x192.168.31.x 这两个网段都属于内网。如果家庭网络比较复杂(例如有主路由和旁路由),这个设置就非常有用。如果网络结构简单,留空即可,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 功能虽然方便,但在某些路由器上可能不稳定或不兼容,且从安全角度考虑,不推荐在服务器上开启此功能。最佳实践是手动在路由器上设置端口转发规则,将外网的 80968920 端口指向 jellyfin 服务器的内网 IP。

  • 已发布的服务器 URIs:当配置了域名和反向代理后,在这里填入公开访问地址。jellyfin 会在生成一些访问链接(如邮件分享)时使用这个地址,确保外部用户可以正确访问。

配置完以上所有网络选项后,根据提示,部分设置可能需要重启 jellyfin 容器才能生效。至此,jellyfin 服务器就已经根据个人的网络环境和访问需求,配置得明明白白了。

三、结语

至此,本文已经从零开始,走完了在 CentOS 8 上通过 Docker 部署 Jellyfin 的全部流程。从选择 nyanmisaka 大佬优化的特供版镜像,到创建和配置容器;从解决我这台上古硬件“开箱不即用”的驱动难题,到精细化配置防火墙、播放和网络选项,每一步都体现着“折腾至上”。

本文的经历恰好说明,即便硬件条件不甚理想(再次默念想换 G5500T QAQ),通过清晰的思路和正确的调试方法,依然能够最大限度地发挥其潜力,成功搭建起一个稳定、高效、且支持硬件加速的家庭影音服务器。这个过程不仅是对技术的探索,更是亲手“折腾”,让老旧设备重获新生的那份独特成就感。

当然,jellyfin 的玩法远不止于此。当拥有一个稳定运行的服务后,还可以进一步探索,例如:

  1. 配置反向代理:使用 Nginx Proxy Manager 或 Caddy 为 jellyfin 套上域名和 HTTPS,实现更安全、更优雅的远程访问。
  2. 自动化媒体管理:结合 Sonarr, Radarr, Bazarr 等工具,打造全自动的追剧、电影搜刮和字幕下载流程。
  3. 刮削与索引:可以使用 tmm(tiny media manager) 来实现便捷的资源刮削整理。

希望本篇教程能帮助您顺利搭建起属于自己的家庭影音中心,将收藏的珍贵影片整理得井井有条,随时随地与家人朋友分享。如果在部署过程中遇到任何问题,欢迎在评论区留言讨论。

祝观影愉快!

参考

  1. https://www.chiphell.com/thread-2375777-1-1.html.
  2. https://zhuanlan.zhihu.com/p/624670198.

版权声明: 本文为博主「张火火isgudi」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接: https://www.cnblogs.com/zbyisgudi/p/19005327

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/90672.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/90672.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/90672.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyTorch武侠演义 第一卷:初入江湖 第4章:损失玉佩的评分风波

第一卷:初入江湖 第4章:损失玉佩的评分风波比武开幕 晨钟响彻山谷,PyTorch派三年一度的"模型比武大会"正式开始。各分舵弟子列队入场,林小码跟在Tensor大师身后,眼睛瞪得溜圆——只见: "卷积…

HttpServletRequestWrapper存储Request

HTTP请求的输入流只能被读取一次,再想获取就获取不到了,那有什么方法可以缓存呢,我们可以自定义一个HttpServletRequest,或者是想在请求参数中统一添加或删除参数也可以使用此类进行改造,然后通过过滤器继续向下流转。…

算法:数组part02: 209. 长度最小的子数组 + 59.螺旋矩阵II + 代码随想录补充58.区间和 + 44. 开发商购买土地

算法:数组part02: 209. 长度最小的子数组 59.螺旋矩阵II 代码随想录补充58.区间和 44. 开发商购买土地 209. 长度最小的子数组题目:https://leetcode.cn/problems/minimum-size-subarray-sum/description/ 文章讲解:https://programmercarl…

Spring 核心知识点梳理 1

目录 Spring Spring是什么? Spring中重要的模块 Spring中最重要的就是IOC(控制反转)和AOP(面向切面编程) 什么是IOC DI和IOC之间的区别 为什么要使用IOC呢? IOC的实现机制 什么是AOP Aop的核心概念 AOP的环绕方式 AOP发生的时期 AOP和OOP的…

Kafka运维实战 07 - kafka 三节点集群部署(混合模式)(KRaft 版本3.7.0)

目录环境准备主机准备补充说明JDK安装 (三台主机分别执行)下载jdkjdk安装kafka 部署(三台主机分别执行)kafka 下载kafka 版本号结构解析kafka 安装下载和解压安装包(3台主机都执行)配置 server.properties (KRaft 模式)192.168.37.10192.168.37.11192.16…

linux内核与GNU之间的联系和区别

要理解操作系统(如 GNU/Linux)的组成,需要明确 内核(Kernel) 和 GNU 工具链 各自的功能,以及它们如何协作构成完整的操作系统。以下是详细分析:1. 内核(Kernel)的功能 内…

文件包含学习总结

目录 漏洞简介 漏洞原理 漏洞分类 漏洞防御 漏洞简介 程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这种文件调用的过程一般被称为文件包含。程序开发人员一般希望代码更灵活&…

TQZC706开发板教程:创建PCIE项目

本例程基于zc706开发板,使用xdma核创建PCIE项目,最终实现插入主机可识别出Xilinx设备。在vivado中创建一个空的706项目。创建完成后添加IP核-->搜索xdma-->双击打开配置。添加XDMA核如下所示basic配置peic id中设置设备号等信息,这里保…

科技赋能景区生.态,负氧离子气象监测站筑牢清新防线

负氧离子气象监测站,如同景区空气质量的坚固防线,默默守护着每一寸土地的清新。​它以精准的监测能力为防线基石。借助 “吸入式电容收集法”,能敏锐捕捉空气中负氧离子的踪迹,精准测量其浓度,同时将温度、湿度、PM2.5…

AMD官网下载失败,不让账户登录下载

别使用163邮箱 使用QQ邮箱,然后用GPT生成一个外国,比如日本的地区信息填上去就可以下载了

Elasticsearch-8.17.0 centos7安装

下载链接 https://www.elastic.co/downloads/past-releases/elasticsearch-8-17-0 https://www.elastic.co/downloads/past-releases/logstash-8-17-0 https://www.elastic.co/cn/downloads/past-releases/kibana-8-17-0https://artifacts.elastic.co/downloads/elasticsearch/…

windows下SAS9.4软件下载与安装教程

SAS 9.4是SAS公司推出的一款功能强大的统计分析软件,广泛应用于数据分析、商业智能、预测分析、数据挖掘及统计建模等多个领域。数据处理与管理能力:SAS 9.4支持多种数据格式的导入导出,包括JSON、XML等,便于处理来自Web和API的数…

MyBatis-Plus极速开发指南

MyBatis-Plus简介MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,简化开发,提高效率。它提供了以下主要特性:无侵入:只做增强不做改变,引入它不会对现有工程产生影响强大的 …

Django接口自动化平台实现(五)

8. 测试用例执行 预期效果如下:用例执行逻辑如下:前端提交用例 id 列表到后台,后台获取每一条用例的信息;后台获取域名信息、用例 id 列表;对用例的请求数据进行变量的参数化、函数化等预处理操作;根据先后…

一个没有手动加分号引发的bug

最近因为分号的疏忽&#xff0c;导致出现了一个bug&#xff0c;记录下来&#xff0c;分享给大家。 1、一个示例 给你下面这一段代码&#xff0c;你根据经验判断一下运营结果 let [a,b] [a,b] let [x,y] [1,2] if(x < y){[x,y] [y,x][a,b] [b,a] }按照一般的理解&#xf…

Elasticsearch安全审计日志设置与最佳实践

一、Elasticsearch安全审计简介 审计日志&#xff08;Audit Logging&#xff09;用于记录Elasticsearch中的安全相关事件&#xff0c;包括认证失败、连接拒绝、数据访问事件以及通过API对安全配置&#xff08;如用户、角色、API密钥&#xff09;的变更记录。 注意&#xff1a;审…

算法训练营day29 贪心算法③ 134. 加油站、135. 分发糖果 、860.柠檬水找零、406.根据身高重建队列

贪心算法的第三篇博客&#xff0c;继续脑筋风暴&#xff01; 134. 加油站 写在前面 这道题规定了有解的话&#xff0c;必定为唯一解 贪心思路 直接从全局进行贪心选择&#xff0c;情况如下&#xff1a; 情况一&#xff1a;如果gas的总和小于cost总和&#xff0c;那么无论从…

【09】C#入门到精通——C# 结构体对齐 与 常用数据 对应关系

文章目录1 C# 结构体对齐1.1 默认对齐方式1.2 节对齐方式设置1.3 偏移量设置2 C#与C/C之间类型的对应关系1 C# 结构体对齐 1.1 默认对齐方式 struct默认对齐方式&#xff0c;结构体长度必须是&#xff0c;最大成员长度的整数倍&#xff0c;所以下面结构体大小是 24 (实际占用…

pytest 测试报告生成方案有哪些?

在 pytest 中&#xff0c;除了 Allure 和 HTMLTestRunner&#xff0c;还有许多其他生成测试报告的方法和插件。以下是一些常用的方案及其特点&#xff1a;1. pytest-html&#xff08;官方推荐&#xff09;特点&#xff1a;轻量级、易集成&#xff0c;生成独立的 HTML 报告。安装…

Unity中EditorPrefs与PlayerPrefs对比分析

Unity中EditorPrefs与PlayerPrefs对比分析 EditorPrefs与PlayerPrefs是Unity引擎中用于数据持久化的两个核心类&#xff0c;分别用于于编辑器扩展与游戏运行时场景。以下从设计目标、存储位置、数据类型、生命周期、安全性、使用场景等方面展开对比&#xff0c;并结合代码示例说…