Docker
图像
删除

删除 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。

  1. 点击包含你想删除的镜像的存储库。
  2. 导航到标签。
  3. 点击你想删除的标签右边的删除按钮。
  4. 在弹出的窗口中,单击 "删除 "来删除标签,或单击 "删除所有标签 "来删除仓库中的所有标签。

注意:当你从Docker Hub中删除一个镜像时,它将从Docker Hub中永久删除。 它不能被恢复,所以我们建议在删除它之前,如果有必要,先把它备份起来。

8. 最后的思考

在这篇文章中,我们已经涵盖了关于删除Docker镜像的七个关键点。 特别是,我们几乎涵盖了所有类型的图像删除方法,包括删除特定图像、强制删除、完全删除、删除未使用的图像、删除dags、删除构建缓存,甚至删除Docker Hub图像。 我们希望这能帮助你完成Docker镜像的删除过程。

copyright for docker image remove

© 2023 All rights reserved.