如何删除Docker镜像、容器和卷

介绍

Docker使得将应用程序和服务封装到容器中,以便在任何地方运行变得简单。然而,当您使用Docker时,也很容易积累过多未使用的镜像、容器和数据卷,这些会混乱输出并消耗磁盘空间。

Docker为您提供了从命令行清理系统所需的所有工具。这个速查表式指南提供了一个快速参考,介绍了一些有用的命令,可用于释放磁盘空间,并通过删除未使用的Docker镜像、容器和卷来保持系统的组织性。

如何使用本指南:

  • 本指南以速查表格式提供了自包含的命令行代码片段。
  • 跳转到与您要完成的任务相关的任何部分。

注意:命令替换语法,command $(command),在许多流行的shell中都可用,比如bashzshWindows Powershell如果您想要一种一键部署Docker应用程序到实时服务器的方式,请查看DigitalOcean App Platform

如果您想要一种只需点击一次即可将Docker应用程序部署到实时服务器的方法,请查看DigitalOcean App平台

清除所有未使用的或悬空的映像、容器、卷和网络

Docker提供了一个单一命令,可以清理任何资源——映像、容器、卷和网络——这些资源是悬空的(没有标签或与容器关联):

docker system prune

为了进一步删除任何已停止的容器和所有未使用的映像(不仅仅是悬空映像),请在命令中添加-a标志:

docker system prune -a

移除Docker映像

移除一个或多个特定映像

使用带有-a标志的docker images命令来查找您想要删除的镜像的ID。这将显示您所有的镜像,包括中间镜像层。当您找到要删除的镜像后,可以将它们的ID或标签传递给docker rmi

列表:

docker images -a

删除:

docker rmi Image Image

注意:docker images命令中,-a--all标志显示所有的Docker镜像,包括中间层,这些中间层没有被任何标签引用。默认情况下,docker images只显示至少有一个标签的镜像。然而,可能有一些没有任何标签的镜像仍然占用系统上的磁盘空间。-a标志可以帮助识别可以修剪以节省磁盘空间的镜像。当与docker rmi命令一起使用时,-f--force标志也可以用来删除没有标签的镜像。

删除悬空Docker镜像

Docker镜像由多个层组成。悬空镜像是与任何已标记镜像没有关联的层。它们不再有任何作用,并且占用磁盘空间。可以通过在docker images命令中添加带有dangling=true值的过滤器标志-f来找到它们。当您确定要删除它们时,可以使用docker image prune命令:

注意: 如果您构建图像而没有对其进行标记,该图像将出现在悬挂图像列表中,因为它与已标记的图像没有关联。您可以在构建时通过提供标记来避免这种情况,并且可以使用docker tag命令以后期方式为图像打标记。

列表:

docker images -f dangling=true

移除:

docker image prune

按模式移除图像

您可以使用docker imagesgrep的组合找到所有与模式匹配的图像。一旦您满意,您可以使用awk将其 ID 传递给docker rmi来删除它们。请注意,这些实用工具不是由 Docker 提供的,并且不一定在所有系统上都可用:

列表:

docker images -a |  grep "pattern"

移除:

docker images -a | grep "pattern" | awk '{print $1":"$2}' | xargs docker rmi

删除所有图片

系统上的所有Docker镜像可以通过在docker images命令后添加-a来列出。一旦确定要删除它们,可以添加-q标志将镜像ID传递给docker rmi:

列表:

docker images -a

移除:

docker rmi $(docker images -a -q)

移除容器

移除一个或多个特定的容器

使用docker ps命令和-a标志来定位要移除的容器的名称或ID:

列表:

docker ps -a

移除:

docker rm ID_or_Name ID_or_Name

在退出时移除容器

如果您在创建容器时知道不想保留它,可以运行docker run --rm来在退出时自动删除它:

运行并删除:

docker run --rm image_name

删除所有已退出的容器

您可以使用docker ps -a来定位容器,并按其状态进行过滤:createdrestartingrunningpausedexited。要查看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 psgrep的组合来查找与模式匹配的所有容器。当您满意您要删除的列表时,您可以使用awkxargs来向docker rm提供ID。请注意,这些实用程序不由Docker提供,并且不一定在所有系统上都可用:

列表:

docker ps -a |  grep "pattern

删除:

docker ps -a | grep "pattern" | awk '{print $1}' | xargs docker rm

停止并移除所有容器

您可以使用docker ps命令查看系统上的容器。添加-a标志将显示所有容器。当您确定要删除它们时,可以添加-q标志以向docker stopdocker rm命令提供ID:

列表:

docker ps -a

移除:

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

移除卷

移除一个或多个特定卷

使用docker volume ls命令查找要删除的卷名称或名称。然后,您可以使用docker volume rm命令移除一个或多个卷:

列表:

docker volume ls

移除:

docker volume rm volume_name volume_name

删除悬挂卷

卷存在的意义在于它们与容器无关联,因此当容器被删除时,卷不会自动被删除。当一个卷存在但不再与任何容器连接时,它被称为悬挂卷。要定位它们以确认您要删除它们,您可以使用docker volume ls命令,并使用过滤器将结果限制为悬挂卷。当您满意列表时,可以使用docker volume prune将它们全部删除:

列表:

docker volume ls -f dangling=true

删除:

docker volume prune

删除容器及其卷

如果您创建了一个未命名的卷,可以使用-v标志将其与容器同时删除。请注意,这仅适用于未命名卷。当容器成功删除时,会显示其ID。请注意,没有提及卷的删除。如果它没有命名,它会被静默从系统中删除。如果它被命名,它会保持静默存在。

删除:

docker rm -v container_name

结论

本指南涵盖了一些用于使用Docker删除图像、容器和卷的常见命令。还有许多其他组合和标志可与每个命令一起使用。要获取可用内容的全面指南,请参阅Docker文档中的docker system prunedocker rmidocker rmdocker volume rm。如果您想在指南中看到常见的清理任务,请在评论中提问或提出建议。

要详细了解Docker容器的不同组件,请查看Docker生态系统:常见组件简介

Source:
https://www.digitalocean.com/community/tutorials/how-to-remove-docker-images-containers-and-volumes