🎟️新手教程:如何在 unRAID 上正确安装 Docker
00 分钟
2023-7-21
2024-5-12
type
status
date
slug
summary
tags
category
icon
password

1、介绍

unRAID 是一个近年来备受欢迎的 NAS 系统,其原生支持 Docker,因此在安装和管理 Docker 应用方面非常方便,这也是 unRAID 受欢迎的原因之一。
本文将为新手朋友介绍:
  1. 在 unRAID 中上哪安装 Docker 。
  1. 如何正确安装 Docker 。
  1. 如何纠正 Docker 的文件权限问题。
  1. 如何获取别人创建的 Docker XML 配置文件。

2、上哪安装 Docker

2.1、APPS(应用)

unRAID 提供了一个叫做 APPS(应用) 的应用市场功能,此功能的全称叫做 Community Applications(社区应用,简称为 CA),用户可以在里面搜索到相应的插件、Docker 等进行安装。
官方 Community Applications 介绍:
应用市场中所发布的各类 Docker 应用和插件都是经过官方审核发布的,其中既有官方自己发布的应用,也有第三方用户提交到 unRAID 官方后发布出来的应用。
 CA 应用商店界面
CA 应用商店界面
比如说我需要安装 emby ,那么在应用市场搜索后会列出多个相关的 Docker 应用:
搜索 emby 之后会列出相关的 Docker 应用或者插件
搜索 emby 之后会列出相关的 Docker 应用或者插件
为什么叫做 emby (或其他应用)的 Docker 有这么多个,我该怎么选则我需要的? 不止 emby,包括其他一些常见 Docker 比如 Jellyfin、Plex、qBittorrent … 等都会有多种不同的镜像,不同的镜像代表由不同的开发者发布和维护,比如下图种这两个 emby 的镜像分别是由 BinhexLinuxServer 发布:
什么是 Docker 镜像/容器?
Docker 镜像和容器是 Docker 技术中的两个重要概念,它们之间存在以下关系:
  1. 镜像是一个只读的模板:镜像是一个只读的文件系统,包含了运行应用程序所需的所有文件、依赖和配置信息。它可以看作是一个静态的、不可变的模板,用于创建容器。
  1. 容器是镜像的运行实例:容器是从镜像创建的、可运行的实例。可以将容器视为一个独立的、轻量级的虚拟环境,其中运行着应用程序和其依赖的进程。容器可以被启动、停止、删除和重新启动。
  1. 镜像是容器的基础:每个容器都是基于一个镜像创建的。镜像提供了容器运行所需的所有文件和配置,包括操作系统、应用程序、库文件等。容器在启动时会加载镜像,并在其基础上创建一个可写的容器层,用于保存容器运行时的变化和数据。
  1. 镜像可以被共享和复用:镜像是可复制和共享的,可以通过Docker Hub等镜像仓库进行分发和获取。多个容器可以共享同一个镜像作为基础,从而实现快速部署和扩展应用程序的能力。
总结来说,镜像是创建容器的模板,而容器是基于镜像运行的实例。通过使用镜像和容器,Docker提供了一种轻量级、可移植和可扩展的容器化解决方案。
notion image
虽然是不同的开发者发布的镜像,但在大多数的功能基本都是一样的,而且很可能你都察觉不到两者有什么区别,因为不同的发布者可能只是在一些系统代码层面做了一些优化或者改动,在用户的使用层面是区分不出来区别的,所以一般情况下任意选择其中一个即可。
notion image
notion image
notion image
Docker 安装参数配置界面(模板界面)
Docker 安装参数配置界面(模板界面)
在上图中可以看到,在 CA 应用商店安装的 Docker 都会给你配置好相应的参数,这些参数依据 unRAID 系统特性来针对性做了适配,这种做了针对性适配之后所给到用户使用的 Docker 配置模板叫做 CA 模板(CA templates)
CA 模板实际上是一个 XML 文件(以 .xml 结尾),该文件存储了 Docker 应用或者插件的一系列安装参数。
就比如在上文中看到的 emby 应用,其 XML 文件的内容是这样的:
notion image
XML 文件内容
unRAID 上的 Docker XML 模板文件是存储在 /boot/config/plugins/dockerMan/templates-user 路径下(即存储在 U 盘的 config 文件夹内),所以就算你误删了一个 Docker 容器,你仍可以借助 XML 模板重新安装 Docker 而不需要再重新配置参数,这个特性极大的方便了用户使用 Docker。
有些朋友以为删除掉 Docker 容器后会导致原有的应用运行配置文件丢失,实际上并不会,配置文件会保留在系统存储中,不会因容器的删除而丢失。
XML 模板保存目录内容
XML 模板保存目录内容
当你从 CA 应用商店或者手动安装 Docker 后就会自动创建一个 XML 文件,所以当你删除了 Docker 之后可以重新借助 XML 模板再创建 Docker 容器。
“模板”列表的每一项都代表你已经安装过的并且存储在 unRAID 上的 Docker XML 模板
“模板”列表的每一项都代表你已经安装过的并且存储在 unRAID 上的 Docker XML 模板
明白了这一点后,实际上用户可以创建和修改属于自己的 XML 模板,从而灵活安装各种 Docker,甚至你还可以发布到 unRAID 的 CA 应用市场中。比如 Youtube 上的这个视频介绍了如何在 unRAID 应用市场发布 Docker XML 模板的步骤过程:Unraid: How To Publish Docker XML Templates to Community Applications
借助这一特点,你可以下载别人创建好的 XML 到 unRAID 上,从而可以直接安装别人已经配置好的 Docker 应用参数(本文末尾作者提供了自己的 Gitee 仓库供大家使用)。这种场景的作用主要体现在当你在 CA 应用市场找不到对应的 Docker 应用时,可以下载别人配置好的 XML 模板从而方便的进行安装。
这个特点也使得 unRAID 在 Docker 应用的用户体验上要比其他 NAS 系统来的更友好。
但并不是所有的 Docker 应用都有对应的 CA 模板,因此这种时候就需要用户自己来手动配置模板并创建 Docker 。

2.2、手动安装

虽然说 CA 应用商店已经提供了很多的 Docker 可选择,但很有可能你在寻找某些 Docker 的时候会发现应用市场搜不出来你需要的应用,比如说 Lskypro 这个图床应用在 CA 应用商店中并没有对应的模板:
表明 Lskypro 没有被官方或者第三方开发者发布到 CA 应用商店
表明 Lskypro 没有被官方或者第三方开发者发布到 CA 应用商店
此时你可以点击右侧的“单击此处以从 DockerHub 获取更多结果”来展示 Docker Hub 所搜索到的内容:
什么是 Docker Hub
Docker Hub 是一个公共的 Docker 镜像注册表和容器仓库服务。它是由 Docker 官方提供的云服务,用于存储、分享和获取 Docker 镜像。
以下是 Docker Hub 的一些主要功能和特点:
  1. 镜像存储和分享:Docker Hub 允许用户上传、存储和分享 Docker 镜像。你可以将自己创建的镜像推送到 Docker Hub 上,供其他用户使用和下载。
  1. 官方镜像:Docker Hub 提供了许多官方的 Docker 镜像,包括常用的操作系统、数据库、 Web 服务器等。你可以从 Docker Hub 上直接获取这些官方镜像,加快应用程序的开发和部署。
  1. 自动构建:Docker Hub 支持自动构建功能,可以与代码托管平台(如 GitHub、Bitbucket )集成,当代码库中的代码发生变更时,Docker Hub 可以自动构建、测试和推送新的镜像。
  1. 组织和团队:Docker Hub 允许用户创建组织和团队,方便多人协作和权限管理。你可以邀请其他用户加入你的团队,并共享和管理镜像。
  1. 云端部署:Docker Hub提供了与多个云服务提供商(如 AWS、Azure、Google Cloud )的集成,方便在云上部署和管理容器。
通过Docker Hub,你可以方便地访问和获取各种 Docker 镜像,加速应用程序的开发和部署过程。同时,你也可以将自己的镜像上传到 Docker Hub ,并与其他人共享和协作。
notion image
notion image
当你点击“安装”按钮之后,unRAID 会先拉取 Docker 镜像,然后会尝试自动给你添加相应的参数:
notion image
拉取镜像
拉取镜像
由 unRAID 自动为你创建的 XML 模板
由 unRAID 自动为你创建的 XML 模板
但实际上可以看到自动生成的 XML 模板没有针对性的配置,并且还缺少一些必要的参数。这里作者将给大家介绍如何从零开始手动的去在 unRAID 上创建 Docker 应用并配置好参数。
这里作者就以 Lskypro 这个应用为例,介绍具体的操作过程。

(1)确认所需要参数

首先,需要确定安装 Docker 应用需要提供哪些参数(变量、路径映射、端口和镜像地址等)
由于 Lskypro 原项目中没有 Docker 版本,因此我们可以从 cold-pig/LskyPro-Docker 项目所构建的 Docker 镜像去使用 Lskypro 。
在项目的说明中,我们可以找到安装 Docker 应用所需要的参数:
notion image

(2)添加容器并配置参数

从项目的说明文档中,我们了解到需要给 Docker 添加以下参数:
  • 镜像仓库地址:coldpig/lskypro-docker
  • 端口映射:映射容器内的 80 端口到 unRAID 上
  • 映射路径:将容器的 /var/www/html 映射到 unRAID 上
具体操作如下:
notion image
填写 存储库 地址:
notion image
添加端口映射:
notion image
添加路径映射:
notion image
填写好上述的配置之后,已经可以满足安装 Lskypro docker 应用的要求了,不过我们还可以再添加以下两个参数来更方便的让我们使用:
notion image
  • 图标链接:即 unRAID 展示 Docker 应用的图标,所填写的参数其实就是图标的 URL 地址,你可以在这里填写上你喜欢的图标链接。
    • 关于图标,大家可以到 xushier/HD-Icons 这个项目上获取各种各样现成的图标。由于这个图标库是在 Github 上的,国内访问有可能访问不上造成图标无法加载,这时候你也可以到我的 Gitee 图标仓库中获取。
      notion image
  • WebUI:配置了 WebUI 参数之后,点击容器图标会多出一行 打开(WebUI) 的选项,点击即可直接跳转到容器的管理界面。WebUI 的参数格式为:
    • notion image
最终的效果如下:
notion image
点击 应用 之后即会开始下载 Docker 镜像并创建容器:
notion image
检查 Docker 应用能否正常运行:
能够进入 WebUI 界面表示容器正确安装和启动了,但并不是所有 Docker 应用都会有网页界面,需要根据实际情况来验证最终的安装、运行情况。
能够进入 WebUI 界面表示容器正确安装和启动了,但并不是所有 Docker 应用都会有网页界面,需要根据实际情况来验证最终的安装、运行情况。
如果你对图床应用感兴趣,希望给自己的写作环境搭建一个图床,那么推荐阅读作者之前的《Lskypro + PicGO 搭建私有图床和环境》文章。

3、如何纠正 Docker 的文件权限问题

3.1、安装时提供正确的变量名和变量值

我们在安装 Docker 的时候,往往需要添加关于用户和用户组的变量,以此来给到 Docker 应用相应的权限,比如说在上文提到的 emby 应用:
notion image
图片中的三个参数是关于权限的变量:
  • PUID :指赋予 Docker 容器的用户权限,在 unRAID 上一般给到数值 99 即可;
  • PGID :指赋予 Docker 容器的用户组权限,在 unRAID 上一般给到数值 100 即可;
  • UMASK:UMASK(User Mask)是一种掩码,用于定义新创建的文件和目录的默认权限。它决定了在创建新文件和目录时所使用的默认权限掩码,一般设置为 022 即可(请注意,umask不会影响已经存在的文件和目录的权限。它仅适用于新创建的文件和目录)。
在 unRAID 上要赋予 Docker 应用权限时,大多数情况下,我们一般只需要给到 99100 即可。这是因为在 unRAID 上,文件的基础读写权限赋予给了 nobody 用户和 users 用户组,而 nobodyusers 所对应的用户和用户组编号分别为 99100
notion image
unRAID 内一般文件的所有者都是 nobody
unRAID 内一般文件的所有者都是 nobody
💡
这也就是为什么当你从 CA 应用商店安装 Docker 时,大多数涉及到用户和用户组权限的变量(PIDPUIDGIDGUID 等变量)值都为 99100
但这并不是绝对的,有时候某些 Docker 应用会要求提供特定的用户和用户组,否则可能会导致 Docker 不能正确使用。
比如说作者之前安装的一个叫做 qmcgaw/ddns-updater 的 DDNS 应用,其要求提供到容器的用户和用户组权限须为 1000
根据其说明,如果你不希望使用 1000 的用户权限,那就得自己另外编译 Docker 镜像并指定其他的用户和用户组 ID。
根据其说明,如果你不希望使用 1000 的用户权限,那就得自己另外编译 Docker 镜像并指定其他的用户和用户组 ID。
因此在创建此 Docker 的时候,用户和用户组的变量 UID GID 值就需要设置为 1000
notion image
需要说明的是,在提供给 Docker 容器用户和用户组的变量时,变量名可能会不一样,比如说有些容器需要提供 PUID PGID 这样的变量名,而有些容器则可能要求提供的是 UID GID 这样的变量名,需要读者们根据对应的文档添加正确的变量,否则可能 Docker 应用可能会因为权限不对导致运行时出现问题:
使用 UID 和 GID 作为权限变量名
使用 UID 和 GID 作为权限变量名
使用 PUID 和 PGID 作为权限变量名
使用 PUID 和 PGID 作为权限变量名

3.2、纠正文件的权限的方法和步骤

如果在某些情况下,现有文件的权限不正确,而导致 Docker 没有权限读取时,Docker 应用就会无法正确运行,那么此时你就需要先纠正这些文件的权限。

(1)纠正除 appdata 文件夹之外的文件权限

在 unRAID 上,有一个叫做 Fix Common Problem 的插件:
如果你无法通过 CA 应用下载此插件,可以通过这里的方法安装插件。
复制以下命令到命令行窗口运行:
notion image
config → plugins
config → plugins
notion image
notion image
当你安装此插件后,在 “工具”界面会出现一个叫做 Docker Safe New Perms 的工具:
notion image
这个工具的作用是恢复所有共享和文件的标准 unRaid 权限:此工具会启动一个后台进程,去访问每个阵列里的硬盘和缓存盘,将除了 appdata 以外的文件和目录所有权更改为 nobody/users(即 uid/gid 设置为 99/100)。
使用方法如下:
确认框打上勾,然后点击 START 按钮开始执行进程
确认框打上勾,然后点击 START 按钮开始执行进程
进程去纠正每一个盘内的文件权限
进程去纠正每一个盘内的文件权限
notion image

(2)纠正 appdata 文件夹内的文件权限

但上面的这个工具是不会去纠正 appdata 这个文件夹内的文件权限的,那是因为由于不同的 Docker 应用可能会使用不同的用户/用户组权限,也就是说并不是所有的 Docker 应用都会使用 99/100 这样的权限,所以如果你强制让此工具去纠正 appdata 内的所有文件权限都为 99/100 ,那就有可能会造成 Docker 应用无法运行
💡
appdata 这个共享文件夹是系统默认创建的、给到 Docker 应用存储容器配置文件的默认文件夹,你会看到很多 CA 应用商店内的应用都会将容器的配置文件映射到此目录上以此来保存容器的运行配置文件,但你可以指定其他的文件夹来作为默认文件夹,例如下图(虽然可以这么做,但根据作者自身的经验,保持默认会比较好一点):
notion image
那么根据这种情况,我们就得手动的根据实际需要去纠正 appdata 文件夹内的文件权限,我们可以借助“共享”下的文件操作来进行更改。
借助 UI 界面对文件进行编辑,需要安装 Dynamix File Manager 插件。
notion image
如果你无法在 CA 应用商店下载,你可以借助以下方法进行安装:
  1. 复制以下命令到命令行窗口执行:
  1. 手动安装插件:
    1. notion image
      config → plugins
      config → plugins
      找到 dynamix.file.manager.plg 后点击安装
      找到 dynamix.file.manager.plg 后点击安装
如果你用的是 6.12 版本,点击文件夹左侧的箭头按钮进入文件列表:
如果你用的是 6.12 之前的版本,那么箭头按钮在文件夹列表的最右则。
notion image
勾选需要更改权限的文件夹并点击“所有者”更改所有者权限:
notion image
然后更改对应的读写权限,建议“所有者”“组”的权限设置为“读/写”“其他”设置为“只读”
notion image
以上就是修改文件夹权限的方法,如果你了解 Linux 的命令行操作,那么其实你用命令行会更快一点,例如:

4、如何获取别人创建的 Docker XML 配置文件

可以看到,有时 CA 应用商店里找不到对应的 Docker 应用时,手动去配置 Docker 参数来创建 Docker 容器会有一点小麻烦,前面我提到可以通过下载别人的 XML 文件到 unRAID 上来直接安装 Docker,那么这里作者就提供作者自己的 Gitee 仓库来方便大家去使用。
目前仓库保存的 XML 模板不多,后续会慢慢添加,大家也可以提需求,我会整理好后上传到仓库。
下载模板的方法:
  1. 找到想要安装的 Docker XML 模板并点击文件名,如 Alist:
    1. notion image
  1. 右键“原始数据”复制地址链接:
    1. notion image
  1. 把刚才复制的链接填写到下面的命令中,然后粘贴到 unRAID 的命令行窗口运行:
    1. notion image
  1. 添加容器并使用模板创建 Docker :
    1. notion image
      选择下载的 XML 模板
      选择下载的 XML 模板
      notion image
      最后根据自己的实际情况稍微调整下参数后应用即可。

      5、2023-07-25 案例补充:思源笔记

      这里再补充一个 Docker 安装的案例 —— 思源笔记(项目地址):
      查找到 Docker 部署文档说明:
      notion image
      然后根据以下步骤逐一获取需要的信息:
      (1)Docker 镜像名称是什么?
      notion image
      得知了镜像名称后,把镜像名称填入 CA 模板的“存储库”中:
      后缀 latest 指的是 Docker 镜像的标签(tag),代表下载最新的 Docker 镜像,这里即使不加上此后缀也是可以的,因为默认也是使用的 latest 标签去拉取镜像。
      notion image
      (2)需要映射哪些文件夹路径?
      notion image
      根据官方提供的部署说明,我们需要指定“工作空间文件夹”路径,也就是告诉容器要使用 unRAID 上的哪个文件夹来作为工作文件夹。
      并且有以下几点说明:
      • 需要通过 --workspace 指定工作空间文件夹的路径。
      • (建议)将 workspace 文件夹路径在宿主机和容器上配置为一致的。
      根据说明,我们先指定一个 unRAID 上的工作文件夹,给到思源笔记来作为工作空间去使用,比如说我们指定以下路径的文件夹:
      然后官方建议为了简化,建议将 workspace 文件夹在宿主机和容器上配置为一致的,也就是说容器内也使用一样的路径去作为工作空间文件夹路径,那么此时 CA 模板的路径映射参数如下:
      notion image
      然后还需要通过 --workspace 指定工作空间文件夹的路径。要实现这一点,需要打开 Docker 配置的高级视图:
      --workspace 参数是什么东西?
      这类参数通常被称为启动参数(Startup Parameters)容器配置参数(Container Configuration Parameters)。这些参数用于在创建和启动容器时配置容器的行为和特性。
      启动参数可以用于控制容器的各种方面,例如容器的重启策略、容器的网络设置、容器的资源限制等。通过设置不同的启动参数,你可以根据应用程序的需求来定义容器的运行方式和环境。
      这一类参数是可以由开发者自定义的,就比如这里的 --workspace 参数。
      notion image
      然后将以下参数填入“发布参数”中:
      notion image
      填写好关于路径这一块的参数后,效果看起来应该是这样的:
      notion image
      (3)需要什么样的权限?
      notion image
      镜像中是使用默认创建的普通用户 siyuan(uid 1000/gid 1000)来启动内核进程的,所以在宿主机创建工作空间文件夹时请注意设置该文件夹所属用户组:chown -R 1000:1000 /siyuan/workspace,在启动容器时需要带参数 -u 1000:1000
      根据说明,由于镜像中使用的是 siyuan(uid 1000/gid 1000)来启动进程,所以首先你需要保证 unRAID 上映射到思源笔记容器里面的文件夹权限要设置为 1000/1000 。
      上文中提到过可以通过 unRAID 的文件夹管理功能去修改文件夹权限,但此方法作用范围有限,比如说看不到对应用户的 UIDGID 编号,只能看到用户名;同时也不能指定具体的 UIDGID 编号的用户/用户组等:
      网页界面修改作用有限,比如不能通过编号来指定用户或用户组
      网页界面修改作用有限,比如不能通过编号来指定用户或用户组
      因此我们这里通过命令行去设置权限:
      notion image
      最后,根据说明在启动容器时需要带参数 -u 1000:1000 ,因此我们在“额外参数”的末尾追加:
      -u 参数是什么?
      -u 参数在 Docker 中通常被称为用户参数(User Parameters)用户身份参数(User Identity Parameters)
      这类参数用于在容器中指定运行进程的用户身份,以提供更好的安全性和权限控制。通过设置用户参数,可以限制容器内进程的权限,并以非特权用户的身份运行容器,从而减少潜在的安全风险。
      notion image
      (4)需要映射哪些端口?
      从说明中可以看到需要用到 6806 端口:
      notion image
      因此我们需要配置一个端口映射:
      “容器端口”需要配置 6806“主机端口”我这里设置的是 16806 ,那是因为 6806 端口已经被其他容器占用,因此作者这里使用了别的端口。
      notion image
      (5)最终的 CA 模板参考
      notion image
      除了 Docker 自身的参数,你可以配置以下两个参数来方便使用:
      • WebUI:
        • 图标链接:
          完成安装:
          notion image
          下载作者修改好的 XML 模板免去手动配置:
           

      评论