TrueNas设置Docker数据目录到boot-pool

起初是因为我的TrueNas是装在一根500G的SN750的MVME SSD上,所以想要将truenas中的docker数据设置放在boot-pool中,这样可以不用跑在机械硬盘的阵列上,可以减少唤醒机械硬盘的次数(我设置了硬盘休眠,用以节省电量),而且就算哪天SN750挂了也不怕,毕竟只是跑几个容器和系统,随时可以重做,把容器的关键数据定时备份到机械阵列中就好。但是TrueNas的GUI界面不允许设置docker的数据目录为boot-pool。所以放弃了用GUI管理docker,shell中管理运行。

传统方式是修改/etc/docker/daemon.json,添加类似"data-root": "/mnt/boot-pool/docker-data"这样的目录指定就行,但是TrueNas会在重启之后删除掉/etc/docker/daemon.json文件,是因为:

  • TrueNAS SCALE 是基于 Debian + Kubernetes + Docker 的一套系统
  • 系统服务(包括 Docker)由 TrueNAS 的 middlewared 动态生成配置
  • /etc/docker/daemon.json 不被视为持久配置文件,每次重启 TrueNAS 时,Docker 服务会被 middleware 自动重启并清空配置

解决方法:

使用 systemd drop-in 文件来持久化 Docker 启动参数

  • 步骤 1:创建一个 systemd 的 override 文件,绕过 daemon.json 来配置 Docker 启动参数

    1. 创建 override 文件

      # 如果没有就创建目录,但正常来说应该系统已经创建了
      sudo mkdir -p /etc/systemd/system/docker.service.d/
      touch override.conf
      
    2. 编辑 drop-in 文件

      vim /etc/systemd/system/docker.service.d/override.conf
      
      • 示例:添加你需要的参数,例如加速器、日志驱动等:
      [Service]
      ExecStart=
      ExecStart=/usr/bin/dockerd --registry-mirror=https://mirror.ccs.tencentyun.com --log-driver json-file
      
    3. 填入以下内容

      # --data-root= 后面接你的存储数据的目录
      [Service]
      ExecStart=
      ExecStart=/usr/bin/dockerd --data-root=/data/docker/docker-root
      

      注意:

      • 第一行 ExecStart= 是必要的,用于清除默认的启动命令。
      • /usr/bin/dockerd 路径是标准位置,但你可以确认下是否为这个(which dockerd
  • 步骤 2:重载 systemd 并重启 Docker

    systemctl daemon-reexec
    systemctl daemon-reload
    systemctl restart docker
    
  • 步骤 3:验证是否生效

    docker info | grep "Docker Root Dir"
    

    你应该看到:

    Docker Root Dir: /data/docker/docker-root
    

此设置在重启 TrueNAS 后依然会生效,因为:

  • /etc/systemd/system/docker.service.d/override.conf 是 systemd 的官方 override 配置方式
  • 不会被 TrueNAS 的 middlewared 自动清除
  • 不依赖 /etc/docker/daemon.json

可选:清理旧数据

如果你已经运行过 Docker,旧数据还在默认路径 /var/lib/docker,你可以:

sudo systemctl stop docker
sudo mv /var/lib/docker /var/lib/docker.bak
sudo mkdir -p /data/docker/docker-root
sudo systemctl start docker

确保你的 /data 目录挂载是持久的

我的/data目录是本身就由boot-pool在zfs里面设置好的数据集,可通过下面的方法确定:

root@truenas:~# zfs list
NAME                                                         USED  AVAIL  REFER  MOUNTPOINT
OCEANPOOL                                                   4.45T  9.95T   166K  /mnt/OCEANPOOL
OCEANPOOL/.ix-virt                                          1.80M  9.95T   153K  legacy
OCEANPOOL/.ix-virt/buckets                                   153K  9.95T   153K  legacy
OCEANPOOL/.ix-virt/containers                                153K  9.95T   153K  legacy
OCEANPOOL/.ix-virt/custom                                    153K  9.95T   153K  legacy
OCEANPOOL/.ix-virt/deleted                                   920K  9.95T   153K  legacy
OCEANPOOL/.ix-virt/deleted/buckets                           153K  9.95T   153K  legacy
OCEANPOOL/.ix-virt/deleted/containers                        153K  9.95T   153K  legacy
OCEANPOOL/.ix-virt/deleted/custom                            153K  9.95T   153K  legacy
OCEANPOOL/.ix-virt/deleted/images                            153K  9.95T   153K  legacy
OCEANPOOL/.ix-virt/deleted/virtual-machines                  153K  9.95T   153K  legacy
OCEANPOOL/.ix-virt/images                                    153K  9.95T   153K  legacy
OCEANPOOL/.ix-virt/virtual-machines                          153K  9.95T   153K  legacy
OCEANPOOL/Alpha                                             4.45T  9.95T  4.45T  /mnt/OCEANPOOL/Alpha
boot-pool                                                   4.85G   445G    96K  none
boot-pool/.system                                            288M   445G   112K  legacy
boot-pool/.system/configs-ae32c386e13840b2bf9c0083275e7941  3.10M   445G  3.10M  legacy
boot-pool/.system/cores                                      120K  1024M   120K  legacy
boot-pool/.system/netdata-ae32c386e13840b2bf9c0083275e7941   285M   445G   285M  legacy
boot-pool/.system/nfs                                        112K   445G   112K  legacy
boot-pool/.system/samba4                                     296K   445G   296K  legacy
boot-pool/ROOT                                              4.53G   445G    96K  none
boot-pool/ROOT/25.04.1                                      4.53G   445G   174M  legacy
boot-pool/ROOT/25.04.1/audit                                39.6M   445G  39.6M  /audit
boot-pool/ROOT/25.04.1/conf                                 7.06M   445G  7.06M  /conf
boot-pool/ROOT/25.04.1/data                                 1.69G   445G  1.69G  /data # <------默认已挂载
boot-pool/ROOT/25.04.1/etc                                  7.23M   445G  6.18M  /etc
boot-pool/ROOT/25.04.1/home                                  120K   445G   120K  /home
boot-pool/ROOT/25.04.1/mnt                                   180K   445G   180K  /mnt
boot-pool/ROOT/25.04.1/opt                                    96K   445G    96K  /opt
boot-pool/ROOT/25.04.1/root                                  440K   445G   440K  /root
boot-pool/ROOT/25.04.1/usr                                  2.53G   445G  2.53G  /usr
boot-pool/ROOT/25.04.1/var                                  95.2M   445G  5.10M  /var
boot-pool/ROOT/25.04.1/var/ca-certificates                    96K   445G    96K  /var/local/ca-certificates
boot-pool/ROOT/25.04.1/var/lib                              27.9M   445G  27.2M  /var/lib
boot-pool/ROOT/25.04.1/var/lib/incus                         480K   445G   480K  /var/lib/incus
boot-pool/ROOT/25.04.1/var/log                              61.3M   445G  8.46M  /var/log
boot-pool/ROOT/25.04.1/var/log/journal                      52.9M   445G  52.9M  /var/log/journal
boot-pool/grub                                              8.41M   445G  8.41M  legacy

转载请注明来源