Docker 存储目录迁移解决 No space left on device一、问题背景在使用 Docker 构建镜像时出现以下错误chmod: changing permissions of ./shooting: No space left on device查看磁盘使用情况$df-h文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root 50G 50G 59M100% / /dev/mapper/centos-home 418G 652M 418G1% /home根因分析Docker 默认数据目录/var/lib/docker/位于根分区centos-root该分区已 100% 占满而/home分区centos-home有 418G 空闲空间几乎未使用。解决方案将 Docker 数据目录从/var/lib/docker/迁移到/home/docker/利用 home 分区的大容量空间。二、迁移前准备1. 确认当前 Docker 数据目录dockerinfo|grepDocker Root Dir# 输出Docker Root Dir: /var/lib/docker2. 查看当前 Docker 占用空间du-sh/var/lib/docker/# 输出64G3. 确认目标分区空间充足df-h/home# 确保 /home 分区可用空间 Docker 数据目录大小三、迁移步骤第一步停止所有容器和 Docker 服务# 停止所有运行中的容器dockerstop$(dockerps-q)# 停止 Docker socket防止自动激活systemctl stop docker.socket# 停止 Docker 服务systemctl stopdocker# 停止 containerdsystemctl stop containerd# 确认都已停止systemctl statusdockersystemctl status docker.socket# 验证没有 Docker 进程残留psaux|grepdocker|grep-vgrep注意必须先停止docker.socket再停止docker否则 socket 可能会自动重新激活 Docker 服务。如果ps aux仍有 Docker 进程残留使用kill手动终止。第二步迁移数据并创建软链接可选# 移动现有的 Docker 数据到新位置mv/var/lib/docker /home/docker# 创建软链接确保兼容性可选# 软链接方案Docker 仍通过原路径访问实际数据存储在 /home 分区无需修改 daemon.jsonln-s/home/docker /var/lib/docker# 验证软链接创建成功ls-la/var/lib/docker# 期望输出/var/lib/docker - /home/docker说明使用mv直接移动目录相比rsync/cp更简洁移动完成后原目录自动消失无需额外清理由于/var/lib/docker和/home位于不同分区mv会自动执行跨分区复制删除操作软链接方案推荐创建软链接后Docker 仍通过/var/lib/docker路径访问数据无需修改daemon.json配置兼容性更好对 Docker 完全透明不创建软链接方案需在下一步修改daemon.json配置data-root: /home/dockerDocker 直接从新路径读取数据迁移时间取决于数据量64G 数据可能需要几分钟到十几分钟请耐心等待第三步验证数据迁移完整性# 验证软链接指向正确ls-la/var/lib/docker# 期望输出/var/lib/docker - /home/docker# 确认新目录数据完整du-sh/home/docker/确认软链接正确且数据目录大小正常后继续下一步。第四步重启 Docker 服务systemctl startdocker第五步验证迁移结果# 确认 Docker 数据目录软链接方式下仍显示原路径实际已存储在 /home 分区dockerinfo|grepDocker Root Dir# 期望输出Docker Root Dir: /var/lib/docker# 确认实际数据已存储在 /home 分区df-h/home/docker/# 确认镜像和容器是否正常dockerimagesdockerps-a四、迁移后验证重新执行之前失败的 Docker 构建命令cd/home/shooting/dockerbuild-tshooting.查看磁盘空间变化df-h# 根分区使用率应明显下降# /home 分区使用率相应上升五、补充优化清理 Docker 无用资源如果迁移后根分区空间仍不够可以清理 Docker 的无用资源# 清理所有未使用的镜像、容器、网络和构建缓存dockersystem prune-a# 查看各部分占用空间dockersystemdf六、注意事项迁移前确保目标分区空间充足至少预留 Docker 当前数据 1.2 倍的空间用于后续增长迁移过程中必须停止 Docker 服务否则可能导致数据不一致软链接方式无需修改 Docker 配置兼容性好对 Docker 透明SELinux 环境下如遇权限问题可能需要执行chcon-Rtsvirt_sandbox_file_t /home/docker迁移完成后建议在/home/docker所在分区设置磁盘使用告警避免再次出现空间不足七、回滚方案如果迁移后出现问题可以快速回滚# 停止 Dockersystemctl stopdocker# 删除软链接rm/var/lib/docker# 将数据移回原位置mv/home/docker /var/lib/docker# 重启 Dockersystemctl startdocker
Docker 存储目录迁移:解决 No space left on device
Docker 存储目录迁移解决 No space left on device一、问题背景在使用 Docker 构建镜像时出现以下错误chmod: changing permissions of ./shooting: No space left on device查看磁盘使用情况$df-h文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root 50G 50G 59M100% / /dev/mapper/centos-home 418G 652M 418G1% /home根因分析Docker 默认数据目录/var/lib/docker/位于根分区centos-root该分区已 100% 占满而/home分区centos-home有 418G 空闲空间几乎未使用。解决方案将 Docker 数据目录从/var/lib/docker/迁移到/home/docker/利用 home 分区的大容量空间。二、迁移前准备1. 确认当前 Docker 数据目录dockerinfo|grepDocker Root Dir# 输出Docker Root Dir: /var/lib/docker2. 查看当前 Docker 占用空间du-sh/var/lib/docker/# 输出64G3. 确认目标分区空间充足df-h/home# 确保 /home 分区可用空间 Docker 数据目录大小三、迁移步骤第一步停止所有容器和 Docker 服务# 停止所有运行中的容器dockerstop$(dockerps-q)# 停止 Docker socket防止自动激活systemctl stop docker.socket# 停止 Docker 服务systemctl stopdocker# 停止 containerdsystemctl stop containerd# 确认都已停止systemctl statusdockersystemctl status docker.socket# 验证没有 Docker 进程残留psaux|grepdocker|grep-vgrep注意必须先停止docker.socket再停止docker否则 socket 可能会自动重新激活 Docker 服务。如果ps aux仍有 Docker 进程残留使用kill手动终止。第二步迁移数据并创建软链接可选# 移动现有的 Docker 数据到新位置mv/var/lib/docker /home/docker# 创建软链接确保兼容性可选# 软链接方案Docker 仍通过原路径访问实际数据存储在 /home 分区无需修改 daemon.jsonln-s/home/docker /var/lib/docker# 验证软链接创建成功ls-la/var/lib/docker# 期望输出/var/lib/docker - /home/docker说明使用mv直接移动目录相比rsync/cp更简洁移动完成后原目录自动消失无需额外清理由于/var/lib/docker和/home位于不同分区mv会自动执行跨分区复制删除操作软链接方案推荐创建软链接后Docker 仍通过/var/lib/docker路径访问数据无需修改daemon.json配置兼容性更好对 Docker 完全透明不创建软链接方案需在下一步修改daemon.json配置data-root: /home/dockerDocker 直接从新路径读取数据迁移时间取决于数据量64G 数据可能需要几分钟到十几分钟请耐心等待第三步验证数据迁移完整性# 验证软链接指向正确ls-la/var/lib/docker# 期望输出/var/lib/docker - /home/docker# 确认新目录数据完整du-sh/home/docker/确认软链接正确且数据目录大小正常后继续下一步。第四步重启 Docker 服务systemctl startdocker第五步验证迁移结果# 确认 Docker 数据目录软链接方式下仍显示原路径实际已存储在 /home 分区dockerinfo|grepDocker Root Dir# 期望输出Docker Root Dir: /var/lib/docker# 确认实际数据已存储在 /home 分区df-h/home/docker/# 确认镜像和容器是否正常dockerimagesdockerps-a四、迁移后验证重新执行之前失败的 Docker 构建命令cd/home/shooting/dockerbuild-tshooting.查看磁盘空间变化df-h# 根分区使用率应明显下降# /home 分区使用率相应上升五、补充优化清理 Docker 无用资源如果迁移后根分区空间仍不够可以清理 Docker 的无用资源# 清理所有未使用的镜像、容器、网络和构建缓存dockersystem prune-a# 查看各部分占用空间dockersystemdf六、注意事项迁移前确保目标分区空间充足至少预留 Docker 当前数据 1.2 倍的空间用于后续增长迁移过程中必须停止 Docker 服务否则可能导致数据不一致软链接方式无需修改 Docker 配置兼容性好对 Docker 透明SELinux 环境下如遇权限问题可能需要执行chcon-Rtsvirt_sandbox_file_t /home/docker迁移完成后建议在/home/docker所在分区设置磁盘使用告警避免再次出现空间不足七、回滚方案如果迁移后出现问题可以快速回滚# 停止 Dockersystemctl stopdocker# 删除软链接rm/var/lib/docker# 将数据移回原位置mv/home/docker /var/lib/docker# 重启 Dockersystemctl startdocker