我看了这篇花里胡哨的比较眼馋: 家用NAS(TrueNAS scale)使用经验分享——概述 - 知乎
但是我的Truenas Scale版本太老bug太多,怎么拉取应用都拉取不下来,痛定思痛,我琢磨了下怎么直接通过Docker直接拉取并管理应用。

Docker未启动

报错

错误: Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/middlewared/job.py", line 411, in run
    await self.future
  File "/usr/lib/python3/dist-packages/middlewared/job.py", line 446, in __run_body
    rv = await self.method(*([self] + args))
  File "/usr/lib/python3/dist-packages/middlewared/schema.py", line 1272, in nf
    return await func(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/middlewared/schema.py", line 1140, in nf
    res = await f(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/middlewared/plugins/docker_linux/images.py", line 117, in pull
    await self.docker_checks()
  File "/usr/lib/python3/dist-packages/middlewared/plugins/docker_linux/images.py", line 176, in docker_checks
    raise CallError('Docker service is not running')
middlewared.service_exception.CallError: [EFAULT] Docker service is not running

检查

sudo systemctl start docker

打印错误日志:

sudo journalctl -u docker --no-pager -n 50

日志内容:

Jul 16 11:44:23 truenas dockerd[4054452]: time="2025-07-16T19:44:23.265187375+08:00" level=info msg="stopping healthcheck following graceful shutdown" module=libcontainerd
Jul 16 11:44:24 truenas dockerd[4054452]: failed to start daemon: error initializing graphdriver: driver not supported
Jul 16 11:44:24 truenas systemd[1]: docker.service: Main process exited, code=exited, status=1/FAILURE
Jul 16 11:44:24 truenas systemd[1]: docker.service: Failed with result 'exit-code'.
Jul 16 11:44:24 truenas systemd[1]: Failed to start Docker Application Container Engine.
Jul 16 11:44:24 truenas systemd[1]: docker.service: Scheduled restart job, restart counter is at 3.
Jul 16 11:44:24 truenas systemd[1]: Stopped Docker Application Container Engine.
Jul 16 11:44:24 truenas systemd[1]: docker.service: Start request repeated too quickly.
Jul 16 11:44:24 truenas systemd[1]: docker.service: Failed with result 'exit-code'.
Jul 16 11:44:24 truenas systemd[1]: Failed to start Docker Application Container Engine.

从日志来看,你的 Docker 服务 (dockerd) 启动失败了,主要原因是存储驱动 (storage driver) 的问题。具体错误如下:

Jul 16 11:44:23 truenas dockerd[4054452]: time="2025-07-16T19:44:23.264295321+08:00" level=error msg="failed to mount overlay: invalid argument" storage-driver=overlay2
Jul 16 11:44:23 truenas dockerd[4054452]: time="2025-07-16T19:44:23.264324804+08:00" level=error msg="[graphdriver] prior storage driver overlay2 failed: driver not supported"
Jul 16 11:44:24 truenas dockerd[4054452]: failed to start daemon: error initializing graphdriver: driver not supported

可能的原因和解决方案:

  1. 不支持的存储驱动 (overlay2)

    • Docker 尝试使用 overlay2 存储驱动,但你的系统内核可能不支持它,或者文件系统不支持。
    • 解决方案
      • 检查你的文件系统类型。overlay2 需要支持的文件系统(如 ext4xfs 等)。
      • 如果是 ZFS(TrueNAS 默认使用 ZFS),Docker 可能需要使用 zfs 存储驱动。
  2. 修改 Docker 配置

    • 编辑 Docker 的配置文件 ,通过指令nano /etc/docker/daemon.json(如果不存在这个文件,可以创建),添加一个字段storage-driver:
      {
        "storage-driver": "zfs"
      }
      
    • 然后重启 Docker:
      sudo systemctl daemon-reload
      sudo systemctl restart docker
      

      笔者注:亲测加上一个zfs配置,然后restart就好了。如果你的还不好可以问问大模型你的文件系统是什么。

总结:

你的 Docker 服务无法启动是因为存储驱动 overlay2 不被支持。根据你的文件系统类型(很可能是 ZFS),修改 Docker 配置使用 zfsvfs 驱动应该可以解决问题。

Docker拉取镜像超时

解决办法:不要从Truenas Scale那里拉取镜像,在命令行里拉取,一般的教程都会给一个可以访问的镜像站。(如果还是不行就通过VSCode的Remote-SSH远程连接服务器,再在主机上开代理克隆,VSCode会帮忙做代理的转发,如果还是不行就下载之后拖进去,如果拖进去都不行的话你可以查查怎么在linux上代理……)

如果不行可以考虑加一些镜像站(不知道管不管用,但我加上之后挺快):

nano /etc/docker/daemon.json

增加一个字段:

{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com",
    "https://registry.docker-cn.com"
  ]
}

然后重新加载配置并重新运行docker:

systemctl daemon-reload
systemctl restart docker

拉取后端口无法使用,以配置calibre为例

docker成功pull下来还启动之后,端口映射也映射了,居然用不了!

我参考的教程是这个:linux部署calibre-web服务 - 沉默的羊

这很奇怪,我刚好又查到一篇:解锁TrueNAS SCALE 三方docker容器网络访问限制,默认是关闭的;并添加Portainer-CE容器webGUI管理器_truenas not found docker-CSDN博客

总之如下。

1. 拉取Calibre-Web

终端运行

git clone https://github.com/linuxserver/docker-calibre-web
cd docker-calibre-web
nano docker-compose.yml

粘贴以下内容到编辑器(不要用最新版因为最新版已经不支持了Truenas Scale 2022了,另外注意改一下底下额外标注的两个参数):

version: "2.1"
services:
  calibre-web:
    image: lscr.io/linuxserver/calibre-web:latest
    container_name: calibre-web
    environment:
      - PUID=0 # 这个参数要改成你自己的!可以用`id 你的用户名`查到;硬是用root也可以。
      - PGID=0 # 这个参数要改成你自己的组名!可以用`id 你的用户名`查到。硬是用root的组可能会影响上传文件。
      - TZ=Asia/Shanghai
      - DOCKER_MODS=linuxserver/mods:universal-calibre #optional
      - OAUTHLIB_RELAX_TOKEN_SCOPE=1 #optional
    volumes:
      - ./config:/config
      - ./books:/books # optional!可以改,不改的话也记住自己的书都存到了这里
      - ./imports:/imports
    ports:
      - 8083:8083
    restart: unless-stopped

保存后继续在终端运行:

sudo docker-compose up -d

等待一段时间即可部署完成。

通过docker ps -a可查看部署情况,你应该看到类似下文:

lscr.io/linuxserver/calibre-web:latest   "/init"   20 minutes ago   Up 11 minutes   0.0.0.0:8083->8083/tcp, :::8083->8083/tcp   calibre-web

但你会发现你还是访问不了8083端口。

重点来了!

2. 开启Docker端口转发

Truenas Scale默认没有防火墙,但是Docker没有开启端口转发。
其实只要改配置删掉不开启端口转发的配置就行了!

步骤如下:

nano /etc/docker/daemon.json

删掉我框柱的这两个属性:
在这里插入图片描述
重启docker配置和docker:

systemctl daemon-reload
systemctl restart docker

就可以了!

docker拉起后,等calibre-web初始化结束,就可以通过访问 http://公网ip:8083 ,初始账号是admin,初始密码是admin123。如果访问不了的朋友,再检查一下自己的8083端口有没有打开。
在这里插入图片描述

3. 更多配置

在这里下载空的matadata.db:How can generate a metadata.db file in command line mode(not docker)? · Issue #1695 · janeczku/calibre-web:https://github.com/OzzieIsaacs/calibre-web-test/blob/main/test/Calibre_db/metadata.db

上传到项目的./books文件夹中:
在这里插入图片描述
在终端设置这个文件的权限为666或者777:

chmod 666 ./books/metadata.db

在选择DataSet那页点到上级,选这个文件。

在这里插入图片描述

在这里插入图片描述

然后保存就行。刚一打开是这样:

在这里插入图片描述

本账号所有文章均为原创,欢迎转载,请注明文章出处:https://shandianchengzi.blog.csdn.net/article/details/149394416。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐