在维护客户系统时发现一台机器的磁盘快不够用了,接着去另外几台看一下。鬼使神差的我看了一下 docker 镜像占用的空间,发现 docker 镜像空间占用很大。迷糊的我要清理之前不用的docker镜像。
查看docker 镜像所占的空间
docker system df
再看一下哪些镜像需要删除,要删除镜像名称的规律
docker images
制定各镜像的删除规则
使用grep过滤得到镜像(匹配镜像名称为uccr9.0_cloud_***_aliyun,标签为除了20210之外的其他行)
docker images | grep uccr9.0_cloud_***_aliyun |grep -v "20210"
使用awk过滤得到镜像ID(获取第三列的ID)
docker images | grep uccr9.0_cloud_***_aliyun |grep -v "20210"| awk '{print $3}'
使用docker rmi 删除镜像
docker rmi $(docker images | grep uccr9.0_cloud_***_aliyun |grep -v "20210"| awk '{print $3}')
呵呵 o(╥﹏╥)o 删不掉。
单个删除也删不掉,我要哭了。。。
解决一下
另想办法,首先不是权限的问题,multiple 是什么鬼,查一下镜像
docker images | grep b0fc81dfa94c
居然有两个id一模一样的,id不能识别唯一....
先尝试删除一个
要用 docker rmi name:tag
删除? 试一下
docker rmi ***.aliyuncs.com/***/cloud:uccr9.0_cloud_***_aliyun_20190919192549
提示是untagged
查一下空间,并没有变化
,再删除另外一个
docker rmi 172.16.41.113:52800/zcm9/cloud:uccr9.0_cloud_***_aliyun_20190919192549
删除掉了,开心。不用看,这次是真的删除了。
再次修改脚本
awk
需要输出两列,并且中间要加上 “:” ,先输出两列看看效果
docker images | grep uccr9.0_cloud_***_aliyun |grep -v "20210" | awk '{print $1 $2}'
中间加 “:” awk
真强大
docker images | grep uccr9.0_cloud_***_aliyun |grep -v "20210" | awk '{print $1":"$2}'
冒号也有了,可以着手删除了
docker rmi $(docker images | grep uccr9.0_cloud_***_aliyun |grep -v "20210" | awk '{print $1":"$2}')
终于全部删除了,爽啊
最后再查看一下镜像空间
只清理一个应用的镜像,就回来了50G,哈哈
复盘
-
为什么删除不掉?
看这里 docker rmi文档 -
为什么有两个id一模一样的镜像?
因为 ic-k8s-master002 这台机器是镜像接收、发布机。
镜像先从阿里云镜像仓库pull
到这台机器上,在这台机器上tag
之后,再上传到环境的镜像仓库,所有会有两个。 -
另外,看了docker rmi文档,也提想到了一个另外的解决办法,那就是加上
-f
(之前不用是因为这是生产环境,怕搞坏了 Ծ‸Ծ )
docker rmi -f $(docker images | grep uccr9.0_cloud_***_aliyun |grep -v "20210"| awk '{print $3}')
-
最后我发现镜像多少和这台机器的空间占用情况没有关系 o(╥﹏╥)o
-
但是还是把过程记录下来了。