Docker 删除&清理镜像
一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ; - 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 54w+ 字,讲解图 2476+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 1900+ 小伙伴加入学习 ,欢迎点击围观
本文中,您将学习 Docker 如何删除及清理镜像?
一、通过标签删除镜像
以下两种命令均可删除镜像:
docker rmi [image]
或者:
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.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
), 执行删除命令:
docker rm 9d59e2278553
然后,再执行删除镜像的命令:
docker rmi 5cb3aa00f899
这个时候,就能正常删除了!
四、清理镜像
我们在使用 Docker 一段时间后,系统一般都会残存一些临时的、没有被使用的镜像文件,可以通过以下命令进行清理:
docker image prune
它支持的子命令有:
-a, --all
: 删除所有没有用的镜像,而不仅仅是临时文件;-f, --force
:强制删除镜像文件,无需弹出提示确认;
另外,执行完 docker image prune
命令后,还是告诉我们释放了多少存储空间!
五、总结
本文中,我们知道了 Docker 中如何删除以及清理镜像,通过标签和通过 ID 来删除镜像的相关细节,删除镜像又存在哪些限制等。祝您学习愉快!