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中废弃和未使用的图像较为常见,并通过rmi、image prune 和 system prune 命令查看了移除它们的方法。