最近开始尝试 PT,需要一款合适的 BT 软件,经过几番尝试之后,确定了使用 Docker 运行 Transmission 的方案。

为什么是 Transmission?

常见的、适用于 linux 的开源 BT 软件主要有 Aria2、qBittorrent、Transmission、Vuze、Deluge 等。

不选择其他客户端的原因如下:

  • Vuze:基于 Java,首先被淘汰;
  • Deluge:上次更新还是在 2017 年 5 月,所以也不考虑;
  • Aria2:看起来很美,但是在一些细节上不够好,比如 BT 不能设置代理、log 文件体积控制有问题,但是用起来确实很方便,特别是对 metalink 的支持和强大的 HTTP 下载功能,所以被选中当做日常下载的工具;
  • qBittorrent:和 Transmission 难分轩轾,但是 qBittorrent 对低速种子的处理有一些问题:虽然设置里有“把低速种子移至队列尾部”的功能,但貌似这个功能真的只是针对低速种子,对于没有 peer 连接或无法获取 metadata 的磁力链接,就不会放到队列尾部了,导致我的下载队列一直被阻塞。

所以 Transmission 对我来说是最好的选择。

为什么要放在 Docker 里?

为什么不呢?

我能想到 Docker 仅有的缺点是一定的 IO 和 CPU 性能损失,但是根据 IBM 的测试,这个损失可以忽略不计。

但是 Docker 带来的好处却有很多:

  1. 隔离:Transmission 的配置文件、数据目录、启动配置都可以由我管理,
    如果是直接安装在机子上,他们会分散在很多不同地方,难以管理;
  2. 可移植:因为 Transmission 的相关文件都放在我想要它们在的地方,
    所以需要换机子的时候只需要把它们拷过去,一行命令就可以重建;
  3. 自启:对于像我这样没有特殊要求的人来说,Docker 的 restart=always 是足够简单并且好用的自启方案,
    不再需要编写复杂的 Systemd Service(我相信大多数人都不能不查资料直接写出合适的 Systemd Service),也不需要额外安装其他工具;
  4. 易管理:Docker 本身提供了简单的管理功能,我还安装了 Portainer 以方便管理,
    相比之下 Systemd 需要额外的权限,其他 Supervisor 工具需要安装和配置。

用什么 Transmission 镜像?

既然已经决定了通过 Docker 使用 Transmission,下面面临的问题就是:
自己创建一个 Docker 镜像还是使用别人弄好的镜像?

一开始我是打算自己写一个的,但是在寻找可以用来参考的 Dockerfile 时看到了 linuxserver 的镜像

这个镜像提供了足够的可配置性,linuxserver 还提供了很多其他的 Docker 镜像,更新也很勤快,
所以这个镜像的质量应该是高于我自己写的,于是放弃自己写的想法,选择了使用 linuxserver 的镜像。

Docker 的 restart 选项怎么用?

编写 Systemd 的 Service 真是一个痛苦的体验,相比之下,Docker 本身提供的自己功能虽然简陋,但已经足以满足我日常使用的需求了。

Docker 启动容器时有个选项:–restart,这个选项可以接受四种参数:

  1. no:默认选项,不自动重启容器;
  2. on-failure:如果容器因为出错而结束了(非 0 返回值),就重启它;
  3. always:一直在容器结束之后重启它,如果容器是被手动结束的,那么就只会在下一次启动 Docker Daemon 或者容器被手动启动后启动它;
  4. unless-stopped:和 always 差不多,但如果容器被停止了,就不会在下次启动 Docker Daemon 时启动它。

如果 restart 选项的参数是 alwaysunless-stopped,那么以后每次 Docker Daemon 启动,它们都会被启动。

Docker Daemon 会在什么时候启动呢?一般安装了 Docker 的机子都会让 Docker Daemon 开机启动。

也就是说,只要一个 Docker 容器启动时 restart 选项被设置为 alwaysunless-stopped,就会随着 Docker Daemon 一起开机启动。

具体的启动顺序为:

  系统 -> Systemd -> docker.service -> 你的镜像

具体怎么用?

一行命令就可以:

1
2
3
4
5
6
7
8
9
docker run --name transmission \
-d --restart always \
-e PUID=$(id -u) -e PGID=$(id -g) -e TZ=Asia/Shanghai \
-e TRANSMISSION_WEB_HOME=/transmission-web-control \
-p 9091:9091 -p 51413:51413 -p 51413:51413/udp \
-v 想要存放下载文件的文件夹:/downloads \
-v 想要 watch 的文件夹:/watch \
-v 想要存放 Transmission 配置的文件夹:/config \
linuxserver/transmission