Docker:悬挂图像

Docker: Dangling Images

我正在尝试理解以下命令

docker image prune
docker image prune -a

根据文档

docker image prune: Removes dangling images

docker image prune -a: Removes dangling and unused images`

我正在尝试了解悬空图像和未使用图像之间的区别。

根据 post,未使用的图像是尚未在容器中分配或使用的图像。

所以基本上,如果我 运行

docker pull hello-world

(从未执行过命令docker run hello-world

那么hello-world的图片就是未使用的图片??

悬挂图像是如何创建的?

根据上面引用的堆栈溢出 post,“悬空图像只是意味着您已经创建了新的图像构建,但没有给它一个新名称。所以旧图像你已经成为 'dangling image'."

这到底是什么意思?即,创建一个新的镜像是什么意思?你如何创建一个新的图像?什么是未标记图像?

谁能给我一个悬挂图像是如何创建的例子吗?

假设您基于带有标签 "asool/user-service":

的 Dockerfile 构建一个镜像

docker build -t asool/user-service .

镜像构建成功,ID为“5e8d606c6dcc”。因此,您更改了该 Dockerfile 的内容,例如您添加一行 RUN apk add vim。然后,您构建一个具有相同标签 "asool/user-service":

的图像

docker build -t asool/user-service .

创建了一个新图像,标记为 "asool/user-service",具有另一个 ID。尽管出现了新镜像,但 ID 为“5e8d606c6dcc”的旧镜像仍然存在。那张图片失去了它的标签、它的名字,很可能还有它的用途。此图像称为悬挂图像。

来源:Dockerfile Tutorial by Example - ( Part I - Basics )

让我们一一道来:

Then the image for hello-world would be an unused image??

是的。

How are dangling images created then?

在您的情况下,您可以创建同一图像的新版本,或者您可以取消标记您的图像,然后您有一个悬挂图像

What exactly does that mean? I.e, what does it mean to create a new build of the image? How do you create a new build of the image?

您可以随时通过 运行 docker build 命令构建映像,甚至可以从某处拉取更新版本 docker pull

What are untagged images?

每个图像都有一个标签,如文档中所述,您可以使用以下命令重新标记图像: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] 当您删除标记或再次构建图像​​时,通常您最终会得到未标记的图像。

Can someone give me an example of how a dangling image is created?

嗯,我想说的很简单,只要取消任何图像的标签,你就会有一个悬空图像。

最后,针对此问题重复link:

悬挂图片仅表示您有一张图片,但没有附加标签。 (Prune unused Docker objects)

你是怎么达到的? 通过构建具有相同名称和相同标签的图像。这是通常的情况,而不是唯一的。

  1. 您构建了一个图像 my.image.example.com 并用 latest 标记了它。
  2. 您可以通过将其引用为 my.image.example.com:lastest
  3. 来推送/拉取您的镜像
  4. 你做了一些改变,重建了你的形象。与您在第 1 步中所做的相同。
  5. 您有一个新的图像 ID,具有相同的名称和相同的标签。
  6. 第一张图片现在 悬空 ,您只能使用它的完整 SHA 来解决它。

这是对图像标签的高度抽象描述;

大多数(如果不是全部)计算机软件都由名称和版本组成。例如,您的 OS 可能是 Windows 10、OSX Catalina (14 Mojave) 等

在容器领域,镜像标签用于解决软件的版本问题。图像名称 - 是软件本身。

下载图像时,指定图像名称及其“版本”(即标签)。这是常见的用例。 标签可用于多种用途;单个图像可以有多个标签,但不能有一个标签引用多个图像。

我认为 Docker overview 是了解平台基本背景的好地方