docker默认将数据存于/var/lib/docker,占满根分区会导致系统瘫痪;应通过daemon.json设data-root或软链迁移至大分区,停服、备份、权限校验、验证启动缺一不可。

docker 默认把镜像、容器层、日志、元数据全塞进 /var/lib/docker,而这个路径通常挂在系统盘上——根分区一满,连 ssh 都可能进不去。改存储目录不是“可选操作”,是磁盘空间告急时的保命动作。
确认当前 Docker Root Dir 是否真在 /var/lib/docker
别凭经验猜,先查实:
sudo docker info | grep "Docker Root Dir"
输出类似 Docker Root Dir: /var/lib/docker 才说明确实在这里。如果已经软链过或改过配置,结果会不同——这步跳过会导致后续迁移白忙。
用 daemon.json 设置 data-root 是最稳的方式
这是 Docker 官方推荐路径,兼容性好、语义清晰、systemd 管理无冲突。但注意:data-root 必须在 dockerd 启动前生效,且不能和旧数据共存。
- 停止服务:
sudo systemctl stop docker - 确保目标路径存在且权限正确:
sudo mkdir -p /data/docker,然后sudo chown -R root:root /data/docker(Docker 20.10+ 默认以 root 运行,不建议给 docker 组权限) - 备份并编辑
/etc/docker/daemon.json(不存在就新建):
内容只写这一行,别加多余逗号或注释:{"data-root": "/data/docker"} - 迁移旧数据(关键!):
sudo rsync -aP /var/lib/docker/ /data/docker/(用rsync而非cp -a,中断可续传;末尾斜杠不能少) - 启动:
sudo systemctl start docker,再docker info确认 Root Dir 已变
⚠️ 常见坑:daemon.json 文件语法错误(比如多逗号、中文引号)、路径没 chown 导致 dockerd 启动失败、忘记停服务直接改配置——这些都会让 systemctl start docker 卡住或报 failed to start daemon。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
软链接方案适合快速救急,但有隐藏风险
它不改 Docker 行为,只是把 /var/lib/docker 变成指向大分区的符号链接。操作快,但绕过了 Docker 的路径感知逻辑。
- 停服务:
sudo systemctl stop docker - 移动数据:
sudo mv /var/lib/docker /data/docker - 建软链:
sudo ln -s /data/docker /var/lib/docker - 启动并验证:
sudo systemctl start docker && sudo docker info | grep "Docker Root Dir"
⚠️ 注意点:软链目标必须是绝对路径;/data/docker 目录权限要和原 /var/lib/docker 一致(通常是 root:root,755);某些安全加固环境(如 SELinux Enforcing)会拒绝跨文件系统软链访问,需额外打标签或临时 setenforce 0 测试。
别碰 --graph 和 systemd ExecStart 修改
--graph 参数在 Docker 17.05+ 已被弃用,文档明确标记为 deprecated;修改 /usr/lib/systemd/system/docker.service 中的 ExecStart 行,看似直接,但升级 Docker 包时极易被覆盖,且不同发行版路径不统一(Ubuntu 用 /lib/systemd/system/docker.service),维护成本高。
真正容易被忽略的是:无论哪种方式,迁移后旧 /var/lib/docker 目录不能直接删。先留着,等新路径稳定运行 24 小时、所有容器重建验证无日志丢失、镜像拉取正常,再手动 rm -rf /var/lib/docker。硬盘空间焦虑不该换来数据丢失。










