如何删除 Docker 镜像?docker image rm
要删除 Docker 镜像,先列出所有镜像,再删除目标镜像:
Copydocker image ls
docker image rm <image_id_or_name>
如果镜像正被某个容器引用,需要先删除该容器:
Copydocker stop <container_id>
docker rm <container_id>
docker image rm <image_id_or_name>
要删除所有未被使用的镜像:
Copydocker 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 镜像:
docker image rm 48b0309ca019
也可以通过名称加标签来删除镜像,这种方式可读性更好,尤其是当镜像名称含义明确时:
Copydocker image rm alpine:3.21
带上标签是必要的,因为同一个仓库在你机器上可能有多个版本,比如 alpine:1.26 和 alpine:latest。使用名称加标签执行命令时,只会删除指定的那个版本,而不会影响 alpine 的其他版本。

Untagged表示 Docker 移除了与该镜像关联的仓库名、标签或摘要。Deleted表示它删除了镜像数据或图层,这些数据不再被其他本地镜像使用。行数会因镜像共享图层而有所不同。
如果容器仍引用该镜像、镜像 ID 在多个仓库中有标签、或者 Docker 无法安全删除特定平台的变体,删除操作可能会失败。以下小节介绍如何解决每种错误。
错误:镜像被容器使用
如果现有容器仍在使用该镜像,Docker 不会删除它。这既适用于正在运行的容器,也适用于已停止的容器。有关停止和删除容器之间的区别,请参阅 Docker 容器生命周期。
例如,在容器使用 alpine:3.21 镜像时尝试删除它,会返回冲突错误:

要查找从该镜像创建的容器,请运行:
Copydocker ps -a --filter ancestor=alpine:3.21
此命令列出引用 alpine:3.21 的运行中和已停止的容器:

如果容器正在运行,请使用其容器 ID 停止它,然后将其删除,使其不再引用该镜像。
Copydocker stop fbe6f36c981f
docker rm fbe6f36c981f
容器移除后,再次执行镜像删除命令即可成功。如果多个容器使用同一镜像,必须先停止并删除这些容器,然后才能删除镜像。操作前请确认不再需要这些容器及其内部数据。
若希望仅删除镜像引用而不影响容器,请添加 -f 或 --force 参数:
docker image rm -f alpine:3.21
使用 --force 时,Docker 可能仅移除镜像的名称和标签。基于该镜像创建的容器仍可继续使用其底层数据,因此该命令不一定能立即释放磁盘空间。
错误:镜像被多个仓库引用
同一个镜像 ID 可能对应多个仓库名称或标签。若尝试通过 ID 删除该镜像,Docker 无法确定你想删除哪个引用。
例如,以下两个镜像名称指向相同的镜像 ID。尝试删除该共享 ID 时会报错:

若只想删除其中一个引用,请指定其仓库名和标签:
Copydocker rmi multi-tag-demo:latest
Docker 会移除该标签,但保留底层镜像及其其他引用:

若要移除关联于该镜像 ID 的所有标签,请使用 -f:
docker rmi -f 48b0309ca019
请谨慎使用强制选项,因为它可能会删除你本想保留的引用。
删除特定平台镜像变体时的错误
多平台镜像可以包含针对不同架构的独立变体,例如 linux/amd64 和 linux/arm64。Docker 允许你通过 --platform 选项删除某个特定的缓存变体:
docker image rm --platform=linux/arm64/v8 alpine:3.21
不过,如果删除该内容会影响到所有引用同一变体的镜像,Docker 会阻止这个操作:

如果你确认过这些引用关系,仍然想删除该变体,可以加上 --force:
docker image rm \
--platform=linux/arm64/v8 \
--force \
alpine:3.21
这种冲突只在使用 --platform 时出现。如果想删除完整的本地镜像(包括其缓存的所有平台变体),去掉 --platform,按常规方式删除镜像即可。该选项要求 Docker API 1.50 或更高版本。
删除多个 Docker 镜像
删除镜像时不需要为每个镜像单独执行一条命令。docker image rm 命令支持一次传入多个镜像 ID 或镜像名称,用空格分隔即可。
docker image rm <image_id_1> <image_id_2> ... <image_id_n>
例如,一条命令删除两个镜像,可以指定它们的仓库名和标签:
Copydocker image rm alpine:3.20 busybox:1.37
也可以通过镜像 ID 来删除多个镜像:
Copydocker image rm d9e853e87e55 9db7b59979c3
这两种写法效果相同。名称和标签通常更直观易认,而镜像 ID 则在镜像没有标签时比较有用。
使用 docker image prune 清理悬空镜像
悬空镜像(dangling image)是指不再有仓库名或标签的镜像。这类镜像通常出现在用同一个标签重新构建镜像之后,旧版本因此失去了名称。它们在镜像列表中显示为 <none>:<none>。
要查看是否存在悬空镜像,可以列出本地所有镜像:
Copydocker image ls -a --filter dangling=true \
--format 'table {{.Repository}}\t{{.Tag}}\t{{.ID}}\t{{.Size}}'
你可以逐个删除悬空镜像,方法是将镜像 ID 作为参数传给 docker image rm。不过,Docker 也提供了可以直接清理所有悬空镜像的命令:
docker image prune
Docker 会显示它将删除哪类数据,并询问确认:
CopyWARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N]
输入 y 并按回车以继续。
若要跳过确认提示,添加 --force 或 -f 选项:
docker image prune -f
注意--force 仅用于禁用确认提示。它不会强制 Docker 删除正在被容器使用的镜像。
使用 docker image prune -a 删除所有未使用的 Docker 镜像
悬空镜像只是未使用镜像的一种。Docker 可能还保留了一些已打标签但不再关联任何容器的镜像。标准的 docker image prune 命令无法删除这些镜像。
若要同时删除悬空镜像和未使用的已打标签镜像,请添加 -a 选项:
docker image prune -a
Docker 在继续前会请求确认。请仔细阅读警告信息,如果你要删除列出的那些类型的镜像,则输入 y。
若要在不显示确认提示的情况下删除所有未使用的镜像,请运行:
Copydocker image prune -a -f
只有当没有容器引用某个镜像时,它才算作未使用。与正在运行或已停止的容器相关联的镜像会被保留。不过,此命令删除的镜像在下次使用时可能需要重新下载或构建,因此建议在开发或生产主机上运行前,先确认本机存储的内容。
删除主机上的所有 Docker 镜像
如果你想重置 Docker 的本地镜像存储,可以将 docker image ls -q 返回的 ID 直接传给 docker image rm。
docker image rm $(docker image ls -q)
内部命令 docker image ls -q 只返回镜像 ID。该