随着容器概念的普及,愈来愈多的系统以容器的形式部署升级,但随着时间的推移,咱们会发现主机中的镜像文件愈来愈多,其中有不少旧版本的镜像,占用了大量的存储空间,此时就须要按期清理那些没有价值的镜像。java
本文会根据笔者所负责的节点进行介绍。docker
1、介绍
节点特色:测试
- 节点中部署着多个指定版本的应用系统。
- 节点中存在应用系统历史版本的docker镜像文件。
清理目标:spa
- 清理非当前使用版本的镜像文件。
- 后续更新时没必要花大量的时间从新拉取中间镜像层。
2、 分析现状
a. 主机镜像文件现状3d
b. 主机容器运行现状code
c. 制做镜像的Dockerfileblog
d. 存储空间大小部署
分析:从上面的图中可知,主机中有以下几种镜像:class
- 使用中的镜像:32.1.0.84/test/athena:develop_1749
- 历史版本镜像:32.1.0.84/test/athena:develop_1747
- 基础镜像:java:8
- dangling镜像:ID为1a9f88c0c230的镜像。(是因为使用同一个tag屡次构建内容不一样的镜像,致使较早的镜像变为dangling镜像)
dangling镜像和历史版本镜像是再也不须要的镜像文件,白白占用了必定的存储空间,须要清理。使用中的镜像很明显不该该被清理。为了不后续更新时花大量的时间从新拉取,因此基础镜像不该该被清理。test
3、 分别处理各类镜像
3.1 dangling镜像
dangling是一种特殊的,不会再被使用到的镜像,docker有专门清理dangling镜像的命令。
docker image prune -f
从图中能够看出部分docker镜像已经被清理,而且提示释放了39.45MB的空间。
检查一下剩余的镜像,能够看见dangling镜像已经不存在了,符合预期。
检查当前的存储空间大小,能够发现释放了40MB的空间,也是符合预期的。
3.2 历史版本镜像
直接使用docker删除镜像的命令便可。
docker rmi [image]
从图中能够看出历史版本的镜像已经被清理。
检查一下剩余的镜像,能够看见历史版本镜像已经不存在了。
检查当前的存储空间大小,能够发现又释放了40MB的空间,也是符合预期的。
3.3 使用中的镜像
笔者须要在批量删除无用镜像的时候,保留使用中的镜像。幸运的是,docker的删除命令没法直接删除正在被容器使用的镜像。测试一下让本身放心。
3.4 基础镜像
为了后续更新的效率,笔者须要在批量删除无用镜像的时候,保留基础镜像。
因为基础镜像没有被容器直接使用,因此删除命令能够执行。测试以下:
刚开始看见命令被成功执行时,笔者心中是崩溃的,可是仔细看了一下显示的删除过程,发现只有“Untagged”而没有“Deleted”,心中窃喜,猜想是否是只删除了tag,镜像层并无被删除。赶忙检查一下,果真发现和笔者猜测的同样,因为基础镜像中的镜像层目前正被容器使用着,因此并未被删除。
为了证明更新应用镜像时不会消耗大量时间去拉取基础镜像,笔者再次构建应用的镜像进行检查从而得以验证。
4、结论
- dangling镜像经过命令 docker image prune -f 清理。
- 经过命令 docker images | awk 'NR!=1{print $1":"$2}' | xargs docker rmi 能够批量清除无用的镜像,且不会影响使用中的镜像和基础镜像,知足笔者的需求。