1. 概述

在这篇教程中,我们将探讨为什么在Docker中废弃和未使用的图像较为常见,以及如何移除它们。定期清理废弃和未使用的Docker图像是一种良好的实践,因为大量未使用的图像可能导致浪费磁盘空间。

2. 未使用Docker对象

Docker不会自动移除未使用的对象,而是将它们保留在磁盘上直到我们明确请求删除。一些未使用的对象包括:

  • 每个没有活动容器的已拉取图像
  • 每个状态为停止的容器
  • 对应于已停止和已移除容器的卷
  • 构建缓存

接下来,我们将探索使用Docker可能导致不必要的图像,并了解如何移除它们。

2.1. Dangling Docker图像

当我们在同一名称和标签下用新图像覆盖现有图像时,就会创建Dangling图像。

让我们通过一个小示例来查看更新图像将导致Dangling图像的实现方式。下面是一个简单的Dockerfile:

FROM ubuntu:latest
CMD ["echo", "Hello World"]

让我们构建这个图像:

docker build -t my-image .

可以通过运行以下命令验证图像是否创建:

docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
my-image     latest    7ed6e7202eca   32 seconds ago   72.8MB
ubuntu       latest    825d55fb6340   6 days ago       72.8MB

假设我们对Dockerfile进行了一点修改:

FROM ubuntu:latest
CMD ["echo", "Hello, World!"]

让我们使用相同的命令重新构建图像,并再次列出图像:

docker images
REPOSITORY   TAG       IMAGE ID       CREATED              SIZE
my-image     latest    da6e74196f66   4 seconds ago        72.8MB
<none>       <none>    7ed6e7202eca   About a minute ago   72.8MB
ubuntu       latest    825d55fb6340   6 days ago           72.8MB

构建创建了一个新的my-image图像。如您所见,旧的图像仍然存在,但现在它是Dangling的。其名称和标签设置为<none>:<none>

请记住,如果 我们没有对Dockerfile进行更改,在运行build命令时,图像不会被重建。它将从缓存中重用。

2.2. 未使用的Docker图像

未使用的图像是指没有与之关联的运行或停止容器的图像。

未使用的图像示例包括:

  • 从注册表拉取但尚未用于任何容器的图像
  • 已移除容器的任何图像
  • 标记有较旧版本且不再使用的图像
  • 所有的Dangling图像

如您所见,未使用的图像并不一定是Dangling的。我们可能在未来会使用这些图像,并希望保留它们。然而,保留大量未使用的图像可能导致空间问题。

3. 移除不必要的图像

我们探讨了为什么Docker中废弃和未使用的图像较为常见的几个原因。现在,让我们看看几种移除它们的方法。

3.1. 通过ID或名称移除图像

如果我们知道图像ID,可以使用docker rmi命令来移除图像。

docker rmi 7ed6e7202eca

此命令将移除ID为7ed6e7202eca(Dangling图像)的图像。让我们再次检查图像:

docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
my-image     latest    da6e74196f66   18 minutes ago   72.8MB
ubuntu       latest    825d55fb6340   6 days ago       72.8MB

或者,如果我们想要移除特定的未使用图像,可以使用docker rmi命令结合图像名称和标签:

docker rmi my-image:latest

3.2. Docker图像修剪

如果我们不想手动查找Dangling图像并逐一移除,可以使用docker image prune命令。此命令可以移除所有Dangling图像。

如果我们也想移除未使用的图像,可以使用-a标志。

让我们运行以下命令:

docker image prune -a
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y

命令将返回被移除的图像ID列表和释放的空间。

如果我们再次列出图像,会发现没有图像剩下,因为我们没有运行任何容器。

3.3. Docker系统修剪

查找并移除所有未使用的对象可能会很繁琐。为了简化操作,我们可以使用docker system prune命令。

默认情况下,此命令将移除以下对象:

  • 停止的容器 - 状态为停止的容器
  • 不被任何容器使用的网络
  • Dangling图像
  • Dangling构建缓存 - 支持Dangling图像的构建缓存

此外,我们可以通过添加-a标志来移除所有未使用的容器、图像、网络以及整个构建缓存。这对于希望释放大量空间的情况非常有用。

让我们看一个示例:

docker system prune -a
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all images without at least one container associated to them
  - all build cache

Are you sure you want to continue? [y/N]

4. 总结

在这篇教程中,我们探讨了为什么Docker中废弃和未使用的图像较为常见,并通过rmiimage prunesystem prune 命令查看了移除它们的方法。