必须修改 Docker 默认存储路径至大容量数据盘以防止系统盘爆满。先确认当前路径并停止 Docker 服务,再创建新目录并设为 root:root 权限,用 rsync 迁移数据后配置 /etc/docker/daemon.json 的 data-root 字段,最后重载并验证生效。

当系统盘空间紧张,而你有一块挂载好的大容量数据盘(比如 /mnt/data),需要把 Docker 所有镜像、容器、卷的底层数据彻底迁移到新盘,避免 /var/lib/docker 持续膨胀导致系统无法登录或服务崩溃,就必须修改其默认存储根路径。
确认当前存储位置并停用 Docker 服务
先查清现状,防止误操作覆盖错误目录:docker info | grep "Docker Root Dir",输出应为 Docker Root Dir: /var/lib/docker。
必须完全停止 Docker 进程,否则迁移中写入会导致数据损坏:sudo systemctl stop docker.socket && sudo systemctl stop docker.service。
验证是否真正停止:systemctl is-active docker 返回 inactive 才算成功。如果返回 activating 或卡住,需检查是否有残留 containerd 进程并手动 kill。
准备新存储目录
选择已挂载且持久化(写入 /etc/fstab)的分区,例如 /mnt/data。执行:sudo mkdir -p /mnt/data/docker。
【属主必须设为 root:root】,Docker daemon 启动时以 root 身份运行,若设成 docker:docker 或其他用户,服务将因权限拒绝而启动失败。
检查文件系统类型:df -T /mnt/data,确保是 ext4 或 xfs;禁用 FAT32、NTFS 或未加 noac 的 NFS 挂载,否则 overlay2 驱动会报错退出。
迁移已有数据(可选但强烈建议)
方法一:用 rsync 安全同步(保留权限、硬链接、时间戳):sudo rsync -aP /var/lib/docker/ /mnt/data/docker/。注意源路径末尾有 /,否则会把整个 docker 目录复制进去,造成嵌套。
方法二:直接 mv(仅限全新安装、无任何镜像/容器场景):sudo mv /var/lib/docker /mnt/data/docker。这步不可逆,执行前务必确认 docker ps -a 和 docker images 均为空。
迁移后对比大小:sudo du -sh /var/lib/docker 和 sudo du -sh /mnt/data/docker,二者应基本一致。若新目录明显偏小,说明部分子目录(如 overlay2 下的层)未同步完整,需重跑 rsync。
配置 data-root 并重启验证
第一步:编辑配置文件:sudo nano /etc/docker/daemon.json。若文件不存在,直接新建。
第二步:写入标准 JSON 格式内容,仅含 data-root 字段:{"data-root": "/mnt/data/docker"}。【末尾不能有多余逗号,JSON 格式错误将导致 Docker 启动静默失败】。
第三步:语法校验:jq . /etc/docker/daemon.json > /dev/null || echo "JSON error",无输出即通过。
第四步:重载配置并启动:sudo systemctl daemon-reload && sudo systemctl start docker。
第五步:验证生效:docker info | grep "Docker Root Dir" 应返回 Docker Root Dir: /mnt/data/docker。此时运行 docker run hello-world 成功拉取并启动,即完成全部操作。


















