本篇文章分享一些软件使用上的细节,以及如何提升磁盘利用率。
使用工具镜像和官方命令回收空间
如果你和我一样,使用 macOS 设备依赖容器做开发调试,那么随着时间的推移,会发现 “Docker 应用” 相关进程占用资源越来越多,即使在关闭所有容器应用后,使用 docker system prune
清理也不见效果。
早在几年前,就有人在官方反馈了关于硬盘空间未被正确释放的问题:Docker.qcow2 never shrinks - disk space usage leak in docker for mac #371
一般情况下,解决这个问题的方案只需要两步,先执行下面的命令,触发 Docker 文件系统回收:
docker run --privileged --pid=host docker/desktop-reclaim-space
然后再接着执行 docker system prune
,稍等片刻即能看到磁盘用量有了明显的减少了。
最后使用 ls
查看文件尺寸,就能够看到尺寸占用被有效的减少啦:
ls -klsh ~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw
29654336 -rw-r--r-- 1 soulteary staff 60G 4 24 16:30 /Users/soulteary/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw
上面的日志说明我们设置的文件最大尺寸为 60GB,目前已经使用了接近 29GB。
重置应用强制回收空间
如果上面的操作在某些场景下没有生效,我们还可以继续使用应用重置的方式来“解决问题”。
在重置之前,我们还可以对之前使用的数据进行保存,以减少后续使用镜像时,拉取镜像的时间消耗。
当然,这里也可以对镜像打上 Tag,推送到私有仓库中,关于私有仓库的搭建,我之前有提过,感兴趣可以自行翻阅。
批量保存和导入容器镜像
原本想使用网上现成的命令,但是看了下都写的又啰嗦又长,于是忍不住写了“一句话”:
docker images | sed '1d' | grep -v '<none>' | awk '{print "docker save " $1 ":" $2 " -o " $3 ".tar"}' | bash
执行脚本后,机器上所有带有明确名称和版本的镜像,都会被以镜像短哈希为名称保存在目录,类似下面这样:
# ls
01ea9392758f.tar 15a2df82c761.tar 313ec0a602bc.tar 5b9fb7872be3.tar 6f30fe65343e.tar 87856cc39862.tar a2a93b311e0e.tar bc5f6567b763.tar ceaa524ee3b1.tar e6a265c1314b.tar f6177e61da84.tar
021b77fe23d6.tar 1617b566916e.tar 331f6103c235.tar 5c534be56eca.tar 70b2fa94882b.tar 88cb36859803.tar a3cae8598d52.tar bd02fe5289fa.tar cfb931188dab.tar e6f71bee28c9.tar f643c72bc252.tar
030ee8ff6592.tar 1e5118e1ffd9.tar 35c43ace9216.tar 5d779ff71c18.tar 718f34297111.tar 89ec9da68213.tar a564b7146683.tar bd3a75f0989f.tar d0d95ad4ce06.tar e771efddaca8.tar f6d0b4767a6c.tar
041121f2a17b.tar 1e67abf7ee9f.tar 383066f78c26.tar 5d9483f9a7b2.tar 71a1631a3688.tar 8a4cfb155648.tar a585502d127b.tar bdb6ede651e7.tar d2850632b602.tar e7d08cddf791.tar f6eebe38c409.tar
0626b5a18724.tar 213fd8e5e53c.tar 3a897225a6e4.tar 5fd75c905b52.tar 72ab4137bd85.tar 8b0b67a3050b.tar a7e1d4b5ee81.tar bedece1f06cc.tar d4969c601eaa.tar e80ca3c9b4c0.tar f731cd48185c.tar
067753cb2b67.tar 244309caf158.tar 3a9c0da54047.tar 5ffc7d634411.tar 72e4ef8abf8e.tar 8b53000fc395.tar a8ab5d4abebb.tar
...
而导入镜像就更简单了,使用 ls
和 xargs
写一句话命令就完事:
ls *.tar | xargs -I {} docker load -i {}
其他
如果经过清理,磁盘占用还是很大,不妨使用 docker system df -v
来看看到底是哪些镜像、应用、网络、数据卷、缓存占用了磁盘:
Images space usage:
REPOSITORY TAG IMAGE ID CREATED SIZE SHARED SIZE UNIQUE SIZE CONTAINERS
soulteary/prebuilt-nginx-modules waf-1.20.0 24c736456f8e 3 hours ago 208.1kB 0B 208.1kB 0
soulteary/prebuilt-nginx-modules srcache-1.20.0 067753cb2b67 3 hours ago 302.3kB 0B 302.3kB 0
soulteary/prebuilt-nginx-modules redis2-1.20.0 9c05e05b2a99 3 hours ago 185.2kB 0B 185.2kB 0
soulteary/prebuilt-nginx-modules memc-1.20.0 fe364267465a 3 hours ago 263kB 0B 263kB 0
soulteary/prebuilt-nginx-modules http-redis-1.20.0 fd0730f838f3 3 hours ago 88.14kB 0B 88.14kB 0
...
Containers space usage:
CONTAINER ID IMAGE COMMAND LOCAL VOLUMES SIZE CREATED STATUS NAMES
7b6d5a4258c0 traefik:v2.3.4 "/entrypoint.sh --gl…" 0 0B 50 minutes ago Up 49 minutes (healthy) traefik
...
Local Volumes space usage:
VOLUME NAME LINKS SIZE
Build cache usage: 0B
CACHE ID CACHE TYPE SIZE CREATED LAST USED USAGE SHARED
当然,如果只希望看到哪些镜像比较大,则可以使用下面的命令:
docker images --format '{{.Size}}\t{{.Repository}}\t{{.Tag}}\t{{.ID}}' | sed 's/ //' | sort -h -r | column -t
随着 Docker 客户端的更新,有时更新客户端会导致出现一些莫名其妙的问题。为了解决问题,还可以尝试重新下载客户端进行安装:
- Intel芯片电脑:https://desktop.docker.com/mac/stable/amd64/Docker.dmg
- M1 芯片电脑:https://desktop.docker.com/mac/stable/arm64/Docker.dmg
–EOF