小刻也能看懂的Unraid系統(tǒng)使用手冊:Docker篇

Docker可以做什么?
? ? 通過創(chuàng)建共享,并在其他計(jì)算機(jī)上訪問共享的方式,已經(jīng)可以實(shí)現(xiàn) NAS 的文件存儲(chǔ)和訪問功能了。但這僅僅是基礎(chǔ)功能,通過 Docker 提供的各種應(yīng)用和服務(wù),我們可以把這臺(tái) Unraid NAS 服務(wù)器變成家庭影音中心、私有網(wǎng)絡(luò)云盤、24小時(shí)在線的下載機(jī),還可以在服務(wù)器上搭建網(wǎng)站、博客等。
Docker的基礎(chǔ)知識(shí)
? ? Docker 技術(shù)的思想來源于集裝箱,正如它的圖標(biāo)所展示的那樣,通過 Docker 技術(shù),開發(fā)者把應(yīng)用程序和所需的運(yùn)行環(huán)境放到一個(gè)“集裝箱”里,這些“集裝箱”之間互不影響,應(yīng)用程序在各自的“集裝箱”里運(yùn)行。通過這個(gè)技術(shù),實(shí)現(xiàn)了應(yīng)用程序之間互相隔離,避免了因?yàn)檫\(yùn)行環(huán)境混亂導(dǎo)致的兼容問題和沖突。將環(huán)境和應(yīng)用打包在一起,也免去了繁瑣的環(huán)境配置時(shí)間。這讓應(yīng)用和服務(wù)的部署變得非常輕松。你甚至可以通過 Docker 在同一個(gè)服務(wù)器上安裝多個(gè)相同的應(yīng)用。
鏡像 Image
? ? 開發(fā)者把應(yīng)用程序和所需的運(yùn)行環(huán)境打包成為一個(gè)鏡像,然后發(fā)布出去,供使用者下載。鏡像是用來創(chuàng)建容器的。類似于 ISO 格式的操作系統(tǒng)安裝光盤,鏡像被生成后無法更改其中的內(nèi)容。
容器 Container
? ? 使用者下載到應(yīng)用的鏡像后,使用 Docker 運(yùn)行,將會(huì)創(chuàng)建一個(gè)容器,應(yīng)用在該容器里運(yùn)行。
倉庫 Repository
? ? 倉庫是開發(fā)者發(fā)布鏡像的地方,使用者可以在倉庫搜索鏡像,查看鏡像配置參數(shù)。
? ? Docker 官方的鏡像倉庫地址:https://hub.docker.com/
Docker的運(yùn)行機(jī)制
? ? 在進(jìn)行Docker安裝配置前要了解一下Docker的運(yùn)行機(jī)制:
? ? 用戶從倉庫下載Docker應(yīng)用的鏡像文件,然后通過運(yùn)行命令啟動(dòng)Docker應(yīng)用,這時(shí),Docker引擎將通過鏡像文件生成一個(gè)容器,該容器就是應(yīng)用的一個(gè)運(yùn)行實(shí)例。用戶可以通過這種方式啟動(dòng)多個(gè)應(yīng)用實(shí)例,默認(rèn)狀態(tài)下這些應(yīng)用不會(huì)互相影響。當(dāng)停止應(yīng)用時(shí),Docker引擎會(huì)停止容器的運(yùn)行。
? ? Docker引擎為了兼容性和穩(wěn)定性的考慮,容器和容器之間,容器和主機(jī)之間默認(rèn)都是互相隔離的。所以,不經(jīng)過配置的話,Docker容器是無法訪問主機(jī)文件系統(tǒng)的。為了讓Docker讀寫主機(jī)的文件,需要卷映射(Volume MAPPing)機(jī)制將主機(jī)的路徑映射到容器內(nèi)。比如,將宿主機(jī)存儲(chǔ)電影的目錄映射到容器內(nèi)的 `/data/movies` 目錄,這樣Docker應(yīng)用就可以通過容器內(nèi)路徑 `/data/movies` 訪問到宿主機(jī)的電影文件了。如圖所示,是Docker應(yīng)用 Jellyfin 的映射表,其中映射了 config 配置文件和一些媒體文件的路徑:

Docker和虛擬機(jī)的區(qū)別
? ? 筆者剛接觸 Docker 的時(shí)候,心想:這不就是虛擬機(jī)嗎?!其實(shí)Docker容器技術(shù)和虛擬機(jī)技術(shù)還是有很大不同的。虛擬機(jī)技術(shù)從宿主機(jī)虛擬出一套硬件,在該硬件上安裝操作系統(tǒng)和其他應(yīng)用軟件。而Docker容器技術(shù)是通過Docker引擎虛擬出一個(gè)運(yùn)行環(huán)境,即容器。其應(yīng)用本身直接運(yùn)行在宿主機(jī)的硬件和系統(tǒng)下,沒有經(jīng)過硬件虛擬化,所以比傳統(tǒng)虛擬機(jī)的運(yùn)行效率更高。

查看Docker設(shè)置
? ? Unraid 系統(tǒng)已經(jīng)集成了 Docker 環(huán)境,通過 `SETTINGS >> Docker` 進(jìn)入 Docker 設(shè)置界面。在這里可以查看當(dāng)前運(yùn)行的 Docker 版本,啟用或禁用 Docker。還有兩個(gè)路徑,是需要注意的:
Docker vDisk location
? ? 這是 Unraid 為 docker 運(yùn)行創(chuàng)建的虛擬磁盤,安裝的所有 Docker 都在該虛擬磁盤上,它默認(rèn)使用 `/mnt/user/system/docker/docker.img` 路徑,存放在 system 共享所在的磁盤上。
Default APPdata storage location
? ? 這是容器內(nèi)的應(yīng)用數(shù)據(jù)存儲(chǔ)的位置。在使用者安裝 Docker 應(yīng)用的時(shí)候,需要將 Docker 應(yīng)用的配置文件路徑映射到這里,否則 Docker 重啟時(shí)會(huì)恢復(fù)默認(rèn)設(shè)置。
安裝Docker應(yīng)用
? ? Unraid 提供了兩種安裝 Docker 應(yīng)用的方式:一種是通過 Unraid 社區(qū)應(yīng)用商店(Community APPlications)安裝,另一種是通過 Docker 容器安裝。通過社區(qū)商店安裝較為簡單,但為了演示 Docker 參數(shù)配置的過程,也為了后續(xù)安裝一些社區(qū)商店沒有的 Docker,先使用 Docker 容器進(jìn)行安裝。
1. 搜索 Docker 鏡像
? ? 以 FileBrowser 的安裝為例,F(xiàn)ileBrowser 是一個(gè)有 WebGUI 的文件管理器,可以在線瀏覽服務(wù)器上的文件,支持上傳下載,支持一些媒體文件的播放,功能豐富。

? ? 首先,要去倉庫里搜索 FileBrowser 鏡像,訪問 hub.docker.com?在搜索欄輸入 FileBrowser?回車,搜索結(jié)果有很多,其中獲得 Stars 數(shù)量最多的是 FileBrowser 官方的鏡像,但這里我們選擇? `80x86/filebrowser`,它是開發(fā)者荒野無燈大神制作的增強(qiáng)版。點(diǎn)進(jìn)去可以看到詳情頁面,這里有該 Docker 的介紹和開發(fā)者寫的安裝說明,接下來我們需要按照這個(gè)說明去配置 Docker 的參數(shù)完成安裝。
由于國內(nèi)網(wǎng)絡(luò)的不穩(wěn)定,hub.docker.com 這個(gè)網(wǎng)站可能無法訪問,這種情況可以通過修改 DNS 地址解決,比如修改為 114.114.114.114。如果修改 DNS 地址的方法無效,可以參考 《Unraid中文版入門指南》(https://wiki.unraid.net/入門指南_-_Chinese_Getting_Started_Guide) 中“使用Docker”部分的解決方法。
2. 閱讀 Docker 說明
? ? 安裝一個(gè)陌生的 Docker 時(shí),一定要仔細(xì)閱讀它的說明文檔,Docker 的開發(fā)者一般會(huì)以表格的形式列出需要使用者配置的參數(shù)。在 FileBrowser 的說明文檔中,很容易就找到這些參數(shù)列表,如圖所示。這些參數(shù)分為下面幾種類型:


Path 路徑
? ? 前面介紹過 Docker 運(yùn)行在容器里,容器與主機(jī)是隔離的,在容器里創(chuàng)建一個(gè)文件,容器外是無法訪問到的,為了讓 Docker 可以正常訪問修改主機(jī)上的文件,需要引入 Path 路徑參數(shù)。Path 參數(shù)要設(shè)置兩個(gè)值,一個(gè)是容器路徑,一個(gè)是主機(jī)路徑。通過 Path 的設(shè)置,Docker 訪問容器路徑的時(shí)候就相當(dāng)于訪問了主機(jī)路徑。
? ? 在 FileBrowser 的參數(shù)列表中,`/config` 和 `/myfiles` 就是容器路徑,作者在表格中詳細(xì)描述了這兩個(gè)路徑的用途。
? ? `/config` 是配置文件的路徑,可以映射到 `/mnt/user/APPdata/FileBrowserEX/config` 下。
? ? `/myfiles` 是文件管理器根目錄,可以映射到 `/mnt/user/Movies/` 目錄。
? ? 將應(yīng)用的配置文件(config)目錄映射到容器外的主機(jī)路徑是很重要的,因?yàn)楫?dāng)用戶修改Docker的配置參數(shù)或者進(jìn)行了Docker升級(jí)后,Docker將從鏡像文件重建容器,如果配置文件保存在容器內(nèi),則會(huì)丟失。
Port 端口映射
? ? 類似于路由器的端口映射,Port 參數(shù)也要設(shè)置兩個(gè)值,一個(gè)是容器的端口,一個(gè)是主機(jī)端口。通過端口映射讓主機(jī)可以訪問容器。
? ? 在 FileBrowser 的參數(shù)列表中,只需要配置一個(gè) Port 參數(shù)。
Variable 變量
? ? 變量參數(shù)的數(shù)量一般比較多,作用也各不相同,常見的有:`PUID`(代表用戶ID),`PGID`(代表用戶組ID),`WEB_PORT`(端口號(hào))等。
注意!這里的端口號(hào)指 Docker 使用的端口號(hào),它的類型是變量,只需要填寫一個(gè)值。而 Port 類型的端口,指端口映射,需要填寫兩個(gè)值。
Label 標(biāo)記
? ? 暫時(shí)沒有用過這種類型的參數(shù)。TBD
Device 設(shè)備
? ? 這是一個(gè)特殊的參數(shù),指定系統(tǒng)中的設(shè)備文件,主要用于加載硬件驅(qū)動(dòng)。
? ? 在 FileBrowser 的文檔中給出了啟用核顯進(jìn)行視頻編解碼的參數(shù)設(shè)置,就是利用 Device 參數(shù)添加了核顯的驅(qū)動(dòng)。這里暫不去配置它,后續(xù)在配置 Jellyfin 硬件解碼的時(shí)候會(huì)用到。
3. 添加容器
? ? 在仔細(xì)閱讀了說明文檔,知道該設(shè)置哪些參數(shù)后,就可以開始安裝 Docker 了。實(shí)際上,安裝 Docker 就是用 Docker 的鏡像生成一個(gè)容器。
? ? 1. 通過 `DOCKER >> ADD CONTAINER` 進(jìn)入添加容器頁面
? ? 2. Template?是模板,記錄以往添加容器時(shí)填寫的內(nèi)容,因?yàn)檫@是第一次添加容器,所以沒有
? ? 3. Name?是容器名稱,用戶自定義,這里輸入 "FileBrowserEX"
? ? 4. Repository 是 Docker 鏡像的地址,輸入 "80x86/filebrowser"
? ? 5. 然后點(diǎn)擊 Add another Path, Port, Variable, Label or Device?鏈接來設(shè)置參數(shù)
? ? 6. 需要按照 Docker 說明文檔,依次添加參數(shù),如圖
? ? 7. 全部填寫完成后點(diǎn)擊 APPLY 將開始下載鏡像并創(chuàng)建容器
? ? 8. 如圖顯示 Successfully?表示容器創(chuàng)建完成!




4. 使用 Docker
? ? 在 `DOCKER` 頁面可以看到系統(tǒng)中已有的容器,如圖所示,列表中已經(jīng)顯示出剛才創(chuàng)建的 FileBrowserEX。在 `PORT MAPPINGS(APP TO HOST)` 一列顯示了容器 IP 端口和主機(jī) IP 端口的對應(yīng)關(guān)系,使用瀏覽器訪問右邊的主機(jī)地址 `10.0.0.110:7001` 就可以打開 FileBrowserEX 的 WebGUI 頁面進(jìn)行使用了。

5. Docker 高級(jí)選項(xiàng)
? ? 在 `DOCKER` 頁面點(diǎn)擊 `FileBrowserEx` 容器名稱超鏈接,進(jìn)入修改容器設(shè)置的界面,點(diǎn)擊右上角的 BASIC VIEW(基礎(chǔ)視圖)?切換到 ADVANCED VIEW(高級(jí)視圖)?在這里可以進(jìn)行容器高級(jí)選項(xiàng)的配置。
5.1 給 Docker 添加圖標(biāo)
? ? 沒有圖標(biāo)的 Docker 是沒有靈魂的,在參數(shù)列表中有 `Icon URL` 這一項(xiàng),將找到的圖標(biāo)網(wǎng)址粘貼到這里就可以給 Docker 指定漂亮的圖標(biāo)了。推薦使用 png 格式背景透明的圖片。
5.2 添加快捷鏈接
? ? 使用 Docker 要輸入 IP 地址和端口,非常麻煩,而且有時(shí)會(huì)忘記端口號(hào)。其實(shí)可以通過設(shè)置高級(jí)選項(xiàng)中的 WebUI?參數(shù)來給 Docker 添加一個(gè)快捷鏈接。
? ? 設(shè)置 WebUI?參數(shù)為 `http://[IP]:[PORT:7001]` 其中 "7001" 是 Docker 的主機(jī)端口號(hào)。
? ? 添加快捷鏈接后,可以直接點(diǎn)擊 Docker 圖標(biāo)選擇 WebUI?進(jìn)入網(wǎng)頁。

5.3 Extra Parameters 附加參數(shù)
? ? 附加參數(shù)是一個(gè)很容易被忽略的選項(xiàng),很多作者在 Docker 發(fā)布頁的參數(shù)列表上并不會(huì)列出附加參數(shù),而是把它寫在創(chuàng)建容器的命令里。比如在 FileBrowser 的說明文檔里就沒有提及附加參數(shù)這個(gè)選項(xiàng),萌新可能會(huì)忽略了這個(gè)參數(shù)的填寫。所以說在安裝 Docker 的時(shí)候也要注意看一下它的命令行示例。
? ? 在 FileBrowser 說明文檔后面,有作者寫的通過命令行創(chuàng)建容器的示例代碼:
? ? 筆者在代碼上進(jìn)行了注釋,可以看出來這段命令其實(shí)和創(chuàng)建 Docker 容器時(shí)配置參數(shù)的過程是一樣的。仔細(xì)觀察可以發(fā)現(xiàn)命令中有兩行和其他行不太一樣,分別是第一行 `--restart=unless-stopped` 和 最后一行 `--mount type=tmpfs,destination=/tmp`,這兩行其實(shí)就是附加參數(shù)。
? ? 第一個(gè)附加參數(shù)的意思容易理解,它是保證容器在異常退出后自動(dòng)重啟的。第二個(gè)參數(shù)筆者一開始也不明所以,經(jīng)過查找資料,才明白它的意思,它的意思是:在系統(tǒng)內(nèi)存中分配一個(gè)用于存儲(chǔ) tmp 臨時(shí)文件的磁盤,并掛載到 `/tmp` 容器路徑上。這個(gè)參數(shù)是可以提高 Docker 性能的。所以在高級(jí)視圖里把這段代碼粘貼到 `Extra Parameters` 選項(xiàng)里,應(yīng)用設(shè)置并重建容器。

Docker總結(jié)
? ? 雖然倉庫中的 Docker 應(yīng)用種類繁多,功能各異 ,但它們的配置方法其實(shí)和上文中的 FileBrowser 所差無幾,無非是多幾個(gè)需要配置的參數(shù),所以在安裝 Docker 的時(shí)候一定要仔細(xì)閱讀說明文檔,也要多參考網(wǎng)上其他作者寫的教程。
? ? Unraid 還可以通過 “Community APPlications” 社區(qū)應(yīng)用商店來安裝 Docker,方法和上文大體相同,如果掌握了通過容器添加 Docker 的方法,那么通過社區(qū)商店安裝 Docker 將觸類旁通。