小刻也能看懂的Unraid系统使用手册:Docker篇
Docker可以做什么?
通过创建共享,并在其他计算机上访问共享的方式,已经可以实现 NAS 的文件存储和访问功能了。但这仅仅是基础功能,通过 Docker 提供的各种应用和服务,我们可以把这台 Unraid NAS 服务器变成家庭影音中心、私有网络云盘、24小时在线的下载机,还可以在服务器上搭建网站、博客等。
Docker的基础知识
Docker 技术的思想来源于集装箱,正如它的图标所展示的那样,通过 Docker 技术,开发者把应用程序和所需的运行环境放到一个“集装箱”里,这些“集装箱”之间互不影响,应用程序在各自的“集装箱”里运行。通过这个技术,实现了应用程序之间互相隔离,避免了因为运行环境混乱导致的兼容问题和冲突。将环境和应用打包在一起,也免去了繁琐的环境配置时间。这让应用和服务的部署变得非常轻松。你甚至可以通过 Docker 在同一个服务器上安装多个相同的应用。
镜像 Image
开发者把应用程序和所需的运行环境打包成为一个镜像,然后发布出去,供使用者下载。镜像是用来创建容器的。类似于 ISO 格式的操作系统安装光盘,镜像被生成后无法更改其中的内容。
容器 Container
使用者下载到应用的镜像后,使用 Docker 运行,将会创建一个容器,应用在该容器里运行。
仓库 Repository
仓库是开发者发布镜像的地方,使用者可以在仓库搜索镜像,查看镜像配置参数。
Docker 官方的镜像仓库地址:https://hub.docker.com/
Docker的运行机制
在进行Docker安装配置前要了解一下Docker的运行机制:
用户从仓库下载Docker应用的镜像文件,然后通过运行命令启动Docker应用,这时,Docker引擎将通过镜像文件生成一个容器,该容器就是应用的一个运行实例。用户可以通过这种方式启动多个应用实例,默认状态下这些应用不会互相影响。当停止应用时,Docker引擎会停止容器的运行。
Docker引擎为了兼容性和稳定性的考虑,容器和容器之间,容器和主机之间默认都是互相隔离的。所以,不经过配置的话,Docker容器是无法访问主机文件系统的。为了让Docker读写主机的文件,需要卷映射(Volume MAPPing)机制将主机的路径映射到容器内。比如,将宿主机存储电影的目录映射到容器内的 `/data/movies` 目录,这样Docker应用就可以通过容器内路径 `/data/movies` 访问到宿主机的电影文件了。如图所示,是Docker应用 Jellyfin 的映射表,其中映射了 config 配置文件和一些媒体文件的路径:

Docker和虚拟机的区别
笔者刚接触 Docker 的时候,心想:这不就是虚拟机吗?!其实Docker容器技术和虚拟机技术还是有很大不同的。虚拟机技术从宿主机虚拟出一套硬件,在该硬件上安装操作系统和其他应用软件。而Docker容器技术是通过Docker引擎虚拟出一个运行环境,即容器。其应用本身直接运行在宿主机的硬件和系统下,没有经过硬件虚拟化,所以比传统虚拟机的运行效率更高。

查看Docker设置
Unraid 系统已经集成了 Docker 环境,通过 `SETTINGS >> Docker` 进入 Docker 设置界面。在这里可以查看当前运行的 Docker 版本,启用或禁用 Docker。还有两个路径,是需要注意的:
Docker vDisk location
这是 Unraid 为 docker 运行创建的虚拟磁盘,安装的所有 Docker 都在该虚拟磁盘上,它默认使用 `/mnt/user/system/docker/docker.img` 路径,存放在 system 共享所在的磁盘上。
Default APPdata storage location
这是容器内的应用数据存储的位置。在使用者安装 Docker 应用的时候,需要将 Docker 应用的配置文件路径映射到这里,否则 Docker 重启时会恢复默认设置。
安装Docker应用
Unraid 提供了两种安装 Docker 应用的方式:一种是通过 Unraid 社区应用商店(Community APPlications)安装,另一种是通过 Docker 容器安装。通过社区商店安装较为简单,但为了演示 Docker 参数配置的过程,也为了后续安装一些社区商店没有的 Docker,先使用 Docker 容器进行安装。
1. 搜索 Docker 镜像
以 FileBrowser 的安装为例,FileBrowser 是一个有 WebGUI 的文件管理器,可以在线浏览服务器上的文件,支持上传下载,支持一些媒体文件的播放,功能丰富。

首先,要去仓库里搜索 FileBrowser 镜像,访问 hub.docker.com 在搜索栏输入 FileBrowser 回车,搜索结果有很多,其中获得 Stars 数量最多的是 FileBrowser 官方的镜像,但这里我们选择 `80x86/filebrowser`,它是开发者荒野无灯大神制作的增强版。点进去可以看到详情页面,这里有该 Docker 的介绍和开发者写的安装说明,接下来我们需要按照这个说明去配置 Docker 的参数完成安装。
由于国内网络的不稳定,hub.docker.com 这个网站可能无法访问,这种情况可以通过修改 DNS 地址解决,比如修改为 114.114.114.114。如果修改 DNS 地址的方法无效,可以参考 《Unraid中文版入门指南》(https://wiki.unraid.net/入门指南_-_Chinese_Getting_Started_Guide) 中“使用Docker”部分的解决方法。
2. 阅读 Docker 说明
安装一个陌生的 Docker 时,一定要仔细阅读它的说明文档,Docker 的开发者一般会以表格的形式列出需要使用者配置的参数。在 FileBrowser 的说明文档中,很容易就找到这些参数列表,如图所示。这些参数分为下面几种类型:


Path 路径
前面介绍过 Docker 运行在容器里,容器与主机是隔离的,在容器里创建一个文件,容器外是无法访问到的,为了让 Docker 可以正常访问修改主机上的文件,需要引入 Path 路径参数。Path 参数要设置两个值,一个是容器路径,一个是主机路径。通过 Path 的设置,Docker 访问容器路径的时候就相当于访问了主机路径。
在 FileBrowser 的参数列表中,`/config` 和 `/myfiles` 就是容器路径,作者在表格中详细描述了这两个路径的用途。
`/config` 是配置文件的路径,可以映射到 `/mnt/user/APPdata/FileBrowserEX/config` 下。
`/myfiles` 是文件管理器根目录,可以映射到 `/mnt/user/Movies/` 目录。
将应用的配置文件(config)目录映射到容器外的主机路径是很重要的,因为当用户修改Docker的配置参数或者进行了Docker升级后,Docker将从镜像文件重建容器,如果配置文件保存在容器内,则会丢失。
Port 端口映射
类似于路由器的端口映射,Port 参数也要设置两个值,一个是容器的端口,一个是主机端口。通过端口映射让主机可以访问容器。
在 FileBrowser 的参数列表中,只需要配置一个 Port 参数。
Variable 变量
变量参数的数量一般比较多,作用也各不相同,常见的有:`PUID`(代表用户ID),`PGID`(代表用户组ID),`WEB_PORT`(端口号)等。
注意!这里的端口号指 Docker 使用的端口号,它的类型是变量,只需要填写一个值。而 Port 类型的端口,指端口映射,需要填写两个值。
Label 标记
暂时没有用过这种类型的参数。TBD
Device 设备
这是一个特殊的参数,指定系统中的设备文件,主要用于加载硬件驱动。
在 FileBrowser 的文档中给出了启用核显进行视频编解码的参数设置,就是利用 Device 参数添加了核显的驱动。这里暂不去配置它,后续在配置 Jellyfin 硬件解码的时候会用到。
3. 添加容器
在仔细阅读了说明文档,知道该设置哪些参数后,就可以开始安装 Docker 了。实际上,安装 Docker 就是用 Docker 的镜像生成一个容器。
1. 通过 `DOCKER >> ADD CONTAINER` 进入添加容器页面
2. Template 是模板,记录以往添加容器时填写的内容,因为这是第一次添加容器,所以没有
3. Name 是容器名称,用户自定义,这里输入 "FileBrowserEX"
4. Repository 是 Docker 镜像的地址,输入 "80x86/filebrowser"
5. 然后点击 Add another Path, Port, Variable, Label or Device 链接来设置参数
6. 需要按照 Docker 说明文档,依次添加参数,如图
7. 全部填写完成后点击 APPLY 将开始下载镜像并创建容器
8. 如图显示 Successfully 表示容器创建完成!




4. 使用 Docker
在 `DOCKER` 页面可以看到系统中已有的容器,如图所示,列表中已经显示出刚才创建的 FileBrowserEX。在 `PORT MAPPINGS(APP TO HOST)` 一列显示了容器 IP 端口和主机 IP 端口的对应关系,使用浏览器访问右边的主机地址 `10.0.0.110:7001` 就可以打开 FileBrowserEX 的 WebGUI 页面进行使用了。

5. Docker 高级选项
在 `DOCKER` 页面点击 `FileBrowserEx` 容器名称超链接,进入修改容器设置的界面,点击右上角的 BASIC VIEW(基础视图) 切换到 ADVANCED VIEW(高级视图) 在这里可以进行容器高级选项的配置。
5.1 给 Docker 添加图标
没有图标的 Docker 是没有灵魂的,在参数列表中有 `Icon URL` 这一项,将找到的图标网址粘贴到这里就可以给 Docker 指定漂亮的图标了。推荐使用 png 格式背景透明的图片。
5.2 添加快捷链接
使用 Docker 要输入 IP 地址和端口,非常麻烦,而且有时会忘记端口号。其实可以通过设置高级选项中的 WebUI 参数来给 Docker 添加一个快捷链接。
设置 WebUI 参数为 `http://[IP]:[PORT:7001]` 其中 "7001" 是 Docker 的主机端口号。
添加快捷链接后,可以直接点击 Docker 图标选择 WebUI 进入网页。

5.3 Extra Parameters 附加参数
附加参数是一个很容易被忽略的选项,很多作者在 Docker 发布页的参数列表上并不会列出附加参数,而是把它写在创建容器的命令里。比如在 FileBrowser 的说明文档里就没有提及附加参数这个选项,萌新可能会忽略了这个参数的填写。所以说在安装 Docker 的时候也要注意看一下它的命令行示例。
在 FileBrowser 说明文档后面,有作者写的通过命令行创建容器的示例代码:
笔者在代码上进行了注释,可以看出来这段命令其实和创建 Docker 容器时配置参数的过程是一样的。仔细观察可以发现命令中有两行和其他行不太一样,分别是第一行 `--restart=unless-stopped` 和 最后一行 `--mount type=tmpfs,destination=/tmp`,这两行其实就是附加参数。
第一个附加参数的意思容易理解,它是保证容器在异常退出后自动重启的。第二个参数笔者一开始也不明所以,经过查找资料,才明白它的意思,它的意思是:在系统内存中分配一个用于存储 tmp 临时文件的磁盘,并挂载到 `/tmp` 容器路径上。这个参数是可以提高 Docker 性能的。所以在高级视图里把这段代码粘贴到 `Extra Parameters` 选项里,应用设置并重建容器。

Docker总结
虽然仓库中的 Docker 应用种类繁多,功能各异 ,但它们的配置方法其实和上文中的 FileBrowser 所差无几,无非是多几个需要配置的参数,所以在安装 Docker 的时候一定要仔细阅读说明文档,也要多参考网上其他作者写的教程。
Unraid 还可以通过 “Community APPlications” 社区应用商店来安装 Docker,方法和上文大体相同,如果掌握了通过容器添加 Docker 的方法,那么通过社区商店安装 Docker 将触类旁通。

