← 文章 / 未分类
signoz 6小时前 · 2026-09-19 01:46:26 · 0 阅读

如何删除 Docker 镜像?docker image rm

要删除 Docker 镜像,先列出所有镜像,再删除目标镜像:

Copy
docker image ls
docker image rm <image_id_or_name>

如果镜像正被某个容器引用,需要先删除该容器:

Copy
docker stop <container_id>
docker rm <container_id>
docker image rm <image_id_or_name>

要删除所有未被使用的镜像:

Copy
docker image prune -a

Docker 镜像会在不知不觉中占用大量磁盘空间。每次拉取和构建都可能产生新的镜像和层,而过期、悬空或不再使用的镜像会一直留在主机上,除非你主动删除它们。日积月累,这些镜像可能耗尽存储空间,导致 Docker 构建或容器运行失败。

清理这些镜像需要根据镜像类型选择合适的命令:用 docker image rm 删除指定镜像,用 docker image prune 清理悬空镜像,或用 docker image prune -a 删除所有未被容器引用的镜像。注意,如果镜像仍被容器引用,必须先删除容器才能删除镜像。

本文将介绍如何单独或批量查找和删除 Docker 镜像、清理悬空和未使用的镜像、解决 "image is being used" 错误,以及如何在保留仍需使用的资源的前提下释放磁盘空间。

如何删除指定的 Docker 镜像

删除指定镜像前,需要知道它的镜像 ID 或名称加标签。运行 docker image ls 命令即可查看这些信息,该命令会列出每个镜像的仓库名、标签、镜像 ID、创建时间和大小。

找到不再需要的镜像后,将它的镜像 ID 传给 docker image rm <image_id> 即可。例如,下面的命令通过镜像 ID 删除 alpine 镜像:

Copy
docker image rm 48b0309ca019

也可以通过名称加标签来删除镜像,这种方式可读性更好,尤其是当镜像名称含义明确时:

Copy
docker image rm alpine:3.21

带上标签是必要的,因为同一个仓库在你机器上可能有多个版本,比如 alpine:1.26alpine:latest。使用名称加标签执行命令时,只会删除指定的那个版本,而不会影响 alpine 的其他版本。

终端列出 alpine:3.21 镜像,显示 docker image rm 成功移除它
  • Untagged 表示 Docker 移除了与该镜像关联的仓库名、标签或摘要。
  • Deleted 表示它删除了镜像数据或图层,这些数据不再被其他本地镜像使用。行数会因镜像共享图层而有所不同。

如果容器仍引用该镜像、镜像 ID 在多个仓库中有标签、或者 Docker 无法安全删除特定平台的变体,删除操作可能会失败。以下小节介绍如何解决每种错误。

错误:镜像被容器使用

如果现有容器仍在使用该镜像,Docker 不会删除它。这既适用于正在运行的容器,也适用于已停止的容器。有关停止和删除容器之间的区别,请参阅 Docker 容器生命周期

例如,在容器使用 alpine:3.21 镜像时尝试删除它,会返回冲突错误:

终端显示 Docker 拒绝删除 alpine:3.21,因为容器 5f7a4a23a592 引用了它

要查找从该镜像创建的容器,请运行:

Copy
docker ps -a --filter ancestor=alpine:3.21

此命令列出引用 alpine:3.21 的运行中和已停止的容器:

终端列出两个运行中的容器和一个已退出容器,它们均由 alpine:3.21 创建

如果容器正在运行,请使用其容器 ID 停止它,然后将其删除,使其不再引用该镜像。

Copy
docker stop fbe6f36c981f
docker rm fbe6f36c981f

容器移除后,再次执行镜像删除命令即可成功。如果多个容器使用同一镜像,必须先停止并删除这些容器,然后才能删除镜像。操作前请确认不再需要这些容器及其内部数据。

若希望仅删除镜像引用而不影响容器,请添加 -f--force 参数:

Copy
docker image rm -f alpine:3.21

使用 --force 时,Docker 可能仅移除镜像的名称和标签。基于该镜像创建的容器仍可继续使用其底层数据,因此该命令不一定能立即释放磁盘空间。

错误:镜像被多个仓库引用

同一个镜像 ID 可能对应多个仓库名称或标签。若尝试通过 ID 删除该镜像,Docker 无法确定你想删除哪个引用。

例如,以下两个镜像名称指向相同的镜像 ID。尝试删除该共享 ID 时会报错:

Terminal showing alpine:3.21 and multi-tag-demo:latest sharing an image ID, followed by a multiple-repositories conflict

若只想删除其中一个引用,请指定其仓库名和标签:

Copy
docker rmi multi-tag-demo:latest

Docker 会移除该标签,但保留底层镜像及其其他引用:

Terminal showing multi-tag-demo:latest being untagged while alpine:3.21 remains available

若要移除关联于该镜像 ID 的所有标签,请使用 -f

Copy
docker rmi -f 48b0309ca019

请谨慎使用强制选项,因为它可能会删除你本想保留的引用。

删除特定平台镜像变体时的错误

多平台镜像可以包含针对不同架构的独立变体,例如 linux/amd64linux/arm64。Docker 允许你通过 --platform 选项删除某个特定的缓存变体:

Copy
docker image rm --platform=linux/arm64/v8 alpine:3.21

不过,如果删除该内容会影响到所有引用同一变体的镜像,Docker 会阻止这个操作:

Terminal showing Docker blocking removal of the linux/arm64/v8 variant of alpine:3.21 without force

如果你确认过这些引用关系,仍然想删除该变体,可以加上 --force

Copy
docker image rm \
  --platform=linux/arm64/v8 \
  --force \
  alpine:3.21

这种冲突只在使用 --platform 时出现。如果想删除完整的本地镜像(包括其缓存的所有平台变体),去掉 --platform,按常规方式删除镜像即可。该选项要求 Docker API 1.50 或更高版本。

删除多个 Docker 镜像

删除镜像时不需要为每个镜像单独执行一条命令。docker image rm 命令支持一次传入多个镜像 ID 或镜像名称,用空格分隔即可。

Copy
docker image rm <image_id_1> <image_id_2> ... <image_id_n>

例如,一条命令删除两个镜像,可以指定它们的仓库名和标签:

Copy
docker image rm alpine:3.20 busybox:1.37

也可以通过镜像 ID 来删除多个镜像:

Copy
docker image rm d9e853e87e55 9db7b59979c3

这两种写法效果相同。名称和标签通常更直观易认,而镜像 ID 则在镜像没有标签时比较有用。

使用 docker image prune 清理悬空镜像

悬空镜像(dangling image)是指不再有仓库名或标签的镜像。这类镜像通常出现在用同一个标签重新构建镜像之后,旧版本因此失去了名称。它们在镜像列表中显示为 <none>:<none>

要查看是否存在悬空镜像,可以列出本地所有镜像:

Copy
docker image ls -a --filter dangling=true \
  --format 'table {{.Repository}}\t{{.Tag}}\t{{.ID}}\t{{.Size}}'

你可以逐个删除悬空镜像,方法是将镜像 ID 作为参数传给 docker image rm。不过,Docker 也提供了可以直接清理所有悬空镜像的命令:

Copy
docker image prune

Docker 会显示它将删除哪类数据,并询问确认:

Copy
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N]

输入 y 并按回车以继续。

若要跳过确认提示,添加 --force-f 选项:

Copy
docker image prune -f
注意

--force 仅用于禁用确认提示。它不会强制 Docker 删除正在被容器使用的镜像。

使用 docker image prune -a 删除所有未使用的 Docker 镜像

悬空镜像只是未使用镜像的一种。Docker 可能还保留了一些已打标签但不再关联任何容器的镜像。标准的 docker image prune 命令无法删除这些镜像。

若要同时删除悬空镜像和未使用的已打标签镜像,请添加 -a 选项:

Copy
docker image prune -a

Docker 在继续前会请求确认。请仔细阅读警告信息,如果你要删除列出的那些类型的镜像,则输入 y

若要在不显示确认提示的情况下删除所有未使用的镜像,请运行:

Copy
docker image prune -a -f

只有当没有容器引用某个镜像时,它才算作未使用。与正在运行或已停止的容器相关联的镜像会被保留。不过,此命令删除的镜像在下次使用时可能需要重新下载或构建,因此建议在开发或生产主机上运行前,先确认本机存储的内容。

删除主机上的所有 Docker 镜像

如果你想重置 Docker 的本地镜像存储,可以将 docker image ls -q 返回的 ID 直接传给 docker image rm

Copy
docker image rm $(docker image ls -q)

内部命令 docker image ls -q 只返回镜像 ID。该

原始来源: signoz

评论 (0)