Docker:什么是悬空图像,什么是未使用的图像?

时间:2017-07-17 11:01:51

标签: docker

在泊坞窗documentation of docker image prune中,可以使用-a标志

  

删除所有未使用的图片,而不仅仅是悬空图片

以后

  

删除所有悬空图像。如果指定了-a,则还将删除未被任何容器引用的所有图像。

有人可以向我解释悬挂图像是什么,悬空和未使用图像之间有什么区别?

7 个答案:

答案 0 :(得分:86)

未使用的图像表示尚未在容器中分配或使用它。例如,在运行docker ps -a时,它将列出所有已退出和当前正在运行的容器。显示在任何容器内使用的任何图像都是"使用过的图像"。

另一方面,悬空图像只是意味着您已经创建了图像的新版本,但它没有给出新名称。所以你所拥有的旧图像就成了&#34;悬空图像&#34;。那些旧图像是未标记的图像并显示&#34; <none>&#34;运行docker images时的名称。

运行docker system prune -a时,它会删除未使用和悬空的图像。因此,容器中使用的任何图像,无论是已退出还是当前正在运行,都不会受到影响。

答案 1 :(得分:20)

清理悬空图像的最安全,最简便的方法

Docker镜像由多个图层组成。悬空图像是与任何标记图像无关的图层。它们不再用于目的并占用磁盘空间。

通过向-f添加值为dangling=true的过滤器标记docker images来列出悬空图像。

列出悬空图像

docker images -f dangling=true

删除悬空图像

docker rmi $(docker images -f dangling=true -q)

OR

docker images --quiet --filter=dangling=true | xargs --no-run-if-empty docker rmi

这是清除悬空图像并将我们的磁盘空间恢复使用的最安全,最简单的方法。

请注意docker system prune -a将删除容器未引用的所有图片,我们无法通过该图片回到之前的版本。在生产而不是创建新图像时,我们使用之前正在工作的先前图像。

答案 2 :(得分:11)

docker中的图像由sha256摘要引用,通常称为图像ID。该摘要是您在docker主机上存在图像所需的全部内容。通常,您将拥有指向这些摘要的标记,例如标签busybox:我的系统上的最新当前指向图像ID c30178c523 ....多个标签可以指向同一图像,并且可以将任何标签更改为指向不同的ID,例如当您提取busybox的新副本时:最新版本或构建应用程序映像的新版本。

悬空图像是没有标签的图像,并且没有指向它们的子图像(例如,使用不同版本的FROM busybox:latest的旧图像)。他们之前可能有一个标记指向它们,并且该标记后来发生了变化。或者他们可能从未有过标签(例如docker build的输出而不包括标签选项)。只要没有仍在运行的容器引用旧映像ID,通常可以安全地删除它们。保留它们的主要原因是为了构建缓存目的。

此外,您可能已下载容器当前未使用的图像(包括已停止的容器)。这些与悬挂图像完全不同,只要您不打算将来使用它们,或者在您需要时不要下载其他副本,可以安全删除。

答案 3 :(得分:6)

悬空图像是与任何标记图像都没有关系的图层。它们不再用于目的并且消耗磁盘空间。

未使用的图像是未在容器中分配或使用的图像。

列出悬空图像

docker images -f dangling=true

答案 4 :(得分:1)

悬挂的图像是未标记的图像。以下命令提供了悬空图像的列表。

docker images --filter "dangling=true"

docker image prune删除所有悬空的图像。

未使用的图像是具有标签但当前未被用作容器的图像。您将来可能会也可能不需要。

docker image prune -a删除所有悬空和未使用的图像。

通常,您需要一段时间才能删除所有未使用的图像。因此,最好使用过滤器将其删除。

docker image prune -f --filter "until=6h"

答案 5 :(得分:0)

我看到了一些有用的命令(别名),用于删除悬空的图像,这由andyneff提供:https://forums.docker.com/t/how-to-delete-cache/5753

alias docker_clean_images='docker rmi $(docker images -a --filter=dangling=true -q)' 
alias docker_clean_ps='docker rm $(docker ps --filter=status=exited --filter=status=created -q)' 
  

第一个   清除所有悬空的图像。这对于去除中间体非常有用   多个版本剩余的图像。第二个是删除   停止的容器。这些是我用于日常维护的别名

     

如果要删除所有缓存,则首先必须确保   所有容器均已停止并删除,因为您无法删除   容器正在使用的图片。所以类似的东西

docker kill $(docker ps -q) docker_clean_ps docker rmi $(docker images
-a -q)
  

这将杀死并删除缓存中的所有图像。

答案 6 :(得分:0)

在图像屏幕快照中,“ none”名称是悬空的图像。 悬空的图像仅表示您已创建图像的新版本,但未为其指定新名称。因此,您拥有的旧图像成为“悬空图像”。这些旧映像是未标记的映像,并且在您运行docker映像时在其名称上显示“”。

docker system prune -a,它将删除未使用和悬空的图像。因此,容器中正在使用的任何图像(无论是已退出还是正在运行的图像)都不会受到影响。