带你找回那些被 Docker 吃掉的磁盘空间
bigegpt 2024-10-03 14:55 3 浏览
如果你是 Docker/Kubernetes 的重度使用者,应该多多少少会遇到一个问题“no space left on device”。
当然,如果你的硬盘空间很大,也不介意把大量空间用来存放不必要的 Docker 资源,那你可以忽略这篇文章了XD~
在我们讨论如何有效避免Docker占用大量磁盘空间之前,让我们先来谈谈Docker会占用哪些资源(导致空间占用):
- Image:Container 的镜像文件通常是通过 Dockerfile 结合 docker build 命令生成的
- Container:是具有独立环境的Process(在Linux操作系统中使用namespace实现环境的隔离),通常使用docker create或docker run命令来启动
- Volume:使用者可以通过Docker volume将Container挂载Host环境的数据(文件或整个文件夹)
- Network:可以使多个Docker Container(s)的网络环境相互通信,Docker network的运作方式很大程度上取决于开发者使用何种Network driver,常见的driver有bridge、host、overlay、macvlan、none、external plugin
在了解了 Docker 的常用资源之后,让我们来看看这些资源分别有哪些状态:
- used:指正在被某个container(s)使用的资源
- unused:完全没有被container使用
- dangling:指那些失效的image,永远不会被使用到
要判断资源是 used 或是 unused 其实非常简单,Docker 的判断标准是该资源目前是否被至少一个 Container 使用,如果不是,该资源就是 unused resource。
而 dangling 是比较特别的状态,它只存在于 Docker 镜像中,原因是 Docker 镜像具有版本概念。一般来说,在构建 Docker 镜像时,我们会使用 -t 标志为镜像打上标签(映像文件名加上版本号)。如果我们不指定版本号,Docker 将默认为最新版本。
然而,当我们重复编译同一个 tag name 的 docker image,那么第一次生成的 docker image 在第二次编译结束时就会进入 dangling 状态(用 docker image ls 会观察到一个 tag name 为 <none> 的 image),而这些 dangling image(s) 永远不会被使用到,如果不定期清除便会白白地占据磁盘空间。
在讨论完Docker资源和相关状态之后,现在让我们来看看如何清理这些unused/dangling resources吧!
Docker 提供了一系列的 docker prune 指令,可以帮助我们清理不同类型的资源:
# Remove all unused images, not just dangling ones
$ docker image prune -a
# Remove dangling images
$ docker image prune
$ docker network prune
$ docker volume prune
$ docker container prune
# Remove all unused containers, networks, images (both dangling and unreferenced), and optionally, volumes.
$ docker system prune
其实,Docker的清理功能已经解决了一些场景的问题。比如,对于正在运行生产服务的虚拟机或CI/CD Runner,我们只需要使用这些命令,并配合系统的定时任务,就可以轻松应对了。
然而,就开发者个人环境而言,很多时候我们其实不希望删除那些unused image(s),让我们考虑以下情景:
小明用 docker-compose 一次部署了20个容器,这些容器使用了20多个Docker镜像。如果小明使用docker compose rm + docker image prune来清空资源,他会发现等到下次要启用服务时,这些镜像可能已经被Docker移除了。
为了避免这个问题(偷懒),我们通常在本地测试部署环境的时候,都会选择忽略清空资源的步骤,久而久之这些 dangling image 以及 unused volume 就会把本机的磁盘空间占满……
所以,更好的做法实际上是使用 Makefile 或者 shell 脚本来处理 Docker 镜像的编译工作,同时在编译完成后移除悬空镜像或者指定标签名称的镜像:
docker image prune
# or
docker image ls | grep "<YOUR_TAG_NAME>" | awk '{print $3}' | xargs docker image rm
在上面的代码中,第二个命令可以一次删除所有符合 grep 中的条件的image(s),这也是我经常使用的方法(毕竟使用 docker image prune 很容易误删无辜的镜像……)
到目前为止,我们已经知道了如何处理不同使用情境下的unused image和dangling image。然而,上述解决方案对于初学者来说并不太友好(也不太方便)。为了节省时间,我们可以将这些步骤编写成一个shell脚本,并放在系统的/bin目录下,这样就可以直接通过终端执行该脚本:
#!/bin/bash
force=false
while getopts ":f" opt; do
case ${opt} in
f )
force=true
;;
? )
echo "Invalid option: -$OPTARG" 1>&2
exit 1
;;
: )
echo "Option -$OPTARG requires an argument." 1>&2
exit 1
;;
esac
done
shift $((OPTIND -1))
if [ $# -ne 2 ]; then
echo "Usage: docker-clean [-f] <resource> <keyword>"
exit 1
fi
resource=$1
keyword=$2
if [ "$force" = true ]; then
force_args="-f"
else
read -p "Are you sure you want to delete all $resource with $keyword? [y/N] " confirmation
if [ "$confirmation" != "y" ] && [ "$confirmation" != "Y" ]; then
echo "Operation cancelled."
exit 0
fi
fi
case $resource in
"image")
docker images | grep "$keyword" | awk '{print $3}' | xargs docker rmi $force_args
;;
"container")
docker ps -a | grep "$keyword" | awk '{print $1}' | xargs docker rm $force_args
;;
*)
echo "Invalid resource type. Must be either 'image' or 'container'."
exit 1
;;
esac
顺便说一句:
整个 shell 脚本都是使用 chatGPT 生成的,对于一些简单的应用案例,chatGPT 真的是非常棒的工具(但也要记得检查 chatGPT 提供的数据的可靠性,避免发生毁掉重要数据导致连夜订票跑路……)
这个脚本可以移除特定的标签名称的图像和容器。使用教程请参考下面的示例:
# 安裝
$ git clone https://github.com/ianchen0119/docker-clean.git
$ mv docker-clean/docker-clean /bin/docker-clean
$ chmod 777 /bin/docker-clean
# 使用
$ docker-clean
Usage: docker-clean [-f] <resource> <keyword>
总结
Docker这类容器化方案对开发者来说是一个非常友善的工具,但使用不当的话其实很容易影响到执行环境的机器。本篇文章简单地介绍一些可参考的处理方式,如果你也有不错的管理方式,也欢迎留言共同交流!
最后补充一下个人不喜欢批量处理unused & dangling image(s)的原因:
- 在重新编译时,docker image会根据commit hash使用相应的缓存层(cache layer),以避免重复工作(re-work)。如果每次编译都固定移除未使用的镜像,也会同时清空这些缓存,从而大幅提高镜像编译的速度。
- 在某些微服务测试场景下,如果一个图像需要额外的3分钟来重现之前的步骤,那么启动整个服务可能需要额外占用30分钟以上的时间……
要在使用docker的同时最大化磁盘空间利用率,除了定期清理不需要的docker静态资源,我们还可以从其他方面入手:
- 使用精简化的 Docker 镜像作为基础;
- 尽量重用基础镜像:如果应用程序没有特殊的依赖关系,应尽量选择重复使用的基础镜像来进行编译或作为应用程序的执行环境;
- 避免过多的 docker commit:这一点与上述类似,有助于保持镜像的简洁。但并非强制性要求,因为有时运维人员可能会频繁更新某些特定的镜像,如果 Dockerfile 写得过于简洁,可能会导致难以阅读和难以利用缓存的情况发生;
- 在安装完成后,使用rm或apt-get remove等命令移除安装包,以清除编译image期间产生的垃圾;
- 使用distroless镜像:现在圈内也有许多人在呼吁尽量不要使用alpine这类的镜像作为基础,而是建议开发者尽可能地选择distroless镜像,具体原因就是出于容器安全的考虑。
作者丨睡醒想钱钱
来源丨juejin.cn/post/7259032711019855930
dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn
相关推荐
- 有些人能留在你的心里,但不能留在你生活里。
-
有时候,你必须要明白,有些人能留在你的心里,但不能留在你生活里。Sometimes,youhavetorealize,Somepeoplecanstayinyourheart,...
- Python学不会来打我(34)python函数爬取百度图片_附源码
-
随着人工智能和大数据的发展,图像数据的获取变得越来越重要。作为Python初学者,掌握如何从网页中抓取图片并保存到本地是一项非常实用的技能。本文将手把手教你使用Python函数编写一个简单的百度图片...
- 软网推荐:图像变变变 一“软”见分晓
-
当我们仅需要改变一些图片的分辨率、裁减尺寸、添加水印、标注文本、更改图片颜色,或将一种图片转换为另一种格式时,总比较讨厌使用一些大型的图像处理软件,尤其是当尚未安装此类软件时,更是如此。实际上,只需一...
- 首款WP8.1图片搜索应用,搜照片得资料
-
首款WP8.1图片搜索应用,搜照片得资料出处:IT之家原创(天际)2014-11-1114:32:15评论WP之家报道,《反向图片搜索》(ReverseImageSearch)是Window...
- 盗墓笔记电视剧精美海报 盗墓笔记电视剧全集高清种子下载
-
出身“老九门”世家的吴邪,因身为考古学家的父母在某次保护国家文物行动时被国外盗墓团伙杀害,吴家为保护吴邪安全将他送去德国读书,因而吴邪对“考古”事业有着与生俱来的兴趣。在一次护宝过程中他偶然获得一张...
- 微软调整Win11 24H2装机策略:6月起36款预装应用改为完整版
-
IT之家7月16日消息,微软公司今天(7月16日)发布公告,表示自今年6月更新开始,已默认更新Windows1124H2和WindowsServer2025系统中预装...
- 谷歌手把手教你成为谣言终结者 | 域外
-
刺猬公社出品,必属原创,严禁转载。合作事宜,请联系微信号:yunlugongby贾宸琰编译、整理11月23日,由谷歌新闻实验室(GoogleNewsLab)联合Bellingcat、DigD...
- NAS 部署网盘资源搜索神器:全网资源一键搜,免费看剧听歌超爽!
-
还在为找不到想看的电影、电视剧、音乐而烦恼?还在各个网盘之间来回切换,浪费大量时间?今天就教你如何在NAS上部署aipan-netdisk-search,一款强大的网盘资源搜索神器,让你全网资源...
- 使用 Docker Compose 简化 INFINI Console 与 Easysearch 环境搭建
-
前言回顾在上一篇文章《搭建持久化的INFINIConsole与Easysearch容器环境》中,我们详细介绍了如何使用基础的dockerrun命令,手动启动和配置INFINICon...
- 为庆祝杜特尔特到访,这个国家宣布全国放假?
-
(观察者网讯)近日,一篇流传甚广的脸书推文称,为庆祝杜特尔特去年访问印度,印度宣布全国放假,并举办了街头集会以示欢迎。菲媒对此做出澄清,这则消息其实是“假新闻”。据《菲律宾世界日报》2日报道,该贴子...
- 一课译词:毛骨悚然(毛骨悚然的意思是?)
-
PhotobyMoosePhotosfromPexels“毛骨悚然”,汉语成语,意思是毛发竖起,脊梁骨发冷;形容恐惧惊骇的样子(withone'shairstandingonend...
- Bing Overtakes Google in China's PC Search Market, Fueled by AI and Microsoft Ecosystem
-
ScreenshotofBingChinahomepageTMTPOST--Inastunningturnintheglobalsearchenginerace,Mic...
- 找图不求人!6个以图搜图的识图网站推荐
-
【本文由小黑盒作者@crystalz于03月08日发布,转载请标明出处!】前言以图搜图,专业说法叫“反向图片搜索引擎”,是专门用来搜索相似图片、原始图片或图片来源的方法。常用来寻找现有图片的原始发布出...
- 浏览器功能和“油管”有什么关联?为什么要下载
-
现在有没有一款插件可以实现全部的功能,同时占用又小呢,主题主要是网站的一个外观,而且插件则主要是实现wordpress网站的一些功能,它不仅仅可以定制网站的外观,还可以实现很多插件的功能,搭载chro...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- linuxlink (65)
- pythonwget (67)
- androidinclude (65)
- libcrypto.so (74)
- linux安装minio (74)
- ubuntuunzip (67)
- vscode使用技巧 (83)
- secure-file-priv (67)
- vue阻止冒泡 (67)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)