最稳妥方式是直接修改data-root:先停服务、查现状,再用rsync同步数据至新路径,接着仅更新/etc/docker/daemon.json中的"data-root"字段,最后重载并启动服务,验证无误后逐步清理旧目录。

直接修改 data-root 是最稳妥、官方推荐的方式,能彻底解耦容器数据与系统盘,同时兼容 Swarm、卷管理、镜像层复用等全部功能。关键不在“能不能”,而在“停得稳、拷得全、配得准、启得顺”。
✅ 停服务 + 查现状:别急着动,先看清底子
执行前确认 Docker 已完全停止,且掌握当前占用和目标空间是否足够:
-
停服务:
sudo systemctl stop docker(确保ps aux | grep dockerd无残留进程) -
查用量:
docker system df -v看镜像、容器、构建缓存总大小;du -sh /var/lib/docker做交叉验证 -
选目标路径:比如挂载在
/mnt/ssd的 NVMe 盘,创建目录sudo mkdir -p /mnt/ssd/docker -
查权限:确保该路径属主为
root:root,权限至少700(sudo chown root:root /mnt/ssd/docker && sudo chmod 700 /mnt/ssd/docker)
? 迁移数据:用 rsync 保权限、可中断、可验证
不建议 mv,一旦中断或出错难回退;cp -a 虽可用,但无进度、无校验。rsync 是生产环境首选:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- 执行同步:
sudo rsync -avz --progress /var/lib/docker/ /mnt/ssd/docker/(注意末尾斜杠,表示同步目录内容而非整个 docker 目录) - 同步完成后,快速比对文件数和大小:
sudo du -sh /var/lib/docker /mnt/ssd/docker和sudo find /var/lib/docker | wc -lvssudo find /mnt/ssd/docker | wc -l - 若 SELinux 启用(如 CentOS/RHEL),需打标:
sudo semanage fcontext -a -t container_file_t "/mnt/ssd/docker(/.*)?" && sudo restorecon -Rv /mnt/ssd/docker
⚙️ 配置生效:只改 daemon.json,不碰 systemd
修改 /etc/docker/daemon.json 是 Docker 官方长期支持的标准方式,清晰、可版本化、无启动参数冲突风险:
- 若文件不存在,新建;存在则编辑,**仅添加或更新
"data-root"字段**,其他配置(如storage-driver、registry-mirrors、log-opts)一律保留原样 - 示例内容(严格 JSON 格式,末行无逗号):
{
"data-root": "/mnt/ssd/docker"
} - 重载配置:
sudo systemctl daemon-reload,再启动:sudo systemctl start docker - 验证是否生效:
docker info | grep "Docker Root Dir"应输出新路径;docker run hello-world测试基础拉取与运行
? 收尾清理:留痕备份,不贸然删
迁移成功后不要立刻清空旧目录,按节奏逐步释放:
- 先重命名留档:
sudo mv /var/lib/docker /var/lib/docker.pre-migration - 观察 1–2 天:确认所有容器正常运行、新镜像可拉取、卷读写无异常、日志无报错
- 确认无误后,再安全清理:
sudo rm -rf /var/lib/docker.pre-migration - (可选)加软链临时兼容旧脚本:
sudo ln -s /mnt/ssd/docker /var/lib/docker,但非必须,也不推荐长期依赖










