docker 什么是dangling image,什么是unused image?

kkih6yb8  于 12个月前  发布在  Docker
关注(0)|答案(7)|浏览(225)

在docker documentation of docker image prune中,可以使用-a标志来
删除所有未使用的图像,而不仅仅是悬挂的图像
和后来
删除所有悬空图像。如果指定了-a,也将删除所有未被任何容器引用的图像。
谁能给我解释一下什么是悬空图像,悬空图像和未使用的图像有什么区别?

vsmadaxz

vsmadaxz1#

未使用的镜像意味着它尚未在容器中分配或使用。例如,当运行docker ps -a时,它将列出所有已退出和当前运行的容器。在任何容器内使用的任何图像都是“使用过的图像”。

另一方面,一个dangling映像只是意味着您已经创建了映像的新版本,但没有给它一个新名称。因此,你拥有的旧图像变成了“悬挂图像”。那些旧的图像是未标记的图像,当您运行docker images时,其名称上显示“<none>“。
当运行docker system prune -a时,它将删除所有停止的容器、镜像和没有关联容器的网络,并构建缓存。小心点!

k5hmc34c

k5hmc34c2#

最安全、最快捷的清理挂起镜像的方法

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

Docker镜像由多个层组成。悬挂图像是与任何标记图像都没有关系的层。它们不再起作用,并消耗磁盘空间。

注意:我建议不要在生产环境中使用prune,因为docker system prune -a会删除所有容器没有引用的镜像,这样我们就不能回滚到以前的版本。

要列出悬挂图像,请将值为dangling=true的筛选器标志-f添加到docker images

列出挂起镜像

docker images -f dangling=true

移除挂起镜像

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

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

当我们运行任何cron作业来删除那些悬挂的东西时,使用上面的方法来确保作业成功运行。就像在Jenkins中一样,如果我们用下面的命令运行一个自由风格的作业,即使机器中没有悬挂的东西,作业也永远不会失败。
这是最安全和最简单的方法来清理悬挂图像,并取回我们的磁盘空间回来使用。

pkbketx9

pkbketx93#

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

悬挂图像是没有标签的图像,并且没有子图像(例如,使用不同版本的FROM busybox:latest的旧图像),指向它们。他们以前可能有一个标签指向他们,后来这个标签改变了。或者他们从来没有一个标签(例如,docker build的输出,不包括标记选项)。

只要没有引用旧映像ID的容器仍在运行,这些映像通常可以安全地删除。保留它们的主要原因是为了构建缓存。
此外,您可能已经下载了容器(包括已停止的容器)当前未使用的映像。这些与悬挂图像完全不同,只要你不打算在将来使用它们,或者不介意在需要它们时下载另一个副本,删除它们可能是安全的。

von4xj4u

von4xj4u4#

悬挂图像是与任何标记图像都没有关系的图层。它们不再起作用,并消耗磁盘空间。
未使用镜像是指尚未在容器中分配或使用的镜像。
列出悬空图片:

docker images -f dangling=true
mlnl4t2r

mlnl4t2r5#

悬挂图像未标记的图像。下面的命令给出了一个悬挂图像的列表。

docker images --filter "dangling=true"

docker image prune删除所有悬挂图像。

未使用的镜像是指有标签但当前未作为容器使用的镜像。将来你可能需要它,也可能不需要。

docker image prune -a删除所有未使用的图像。
你通常不想删除所有未使用的图像,直到一段时间。因此,最好用过滤器去除。
docker image prune -a -f --filter "until=6h"

tvokkenx

tvokkenx6#

在图片截图中,“无”名称是悬空图像。一个悬空的映像只是意味着您已经创建了映像的新版本,但没有给它一个新名称。因此,你拥有的旧图像变成了“悬挂图像”。这些旧镜像是未标记的镜像,当你运行docker镜像时,它们的名称上会显示“”。
docker system prune -a,它将删除未使用的和悬挂的图像。因此,容器中使用的任何映像,无论它们是否已退出或正在运行,都不会受到影响。

fnx2tebb

fnx2tebb7#

我看到了一些有用的命令(别名)来删除悬挂的图像,感谢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)

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

相关问题