Docker 数据根目录迁移至 HDD 方案
#Docker #磁盘管理 #服务器运维
背景
N100 系统盘(117G SSD)长期维持在 85-91% 使用率,Docker 镜像占用约 10 GB,是主要的可迁移项。
当前磁盘布局:
| 设备 | 大小 | 文件系统 | 挂载点 | 使用率 |
|---|---|---|---|---|
| sda2 (SSD) | 117G | ext4 | / |
~91% |
| sdc1 (HDD) | 1.9T | btrfs | /nfs |
~25% |
| sdb2 (HDD) | 3.7T | exFAT | /smb |
~52% |
性能影响评估
| 阶段 | 影响 | 说明 |
|---|---|---|
| 容器启动 | 慢 2-5 秒 | 从 HDD 读取镜像层,仅启动时一次性 |
| 容器运行中 | 无影响 | 镜像层被 overlayfs 挂入页面缓存,与存储位置无关 |
| 容器写入(可写层) | 轻微 | 取决于应用写入频繁程度 |
结论:mt-photos、qbittorrent、openclaw 等均为长驻服务,启动多几秒可接受,运行性能无损失。
迁移目标选择
-
✅
/nfs(btrfs):完整 Linux 文件系统,支持 Unix 权限、符号链接、硬链接,可行 -
❌
/smb(exFAT):不支持 Unix 权限和符号链接,Docker 会报错,不可行
迁移步骤(待执行)
1. 停止所有容器
1 | docker stop $(docker ps -q) |
2. 停止 Docker 服务
1 | sudo systemctl stop docker |
3. 创建新数据目录
1 | sudo mkdir -p /nfs/docker |
4. 迁移现有数据
1 | sudo rsync -aP /var/lib/docker/ /nfs/docker/ |
rsync完成后先不要删除原目录,验证正常后再清理。
5. 修改 Docker 数据根目录
1 | sudo nano /etc/docker/daemon.json |
写入(若文件已存在则合并):
1 | { |
6. 重启 Docker 并验证
1 | sudo systemctl start docker |
7. 验证无误后清理原目录
1 | # 确认新路径完全正常后再执行 |
预期收益
-
SSD 释放约 10 GB,使用率从 ~91% 降至 ~83%
-
/nfs剩余 1.4T,存放 Docker 数据绰绰有余
注意事项
-
rsync必须在 Docker 停止后执行,否则迁移中数据不一致 -
btrfs 写时复制特性:Docker overlayfs 在 btrfs 上需确认兼容性,若遇问题可在
daemon.json加"storage-driver": "overlay2" -
ext-mount.service依赖/nfs挂载:确保系统启动时/nfs先于 Docker 挂载(当前 fstab 配置已满足) -
迁移前备份
daemon.json(若已有自定义配置)
延伸阅读
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 迷麟の小站!
