如何删除Docker映像、容器和卷
介绍
Docker 可以轻松地将您的应用程序和服务包装在容器中,以便您可以在任何地方运行它们。 然而,当您使用 Docker 时,也很容易积累过多的未使用的图像、容器和数据卷,从而使输出变得混乱并占用磁盘空间。
Docker 为您提供了从命令行清理系统所需的所有工具。 这个备忘单风格的指南提供了对有助于释放磁盘空间和通过删除未使用的 Docker 映像、容器和卷来保持系统井井有条的命令的快速参考。
如何使用本指南:
- 本指南采用备忘单格式,带有独立的命令行片段。
- 跳转到与您尝试完成的任务相关的任何部分。
注意: 命令中使用的命令替换语法 command $(command)
在许多流行的 shell 中都可用,例如 bash、zsh 和Windows Powershell。
清除所有未使用或悬空的图像、容器、卷和网络
Docker 提供了一个命令来清理 dangling(未标记或与容器关联)的任何资源——图像、容器、卷和网络:
docker system prune
要另外删除任何已停止的容器和所有未使用的图像(不仅仅是悬空图像),请在命令中添加 -a
标志:
docker system prune -a
删除 Docker 映像
移除一张或多张特定图片
使用带有 -a
标志的 docker images
命令来定位要删除的图像的 ID。 这将显示每个图像,包括中间图像层。 找到要删除的图像后,可以将它们的 ID 或标签传递给 docker rmi
:
列表:
docker images -a
消除:
docker rmi Image Image
删除悬空图像
Docker 镜像由多个层组成。 悬空图像是与任何标记图像无关的层。 它们不再有任何用途并消耗磁盘空间。 可以通过将值为 dangling=true
的过滤器标志 -f
添加到 docker images
命令来定位它们。 当您确定要删除它们时,可以使用 docker image prune
命令:
注意: 如果你构建一个没有标记的图像,该图像将出现在悬空图像列表中,因为它与标记的图像没有关联。 您可以通过 在构建时提供标签 来避免这种情况,并且您可以使用 docker tag 命令追溯标记图像。
列表:
docker images -f dangling=true
消除:
docker image prune
根据图案删除图像
您可以使用 docker images
和 grep 的组合找到与模式匹配的所有图像。 满意后,您可以使用 awk 将 ID 传递给 docker rmi
来删除它们。 请注意,这些实用程序不是由 Docker 提供的,并且不一定在所有系统上都可用:
列表:
docker images -a | grep "pattern"
消除:
docker images -a | grep "pattern" | awk '{print $3}' | xargs docker rmi
删除所有图像
可以通过在 docker images
命令中添加 -a
来列出系统上的所有 Docker 镜像。 一旦确定要删除它们,就可以添加 -q
标志以将图像 ID 传递给 docker rmi
:
列表:
docker images -a
消除:
docker rmi $(docker images -a -q)
移除容器
移除一个或多个特定容器
使用带有 -a
标志的 docker ps
命令来定位要删除的容器的名称或 ID:
列表:
docker ps -a
消除:
docker rm ID_or_Name ID_or_Name
退出时移除容器
如果您知道在创建容器时不想在完成后保留它,则可以运行 docker run --rm
以在它退出时自动删除它:
运行和删除:
docker run --rm image_name
删除所有退出的容器
您可以使用 docker ps -a
定位容器并按其状态过滤它们:created
、restarting
、running
、paused
或 exited
。 要查看 exited
容器列表,请使用 -f
标志根据状态进行过滤。 当您确认要删除这些容器后,使用 -q
将 ID 传递给 docker rm
命令:
列表:
docker ps -a -f status=exited
消除:
docker rm $(docker ps -a -f status=exited -q)
使用多个过滤器移除容器
可以通过使用附加值重复过滤器标志来组合 Docker 过滤器。 这会生成满足任一条件的容器列表。 例如,如果要删除标记为 created
(使用无效命令运行容器时可能导致的状态)或 exited
的所有容器,可以使用两个过滤器:
列表:
docker ps -a -f status=exited -f status=created
消除:
docker rm $(docker ps -a -f status=exited -f status=created -q)
根据模式移除容器
您可以使用 docker ps
和 grep 的组合找到与模式匹配的所有容器。 当您对拥有要删除的列表感到满意时,可以使用 awk 和 xargs
将 ID 提供给 docker rm
。 请注意,这些实用程序不是由 Docker 提供的,并且不一定在所有系统上都可用:
列表:
docker ps -a | grep "pattern”
消除:
docker ps -a | grep "pattern" | awk '{print $1}' | xargs docker rm
停止并移除所有容器
您可以使用 docker ps
查看系统上的容器。 添加 -a
标志将显示所有容器。 当您确定要删除它们时,可以添加 -q
标志以将 ID 提供给 docker stop
和 docker rm
命令:
列表:
docker ps -a
消除:
docker stop $(docker ps -a -q) docker rm $(docker ps -a -q)
删除卷
删除一个或多个特定卷 - Docker 1.9 及更高版本
使用 docker volume ls
命令找到您要删除的卷名。 然后您可以使用 docker volume rm
命令删除一个或多个卷:
列表:
docker volume ls
消除:
docker volume rm volume_name volume_name
删除悬空卷 - Docker 1.9 及更高版本
由于卷的意义在于独立于容器而存在,所以当容器被移除时,卷不会同时被自动移除。 当一个卷存在并且不再连接到任何容器时,它被称为悬空卷。 要找到它们以确认您要删除它们,您可以使用带有过滤器的 docker volume ls
命令将结果限制为悬空卷。 当您对列表感到满意时,可以使用 docker volume prune
将它们全部删除:
列表:
docker volume ls -f dangling=true
消除:
docker volume prune
删除容器及其卷
如果您创建了一个未命名的卷,它可以与带有 -v
标志的容器同时被删除。 请注意,这仅适用于 未命名 卷。 成功移除容器后,会显示其 ID。 请注意,没有提及删除卷。 如果未命名,则会从系统中静默删除。 如果它被命名,它会默默地存在。
消除:
docker rm -v container_name
结论
本指南介绍了一些用于使用 Docker 删除映像、容器和卷的常用命令。 还有许多其他组合和标志可以与每个组合和标志一起使用。 有关可用内容的综合指南,请参阅 docker system prune、docker rmi、docker rm 和 docker volume rm 的 Docker 文档]。 如果您希望在指南中看到常见的清理任务,请在评论中提出或提出建议。
要详细了解 Docker 容器的不同组件,请查看 Docker 生态系统:通用组件简介 。