删除 Docker 镜像: 所有, 强制, 无标签, 缓存, Docker Hub
这篇文章涵盖了关于删除Docker镜像的七个关键点。
以docker image rm
命令为重点,我们将涵盖几乎所有类型的docker镜像删除方法,包括删除特定的镜像、强制删除、完全删除、删除未使用的镜像、删除dag、删除构建缓存,甚至删除docker hub镜像。
1. Docker特定图像删除命令
从Docker中删除一个或多个镜像的命令有以下基本格式。
docker image rm [OPTIONS] IMAGE [IMAGE...]
它的作用类似于旧命令方案中的docker rmi
命令,在IMAGE
位置有图像的名称、名称和标签,以及图像的ID。
可用的选项包括--force
,执行强制删除,以及--no-prune
,不删除父图像。
要从Docker中删除一个特定的镜像,它必须不被任何当前运行的容器所使用。 因此,你可以通过对这样的镜像发出以下命令来删除一个镜像。
如果你想删除最新版本的nginx镜像,你可以发出以下命令。
$ docker image rm nginx:latest
Untagged: nginx:latest
Untagged: nginx@sha256:af296b188c7b7df99ba960ca614439c99cb7cf252ed7bbc23e90cfda59092305
Deleted: sha256:f9c14fe76d502861ba0939bc3189e642c02e257f06f4c0214b1f8ca329326cda
Deleted: sha256:419f8948c50c723f2a5ac74428af3d804b5d0079d6df8f7f827663cf10cbc366
Deleted: sha256:1030aac4f1a8096ed58d3d4a2df55dd1b1b27d919ad156d97ad1f68081d0051a
Deleted: sha256:7d90b49d96c3036539ef144ecc27c01de03902d8ea166a0f7b77d11d3779c4bd
Deleted: sha256:551acb210764654af31b6cd51adaa74edc9a202587c3395fe0e9f95a2e097f8b
Deleted: sha256:3c530958db4c75c6fb409f339367aaf9a1e163c84718c035d4b09bebc83f43e7
Deleted: sha256:8cbe4b54fa88d8fc0198ea0cc3a5432aea41573e6a0ee26eca8c79f9fbfa40e3
你可以按图像名称删除,如上所示,或按图像ID删除,如下所示。
$ docker image ls ubuntu:latest
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 3b418d7b466a 5 weeks ago 77.8MB
$ docker image rm 3b418d
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:dfd64a3b4296d8c9b62aa3309984f8620b98d87e47492599ee20739e8eb54fbf
Deleted: sha256:3b418d7b466ac6275a6bfcb0c86fbe4422ff6ea0af444a294f82d3bf5173ce74
Deleted: sha256:b8a36d10656ac19ddb96ef3107f76820663717708fc37ce929925c36d1b1d157
2. 强制删除镜像
正如在第1节中简要提到的,有三种主要情况下不可能删除Docker镜像。
在这些情况下,你需要使用--force
选项来强制删除。让我们来看看这三种无法删除的常见情况。
2.1. 当删除Docker镜像失败时
- 该镜像正在被一个正在运行的容器使用: 默认情况下,Docker不允许你删除一个正在被运行/停止的容器使用的镜像。 要删除这样一个镜像,你必须首先停止或删除该容器。
- 该镜像是另一个镜像的父镜像: Docker镜像是一个层的集合,一个镜像可以是另一个镜像的基础。 在这种情况下,如果你试图删除底层镜像,该操作将被拒绝。要解决这个问题,你必须首先删除所有依赖的镜像。
- Docker正在耗尽磁盘空间: 在删除镜像的过程中,Docker可能会暂时使用额外的磁盘空间。 如果你的磁盘空间用完了,删除一个镜像可能会失败。
在这种情况下,你应该在解决了问题之后再尝试删除镜像。例如,停止或删除正在运行的容器,删除任何使用父镜像的子镜像,或在必要时释放磁盘空间。
然而,在某些情况下,你可能最终会浪费大量的时间和金钱来解决这个问题。如果你把它用于开发,或者为了应对突发事件,你可能想进行强制删除。
2.2. 如何强制删除图像
强制删除图像很容易。只要在rm
命令中添加--force
选项即可。
这里是停滞不前的容器所使用的镜像。让我们看看强制删除的结果。
$ docker image rm php:7
Error response from daemon: conflict: unable to remove repository reference "php:7" (must force) - container 086591af79a4 is using its referenced image 0b50b7a54cab
$.docker image rm --force php:7
Untagged: php:7
Untagged: php@sha256:a4325b962bf0ced295f9f6ea275837f504109fcb8497cb0fd340094bc5b5f29f
Deleted: sha256:0b50b7a54cab40ebbb65919b3502dbff938bbdaa6c4e18339d73745fc73ccdf5
当我尝试正常删除时,我得到了一个错误,但强制删除成功完成。
3. 完全删除未使用的镜像(无)
在下载多个Docker镜像或构建自己的内核镜像时,你会自然而然地积累一些镜像名称为<none>
的镜像。
这些是为优化镜像构建速度或输出大小而创建的中间镜像。
这些很可能是未使用的镜像。
Docker提供了一个命令来一次性删除所有这些悬空的镜像。这被称为docker image prune
。
目前,你会在列表中看到许多<none>
图像,如下图所示。
在输入
prune
命令并对提示回答 "是 "后,移除工作将进行,如下图所示。
! docker image prune result 如果有任何图像在这个过程中没有被删除,很可能是由于我们在第2.1节中看到的三个原因之一。
4. 完全删除所有图像
不建议这样做,但如果你想完全删除本地环境中的所有图像,不管它们的状态如何,你可以使用以下方法。
$ docker image rm --force $(docker image ls --all --quiet)
docker image ls --all --quiet
命令简单地打印出本地环境中所有图像ID的列表,shell脚本中的$()
语法被用来传递ID列表作为前面命令的参数。
rm
命令有一个--force
选项,允许你删除任何状态的图像。
在使用这些命令之前,请务必备份你的图像,以避免意外地删除重要的图像。
5. 删除图像标签
删除图像标签的命令是docker image rm
。如果你觉得有什么不对,你是对的。
这与删除特定图像的命令相同,Docker没有提供单独的标签删除命令。
在Docker中,只有当图像有多个标签时,你才能删除一个图像标签。 如果图像没有其他标签,整个图像就会被删除。然而,如果图像有多个其他标签,只有命令指定的标签会被删除,而图像仍然存在。
为了看看这个动作,让我们给Nginx图像添加一个新标签。使用docker image tag
命令,为镜像添加一个新的标签。
$ docker image tag nginx:latest nginx:my-tag
$ docker image ls nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f9c14fe76d50 6 days ago 143MB
nginx my-tag f9c14fe76d50 6 days ago 143MB
我们在nginx:latest
图像上添加了一个名为my-tag
的新标签,当我们运行ls
命令时,我们看到两个具有相同图像ID的标签。
让我们删除my-tag
标签。
$ docker image rm nginx:my-tag
Untagged: nginx:my-tag
$ docker image ls nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f9c14fe76d50 6 days ago 143MB
nginx 1.21 f8f4ffc8092c 20 months ago 133MB
由于问题中的Nginx图像有多个标签,你可以看到只有标签被删除,图像仍然存在。
同样,要改变图像标签,你可以删除图像,然后用新的标签重建同一图像。 或者,你可以添加一个新标签,并从图像上删除现有的标签。
在Docker镜像上删除一个标签,就无法找到与该标签相关的镜像,因此在删除之前,必须检查该镜像是否有其他标签。
6. 清除你的镜像构建缓存
当Docker构建一个镜像时,它会将中间步骤的结果保存为一个缓存,以便在下次构建时重新使用。 这个缓存会占用磁盘空间,所以你应该在必要时清除它。
要清除Docker的构建缓存,请使用 docker builder prune
命令:
该命令将删除所有未使用的构建缓存。如果你想删除所有现有的构建缓存,你可以用--all
选项运行它。
删除缓存可以增加本地环境中的磁盘空间,但也会增加图像构建时间。 在运行该命令时,考虑一下这些权衡是一个好的过程。
7. 删除一个Docker Hub镜像
以下是从Docker Hub中删除一个镜像的过程。
1.登录Docker Hub。 1.点击Repositories。
- 点击包含你想删除的镜像的存储库。
- 导航到标签。
- 点击你想删除的标签右边的删除按钮。
- 在弹出的窗口中,单击 "删除 "来删除标签,或单击 "删除所有标签 "来删除仓库中的所有标签。
注意:当你从Docker Hub中删除一个镜像时,它将从Docker Hub中永久删除。 它不能被恢复,所以我们建议在删除它之前,如果有必要,先把它备份起来。
8. 最后的思考
在这篇文章中,我们已经涵盖了关于删除Docker镜像的七个关键点。 特别是,我们几乎涵盖了所有类型的图像删除方法,包括删除特定图像、强制删除、完全删除、删除未使用的图像、删除dags、删除构建缓存,甚至删除Docker Hub图像。 我们希望这能帮助你完成Docker镜像的删除过程。
