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.
版權聲明: 本文為博主「張火火isgudi」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接: https://www.cnblogs.com/zbyisgudi/p/19005327