Docker镜像存储路径迁移指南(解决磁盘空间不足问题)

Docker 部署中 no space left on device 错误及镜像迁移指南

在进行 Docker 部署时,经常会出现如下错误:

复制代码
no space left on device

这是由于镜像存储文件夹磁盘空间不足引起的。通常解决方法是更换默认的镜像保存路径 /var/lib/docker。然而,在更换过程中,常常会遇到以下错误:

bash 复制代码
Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xe" for details.

不少用户因此而困扰。本文将详细记录镜像迁移的步骤以及可能遇到的问题。

具体步骤

1. 输入 docker info 查看 Docker 信息

有两个关键点需要注意:

  • Storage Driver : 如 vfs,这可能影响迁移后是否能保留原有镜像和容器信息。
  • Docker Root Dir: 默认的镜像文件存储位置。

2. 关闭 Docker 服务

bash 复制代码
sudo systemctl stop docker.service

3. 拷贝现有镜像到新目录

/var/lib/docker 中的所有文件拷贝到新的文件夹(如 /home/user/docker_work/docker):

bash 复制代码
sudo cp -r /var/lib/docker/* /home/user/docker_work/docker

如果出现权限不足的情况,可以先修改原目录权限:

bash 复制代码
sudo chmod -R 777 /var/lib/docker

然后再执行拷贝操作。


4. 修改 /etc/docker/daemon.json

该文件默认不存在,需要手动创建,并填入以下内容:

json 复制代码
{
  "data-root": "/home/user/docker_work/docker"
}

5. 更新 Docker 配置并重启服务

bash 复制代码
sudo systemctl daemon-reload
sudo systemctl restart docker

如果出现报错:

bash 复制代码
Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xe" for details.

说明是 /etc/docker/daemon.json 文件格式问题,请仔细检查 JSON 格式、逗号等符号


6. 检查迁移结果

运行以下命令确认 Docker 数据目录已经更改:

bash 复制代码
sudo docker info

查看输出中的 Docker Root Dir 是否为新路径 /home/user/docker_work/docker

再运行:

bash 复制代码
sudo docker images

如果能够看到原有镜像,则说明迁移成功。但若 Storage Driver 与之前不一致,则可能无法显示原有镜像。


7. 修改 Storage Driver

7.1 尝试解决

参考其他资料,修改 Docker 配置文件:

bash 复制代码
/etc/systemd/system/multi-user.target.wants/docker.service

将原始内容:

bash 复制代码
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

改为:

bash 复制代码
ExecStart=/usr/bin/dockerd --graph=/mnt/docker --storage-driver=overlay

然后执行:

bash 复制代码
sudo systemctl daemon-reload
sudo systemctl restart docker

但在某些情况下仍然会报错:

bash 复制代码
Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xe" for details.

即使检查了 daemon.json 的格式也未发现问题。


7.2 推荐解决方法

恢复 /etc/systemd/system/multi-user.target.wants/docker.service 原样,不做修改。

修改 /etc/docker/daemon.json 内容如下:

json 复制代码
{
  "data-root": "/home/user/docker_work/docker",
  "storage-driver": "vfs"
}

保存后执行:

bash 复制代码
sudo systemctl daemon-reload
sudo systemctl restart docker

再次运行 sudo docker info

  • 确认 Storage Driver 与之前一致;
  • Docker Root Dir 已指向新路径,表示镜像存储位置修改成功;
  • 运行 sudo docker images 能显示原有镜像,表示迁移成功。

8. 删除默认镜像文件夹内容(可选)

确认迁移无误后,可以删除原目录内容以释放空间:

bash 复制代码
sudo rm -rf /var/lib/docker/*

修改前:

修改后

总结

本文详细介绍了在 Ubuntu 20.04 系统上如何修改 Docker 镜像存储位置,并迁移现有镜像到新路径的过程。同时,针对迁移过程中可能出现的报错进行了分析和解决,确保迁移顺利完成。

相关推荐
i***22078 分钟前
springboot整合libreoffice(两种方式,使用本地和远程的libreoffice);docker中同时部署应用和libreoffice
spring boot·后端·docker
q***16081 小时前
SpringCloud 系列教程:微服务的未来(二)Mybatis-Plus的条件构造器、自定义SQL、Service接口基本用法
spring cloud·微服务·mybatis
羑悻的小杀马特2 小时前
轻量跨云·掌控无界:Portainer CE + cpolar 让远程容器运维像点外卖一样简单——免复杂配置,安全直达对应集群
运维·网络·安全·docker·cpolar
EAIReport8 小时前
企业级报表自动化:基于Docker的部署实践
运维·docker·自动化
努力进修8 小时前
跨设备文件共享零烦恼!PicoShare+cpolar让跨设备传输更简单
云原生·eureka·cpolar
小坏讲微服务9 小时前
Spring Cloud Alibaba 整合 Scala 教程完整使用
java·开发语言·分布式·spring cloud·sentinel·scala·后端开发
cui_win12 小时前
Docker Compose 部署一个完整的Prometheus监控告警系统
docker·容器·prometheus
ALex_zry16 小时前
Docker Compose运维技术实战分享:从安装到架构解析
运维·docker·架构
2501_9411497918 小时前
Go语言高性能分布式缓存与Redis实战分享:微服务缓存优化与访问性能提升经验
eureka
roman_日积跬步-终至千里21 小时前
【Docker】Docker Stop 后到底发生了什么?——从信号机制到优雅停机
运维·docker·容器