Docker for Mac 磁盘空间不足的完美修复 - All About Free

Docker for Mac 的宿主虚拟机的磁盘容量最近总是见底,总是No space left on device错误,各种pull不下来镜像,可又舍不得重置docker,于是开始折腾。

首先尝试网上的各种已经存在的方式,如清理docker中的不用的镜像,然并卵,磁盘限制的总量并不会改变。

所以扩充Docker for Mac虚拟机磁盘容量的大小才是解决这个问题的正途。

于是乎,本文就是介绍一种不丢失现有docker镜像的前提下,扩充docker的虚拟机磁盘容量的方法。

找到镜像的位置

在Docker for Mac的preference中可以看到硬盘镜像的位置

~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2

查询镜像的信息

首先关闭docker,确保docker没有在继续运行。

Docker for Mac 自带了 qemu-img 工具,可以通过 /Applications/Docker.app/Contents/MacOS/qemu-img 直接在terminal中调用,所以可以先通过qemu-img可以查询镜像的具体信息

image: /Users/rui/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2
file format: qcow2
virtual size: 84G (90194313216 bytes)
disk size: 15G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: true
    refcount bits: 16
    corrupt: false

发现了奇怪的问题,分明设置了84G的虚拟硬盘,为什么现在15G就提示无硬盘空间了呢?

扩充镜像的空间

如果您在查询镜像信息时,发现的确磁盘占用的空间和虚拟镜像设定的空间基本一致的话,那么需要多做一个步骤,增加虚拟磁盘的大小(virtual size)

/Applications/Docker.app/Contents/MacOS/qemu-img resize ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2 +20G

这个指令可以增加Docker.qcow2 20G的磁盘空间,通过这个操作后就可以继续下面的部分了。

磁盘分析

本地安装qemu brew install qemu
同时下载gparted镜像 gparted 我使用的是gparted-live-0.28.1-1-i686.iso

准备完成后 备份当前的虚拟磁盘镜像 然后通过qemu挂载磁盘启动gparted系统

qemu-system-x86_64 -drive file=Docker.qcow2 -m 512 -cdrom ~/Downloads/gparted-live-0.28.1-1-i686.iso -boot d -device usb-mouse -usb

启动gparted进入GUI界面后,打开gparted工具可以发现当前磁盘的分区设置的磁盘大小有限,看来需要修改分区大小才能解决啦~

调整分区

直接通过gparted调整分区大小会导致数据丢失等问题,我尝试了一次后发现调整了大小的镜像无法顺利启动docker,于是只有通过其他方式来调整。

关闭gparted工具后,在虚拟机桌面可以打开Terminal,进入Terminal后利用fdisk调整分区。

通过指令删除掉/dev/sda1的分区,再重新建立即可。

sudo fdisk /dev/sda
d
1
n
p
1
enter
enter
w

看到提示成功写入新的分区表,这时候可以关闭gparted,启动docker查看效果

可以看到docker中的磁盘空间已经足够用啦~

reference

Consistently out of disk space in docker beta

Free /
Published under (CC) BY-NC-SA in categories technology