(2023最新版)Linux在加载(load)或者拉取(pull)镜像时报错Error processing tar file(exit status 1): write xxxxxxxxxxx: no space left on device
在docker中如果有报错信息一定要使用命令:
sudo dockerd --debug
来发现问题,这一点很重要,对于docker 来说。
问题描述:
这个错误的意思就是没有多余的空间了,用来存docker数据的磁盘空间不够了,当然我是在load的时候发现这个错误
解决方案:
- 扩展linux的硬盘
- 删掉一些不常用的容器或者镜像
- 使用命令暴力删除(不推荐)
1.1.(方案一)扩展Linux的硬盘
先加入虚拟机设置
先添加
这里我就不截图了,把每步的选择项列出来
硬盘->SCSI->创建新虚拟磁盘->设置最大磁盘大小(将虚拟磁盘拆分成多个文件)->选择磁盘文件的路径
输入命令初始化
fdisk /dev/sdb
这一步直接跟着推荐走,没有难度
接下来就是对该分区进行初始化,这里面就跟着默认值输入就行了
mkfs -t ext4 /dev/sdb2 #注意最后这个sdb2不一定是这个lsblk -f 对照自己的名字来
此时输入命令lsblk -f查看硬盘的情况,可以看到下图 sdb就是新创建的硬盘,这里我挂载了myNewDir,你们刚刚创建的时候是没有/myNewDir的并且也没有UUID就是那个很长一串数字字母
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nXi3phby-1682586988478)(E:\CSDN-Creation\unpublished\no space left on device\picture\2.png)]
1.1.2.半永久磁盘挂载
- 优点:简单
- 缺点:重启虚拟机之后就失效
进行到这一步硬盘已经初始化完成,也可以看到上图的内容,下一步就需要把硬盘挂载到你指定的文件夹下了,
cd 回到根目录
mkdir /newDisk 选择挂载位置
mount /dev/sdb2 /newDisk 挂载的分区地址 要将该分区挂在到哪个文件夹下
lsblk -f 再查看已经挂载好了
1.1.3.永久挂载磁盘
- 优点永久挂载
配置系统的配置文件
vi /etc/fstab
两种配置方式
-
通过文件路径来配置
/dev/sdb2 /newDisk ext4 defaults 0 0
-
通过UUID来配置
lsblk -f 查看UUID就是那一串数字字母 UUID=xxxx-xxxx-xxxx-xxxx-xxx /myNewDir ext4 defaults 0 0
配置完之后重新虚拟机查看结果
还是有这个挂载消息说明成功,没有则失败,失败的检查一下符号,该空格的地方有没有空格
1.1.4.docker更换根目录
首先
sysytemctl start docker 启动
docker info | grep "Docker Root Dir" 查看docker当前的根目录,一般都是var/lib/docker,不过结果按照自己查询的结果来定
systemtcl stop docker
mkdir -p /newDisk/lib 去刚刚挂载的newDisk创建一个用于装docker的文件夹
-p:如果存在,则没有错误,根据需要创建父目录意思就是,没有docker就新创建一个,有的话就在docker下创建lib
最重要的是迁移数据,网上很多教程直接没有这一步,不迁移数据,那docker之前的镜像和容器就会丢失
先yum install rsync 下载rsync:Liunx/Unix下的一个远程数据同步工具。
rsync -avz /var/lib/docker /newDisk/lib #这个操作会消耗一段时间,如果你有很多容器,镜像或者容器挂载的数据卷
完了之后
编辑 vi /etc/docker/daemon.json
{
"data-root":"/newDisk/lib/docker"
}
并在大括号内写一下以上消息
结果就是这样,最后一个不要打逗号,千万不要打要不然docker认为你还有配置需要写就会报错,这也是我踩的肯之一
重新加载
systemctl daemon-reload
重启docker
systemctl restart docker
检查docker是否变更为新目录
docker info | grep "Docker Root Dir"
最后就可以删除旧目录了,当然可以选择不删,这影响不大,顶多就是占用一点磁盘空间
rm -rf /var/lib/docker
踩肯:
- 首先/etc/docker/daemon.json这个配置文件内的最后一行配置,不能打逗号
- sudo dockerd --debug非常实用docker自带的的查看问题的命令比systemctl status docker.service" 和 “journalctl -xe” 好用太多了
1.2.(方案二)删掉一些不常用的容器或者镜像
docker info 找到 Docker Root Dir这个看后面的目录是什么
或者docker info | grep "Docker Root Dir"这个就是docker的根目录
cd /var/lib/docker 基本上都是在这个目录,但是一切以上面Docker Root Dir为准
du -sh * 查看每项所消耗的硬盘大小
查看这个文件夹下所有类别分别占用的大小,可以看下图
或者docker system df看看是哪一项占最多下图
然后再docker system df -v查看内部每一个子项的消耗大小
最后根据需求删除那些不常用,或者不想用的,空间就出来了
1.3.使用命令暴力删除(不推荐)
docker system prune
直接删除所有没运行的容器和清理没有使用的数据,包括镜像数据。如果你之前为了一个容器配置了很多东西,并且只是目前不想运行那千万别使用这个方式
查看docker每个目录占用大小的情况:docker system df
细分每个文件下的每个目录所占大小: docker system df -v
然后选择性删除那些你不用的,网上大多叫使用:docker system prune注意这个命令是直接删除你当前没有运行的容器,这个最好不要用
等下你之前创建的容器又是配环境变量又是挂载数据卷乱七八糟的,结果一个命令都没了
2.扩展
命令介绍du在linux中
Linux官网对于du的解释:Finding out how much space your files are using in Linux is a bit of a chore compared to the Windows world. (right click, properties) However, Linux comes with a handy tool du
that will list how much disk space your files occupy.
查明有多少空间你的文件在linux中的使用情况和window环境比较是有点棘手的,然而,linux出现了一个可以列出你的文件占用了多少磁盘空间的简便的工具
简单来说就是提供了一个命令可以查看磁盘的详细信息
一般的组合,du -sh 文件夹 :可以查看文件的大小 如果后面带个*那么就是查看当前文件夹下的子目录的大小,只显示你指定文件夹的子目录的大小
du -ha 文件夹:则会列出当前文件夹下的所有子目录及其文件大小,显示所有包括指定文件夹下的的所有文件和文件夹
当然也可以指定看一个文件的信息,那就要写的具体一些 du -sh /xxx/xxx/xxx/xxx.sh
command | describe |
---|---|
-h | make it human readable(使其易读) |
-s | total space in a directory, but do not display the space that subdirectories use(展示文件总空间,但是不会展示子目录所用的空间). |
-a | show how much space a file is using(展示文件夹用了多少空间) |