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 镜像存储位置,并迁移现有镜像到新路径的过程。同时,针对迁移过程中可能出现的报错进行了分析和解决,确保迁移顺利完成。