docker镜像清理

随着容器概念的普及,愈来愈多的系统以容器的形式部署升级,但随着时间的推移,咱们会发现主机中的镜像文件愈来愈多,其中有不少旧版本的镜像,占用了大量的存储空间,此时就须要按期清理那些没有价值的镜像。java

本文会根据笔者所负责的节点进行介绍。docker

1、介绍

节点特色:测试

  1. 节点中部署着多个指定版本的应用系统。
  2. 节点中存在应用系统历史版本的docker镜像文件。

清理目标:spa

  1. 清理非当前使用版本的镜像文件。
  2. 后续更新时没必要花大量的时间从新拉取中间镜像层。

2、 分析现状

a. 主机镜像文件现状3d

b. 主机容器运行现状code

c. 制做镜像的Dockerfileblog

d. 存储空间大小部署

分析:从上面的图中可知,主机中有以下几种镜像:class

  1. 使用中的镜像:32.1.0.84/test/athena:develop_1749
  2. 历史版本镜像:32.1.0.84/test/athena:develop_1747
  3. 基础镜像:java:8
  4. 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、结论

  1. dangling镜像经过命令 docker image prune -f 清理。
  2. 经过命令 docker images | awk 'NR!=1{print $1":"$2}' | xargs docker rmi 能够批量清除无用的镜像,且不会影响使用中的镜像和基础镜像,知足笔者的需求。
相关文章
相关标签/搜索