最可靠做法是修改data-root配置:先停服务,用rsync迁移/var/lib/docker数据至新路径(如/data/docker),再编辑/etc/docker/daemon.json设置"data-root":"/data/docker",最后重启验证;软链接和systemd参数方式均不推荐。

直接改 data-root 是最可靠的做法,不建议用软链接或改 systemd 启动参数——前者在某些内核下会静默失效,后者在 Docker 1.12+ 已被弃用,容易因重载遗漏导致配置不生效。
确认当前存储位置和驱动类型
先看 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 默认支持,btrfs 需验证,NFS/cifs 不推荐)
停服务 + rsync 迁移数据(不是 cp)
避免权限丢失、硬链接断裂或扩展属性损坏,必须用 rsync:
- 停掉所有相关服务:
sudo systemctl stop docker.socketsudo systemctl stop docker - 创建目标目录(例如挂载在大容量盘上的
/data/docker):sudo mkdir -p /data/docker - 安全迁移:
sudo rsync -avz --delete /var/lib/docker/ /data/docker/
加--delete确保目标干净,避免旧残留干扰 - 检查权限:
sudo ls -ld /data/docker必须是root:root且有读写执行权
配置 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/docker -
docker run --rm hello-world—— 能成功运行说明路径已切换、运行时正常
常见问题排查
如果启动失败,报错类似 failed to start daemon: error initializing graphdriver,大概率是:
- 新路径权限不对(非 root:root 或缺少写权限)
- 文件系统不支持 overlay2(比如挂载了 NFS/cifs,或未启用 d_type 的 xfs)
- daemon.json 格式错误(多逗号、缺引号、路径末尾多了 /)
不复杂但容易忽略。


















