当前位置:   article > 正文

Docker——docker的镜像清理工具_docker clean image repository

docker clean image repository

摘要

由于公司架构目前都是微服务架构,发布项目全部都是打包成docker镜像包,每次发布过程打包镜像—>镜像打tag—>推送到镜像仓库,这样下来一个镜像就会保存三次,时间长了就会导致镜像过多,占用系统磁盘非常大,半年下来打包构建的磁盘达到900G,本地五千多个镜像,仓库三千多个,所以要定期处理这些镜像。本博文将介绍常用的docker清理的工具的,同时将展示本人设计的自动的docker清理的工具,帮助大家更好的管理自己的仓库镜像。自定义镜像管理工具:https://gitee.com/xjl2462612540/DockerPrinciple/tree/master/DockerProject/Docker%E6%B8%85%E7%90%86%E5%AE%B9%E5%99%A8%E5%B7%A5%E5%85%B7

一、通过标签删除镜像

  1. 通过如下两个都可以删除镜像:
  2. docker rmi [image]
  3. 或者:
  4. docker image rm [image]

支持的子命令如下:

  • -f, -force: 强制删除镜像,即便有容器引用该镜像;
  • -no-prune: 不要删除未带标签的父镜像;

例如,我们想删除上章节创建的 allen_mysql:5.7 镜像,命令如下:

docker rmi allen_mysql:5.7

我们知道 allen_mysql:5.7 和 docker.io/mysql:5.7 实际上指向的是同一个镜像,那么,您可以能会有疑问,我删除了 allen_mysql:5.7, 会不会将 docker.io/mysql:5.7 镜像也给删除了?

实际上,当同一个镜像拥有多个标签时,执行 docker rmi 命令,只是会删除了该镜像众多标签中,您指定的标签而已,并不会影响原始的那个镜像文件。不信的话,我们可以执行 docker images 命令,来看下 docker.io/mysql:5.7 镜像还在不在:

那么,如果某个镜像不存在多个标签,当且仅当只有一个标签时,执行删除命令时,您就要小心了,这会彻底删除镜像。例如,这个时候,我们再执行 docker rmi docker.io/mysql:5.7 命令:

从上图可以看到,我们已经删除了 docker.io/mysql:5.7 镜像的所有文件层。该镜像在本地已不复存在了!

二、通过的ID删除镜像

除了通过标签名称来删除镜像,我们还可以通过制定镜像 ID, 来删除镜像,如:

docker rmi ee7cbd482336

一旦制定了通过 ID 来删除镜像,它会先尝试删除所有指向该镜像的标签,然后在删除镜像本身。

三、删除镜像的限制

删除镜像很简单,但也不是我们何时何地都能删除的,它存在一些限制条件。当通过该镜像创建的容器未被销毁时,镜像是无法被删除的。为了验证这一点,我们来做个试验。首先,我们通过 docker pull alpine 命令,拉取一个最新的 alpine 镜像, 然后启动镜像,让其输出 hello, docker!

接下来,我们来删除这个镜像试试:

可以看到提示信息,无法删除该镜像,因为有容器正在引用他!同时,这段信息还告诉我们,除非通过添加 -f 子命令,也就是强制删除,才能移除掉该镜像!

docker rmi -f docker.io/alpine

但是,我们一般不推荐这样暴力的做法,正确的做法应该是:

  • 先删除引用这个镜像的容器;
  • 再删除这个镜像;

也就是,根据上图中提示的,引用该镜像的容器 ID (9d59e2278553), 执行删除命令:

  1. docker rm 9d59e2278553
  2. docker rmi 5cb3aa00f899

四、清理镜像

我们在使用 Docker 一段时间后,系统一般都会残存一些临时的、没有被使用的镜像文件,可以通过以下命令进行清理:

docker image prune

它支持的子命令有:

  • -a, --all: 删除所有没有用的镜像,而不仅仅是临时文件;
  • -f, --force:强制删除镜像文件,无需弹出提示确认;

另外,执行完 docker image prune 命令后,还是告诉我们释放了多少存储空间!

五、删除规定时间的镜像文件

通过制定删除的多少天以前的文件,来实现的镜像的清理工作。

  1. #!/bin/sh
  2. # From https://github.com/HardySimpson/docker-cleanup
  3. # 创建文件 $$表示脚本执行的进程id
  4. >/tmp/run_image_ids.$$
  5. DOCKER_BIN=/usr/bin/docker
  6. LOG=/tmp/docker-cleanup.log
  7. rm /tmp/run_image_ids.$$
  8. echo "$(date) start-----" >>$LOG
  9. # docker ps -a 列出所有容器的容器id
  10. $DOCKER_BIN ps --no-trunc -a -q | while read cid; do
  11. running=$($DOCKER_BIN inspect -f '{{.State.Running}}' $cid)
  12. # 如果容器处于running 会返回true
  13. if [ "$running"x = "true"x ]; then
  14. id=$($DOCKER_BIN inspect -f '{{.Image}}' $cid)
  15. echo $id >>/tmp/run_image_ids.$$
  16. continue
  17. fi
  18. fini=$($DOCKER_BIN inspect -f '{{.State.FinishedAt}}' $cid | awk -F. '{print $1}')
  19. diff=$(expr $(date +"%s") - $(date --date="$fini" +"%s"))
  20. #for MacOs
  21. #diff=$(expr $(date +"%s") - $(date -j -f %Y-%m-%dT%H:%M:%S "$fini" +"%s"))
  22. # if [[ $diff -gt 86400*7 ]] 改成这样可以限制时间7天
  23. if [ $diff -gt 86400 ]; then
  24. echo "$DOCKER_BIN rm -v $cid >>$LOG 2>&1"
  25. $DOCKER_BIN rm -v $cid >>$LOG 2>&1
  26. fi
  27. done
  28. echo "容器结束"
  29. $DOCKER_BIN images --no-trunc | grep -v REPOSITORY | while read line; do
  30. sha_num=`echo $line|awk '{print $3}'`
  31. echo $sha_num
  32. repo_tag=$(echo $line | awk '{print $1":"$2}')
  33. image_id=$(echo $line | awk '{print $3}')
  34. echo 1
  35. grep -q $image_id /tmp/run_image_ids.$$
  36. if [ $? -eq 0 ]; then
  37. continue
  38. fi
  39. echo "2"
  40. creat_time=$(docker inspect -f '{{.Created}}' $sha_num | awk -F. '{print $1}')
  41. echo $creat_time
  42. echo "3"
  43. echo "输出创建时间"
  44. img_diff=$(expr $(date +"%s") - $(date --date="$creat_time" +"%s"))
  45. echo "时间差为 $img_diff"
  46. echo "4"
  47. if [[ $img_diff -gt 86400*7 ]]; then
  48. if [ "$repo_tag"x = "<none>:<none>"x ]; then
  49. echo "$DOCKER_BIN rmi $image_id >>$LOG 2>&1"
  50. echo "删除没有tag 及 name的镜像"
  51. #echo "5.1"
  52. $DOCKER_BIN rmi $image_id >>$LOG 2>&1
  53. else
  54. echo "$DOCKER_BIN rmi $repo_tag >>$LOG 2>&1 "
  55. #echo "5.2"
  56. $DOCKER_BIN rmi $repo_tag >>$LOG 2>&1
  57. fi
  58. fi
  59. done
  60. rm /tmp/run_image_ids.$$
  61. echo "rm /tmp/run_image_ids.$$"
  62. echo "$(date) end-----" >>$LOG

六、自动的docker删除工具

6.1 工具的地址在:

https://gitee.com/xjl2462612540/DockerPrinciple/tree/master/DockerProject

6.2 工具的使用

博文参考

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/80450
推荐阅读
相关标签
  

闽ICP备14008679号