最稳妥方式是直接修改data-root:先停服务并用rsync迁移/var/lib/docker到新路径,再配置/etc/docker/daemon.json指定data-root,最后重启验证;禁用软链接或启动参数改法,避免silently失效或弃用风险。

直接改 data-root 是最稳妥的方式,别用软链接或改 docker.service 启动参数——前者在某些内核版本下会 silently 失效,后者在新版 Docker(1.12+)中已被弃用,且 systemd 重载后容易漏 reload。
确认当前存储路径和驱动类型
先看 Docker 现在到底把数据塞哪儿了、用的什么底层机制:
docker info | grep -E "(Storage Driver|Docker Root Dir)"
输出类似:
Docker Root Dir: /var/lib/docker Storage Driver: overlay2
注意两点:
-
/var/lib/docker通常挂载在系统盘,空间小、扛不住大量镜像或日志 -
overlay2是当前主流驱动,迁移时无需切换驱动,但必须确保新路径所在文件系统支持 d_type(xfs/ext4 都 OK,btrfs 要额外验证)
停服务 + rsync 迁移数据(不是 cp)
直接 cp -r 容易丢权限、硬链接或扩展属性,rsync 才是生产环境安全迁移的底线:
sudo systemctl stop dockersudo systemctl stop docker.socket(避免 socket 激活残留进程)sudo mkdir -p /data/dockersudo rsync -avz --delete /var/lib/docker/ /data/docker/
关键点:
-
--delete确保目标目录干净,避免旧残留干扰 - 迁移后检查权限:
sudo ls -ld /data/docker必须是root:root,且有读写执行权 - 如果原路径在 LVM 或加密卷上,新路径也建议用同类型卷,避免 overlay2 元数据异常
配置 daemon.json 并重启
编辑配置文件,只写 data-root,其他字段不动:
sudo nano /etc/docker/daemon.json
填入(路径末尾不加斜杠):
{"data-root": "/data/docker"}
然后重载并启动:
sudo systemctl daemon-reloadsudo systemctl start docker
验证是否生效:
docker info | grep "Docker Root Dir" —— 输出必须是 /data/dockerdocker run --rm hello-world —— 能跑通说明容器运行时路径已切换
常见错误:
- 启动失败报
failed to start daemon: error initializing graphdriver:多半是新路径权限不对,或文件系统不支持 overlay2(比如某些 NFS 或 cifs) - 旧
/var/lib/docker下还有内容:说明rsync没跑完就启服务了,或者systemctl stop没真正停住所有 dockerd 进程
清理旧目录前务必盯住 24 小时
新路径跑稳后,别急着删旧目录。先观察:
- 用
docker ps -a和docker images确认所有容器、镜像都还在 - 进新路径查子目录:
ls /data/docker/overlay2 /data/docker/containers /data/docker/volumes,必须都有内容 - 跑一个带 volume 的容器,写点文件再删掉,确认 volume 数据能持久化
全部 OK 后,再执行:
sudo rm -rf /var/lib/docker
注意:不是 rm -rf /var/lib/docker/*,必须删整个目录,否则 systemd 可能因残留 socket 或 pid 文件导致下次升级出问题。











