一文教你如何清理 Docker 中闲置的镜像、容器和卷

时间:2024-10-13 08:18:13

Docker 让你可以轻松地将应用程序和服务封装进容器中,使它们可以在任何地方运行。然而,在使用 Docker 的过程中,很容易积累大量未使用的镜像、容器和数据卷,这些未使用的资源不仅占据输出空间,还会消耗磁盘空间。

Docker 提供了所有你需要的工具,通过命令行来清理你的系统。这份备忘单式指南为你提供了一些实用的命令快速参考,帮助你通过删除未使用的 Docker 镜像、容器和卷来释放磁盘空间,保持系统整洁。
在这里插入图片描述

本教程采用备忘录格式,包含了所有可执行的操作,以及对应的命令行片段。

注意:命令中使用的命令替换语法,$(command),在许多流行的 Shell 中都可用,如 bash、zsh 和 Windows Powershell。

另外,如果你想要一种给服务器一键部署 Docker 应用的方式,可以试试看 DigitalOcean App Platform

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

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

docker system prune
  • 1

要同时删除所有已停止的容器和所有未使用的镜像(不仅仅是悬空镜像),请在命令中添加 -a 标志:

docker system prune -a
  • 1

删除 Docker 镜像

删除一个或多个特定镜像

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

docker images -a
  • 1

删除镜像:

docker rmi Image Image
  • 1

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

删除悬空的 Docker 镜像

Docker 镜像由多个层组成。悬空镜像是那些与任何标记过的镜像无关的层。它们不再有用并消耗磁盘空间。可以通过在 docker images 命令中添加过滤标志 -f 并设置值为 dangling=true 来定位这些镜像。当你确定要删除它们时,可以使用 docker image prune 命令:

注意:如果你构建了一个没有标记的镜像,该镜像将出现在悬空镜像列表中,因为它与任何标记过的镜像无关。你可以通过在构建时提供一个标签来避免这种情况,并且可以使用 docker tag 命令对镜像进行追溯标记。

查找镜像:

docker images -f dangling=true
  • 1

删除镜像:

docker image prune
  • 1

根据模式删除镜像

你可以使用 docker imagesgrep 的组合找到所有与某个模式匹配的镜像。一旦确定,可以使用 awk 将 ID 传递给 docker rmi 进行删除。注意,这些工具不是 Docker 提供的,也不一定在所有系统上可用:

查找镜像:

docker images -a | grep "pattern"
  • 1

删除镜像:

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

删除所有镜像

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

docker images -a
  • 1

删除镜像:

docker rmi $(docker images -a -q)
  • 1

删除容器

删除一个或多个特定容器

使用带有 -a 标志的 docker ps 命令来定位你想要删除的容器的名称或 ID:

查找容器:

docker ps -a
  • 1

删除容器:

docker rm ID_or_Name ID_or_Name
  • 1

退出时删除容器

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

运行并删除:

docker run --rm image_name
  • 1

删除所有已退出的容器

你可以使用 docker ps -a 并根据它们的状态筛选容器:createdrestartingrunningpausedexited。要查看已退出容器的列表,请使用 -f 标志基于状态进行筛选。确认想要删除这些容器后,使用 -q 将 ID 传递给 docker rm 命令:

查找容器:

docker ps -a -f status=exited
  • 1

删除容器:

docker rm $(docker ps -a -f status=exited -q)
  • 1

使用多个过滤器删除容器

Docker 过滤器可以通过重复过滤标志并添加额外的值来组合。这将生成符合任一条件的容器列表。例如,如果你想删除标记为 created(使用无效命令运行容器时可能出现的状态)或 exited 的所有容器,你可以使用两个过滤器:

查找容器:

docker ps -a -f status=exited -f status=created
  • 1

删除容器:

docker rm $(docker ps -a -f status=exited -f status=created -q)
  • 1

根据模式删除容器

你可以使用 docker psgrep 的组合找到所有与某个模式匹配的容器。当你确定拥有想要删除的列表时,可以使用 awkxargs 将 ID 提供给 docker rm。注意,这些工具不是 Docker 提供的,也不一定在所有系统上可用:
查找容器:

docker ps -a | grep "pattern"
  • 1

删除容器:

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

停止并删除所有容器

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

查找容器:

docker ps -a
  • 1

删除容器:

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
  • 1
  • 2

删除卷

删除一个或多个特定卷

使用 docker volume ls 命令定位你希望删除的卷的名称。然后,你可以使用 docker volume rm 命令删除一个或多个卷:

查找容器:

docker volume ls
  • 1

删除容器:

docker volume rm volume_name volume_name
  • 1

删除悬空卷

由于卷的存在是独立于容器的,当容器被移除时,卷并不会自动被同时移除。当一个卷存在且不再连接到任何容器时,它被称为悬空卷。要定位这些卷以确认你想要删除它们,你可以使用带有过滤器的 docker volume ls 命令,仅显示悬空卷的结果。当你对列表满意时,可以使用 docker volume prune 删除它们所有:

查找卷:

docker volume ls -f dangling=true
  • 1

删除:

docker volume prune
  • 1

删除容器及其卷

如果你创建了一个未命名的卷,可以在删除容器时同时用 -v 标志删除它。注意,这仅适用于未命名的卷。当容器成功删除后,会显示其 ID。注意,没有提及卷的移除。如果它是未命名的,它会在系统中默默被移除。如果它是命名的,它会默默地保留。

删除容器及卷:

docker rm -v container_name
  • 1

结论

本教程涵盖了一些使用 Docker 删除镜像、容器和卷的常用命令。每个命令都可以使用许多其他的组合和标志。要了解更全面的信息,请参阅 Docker 文档中的 docker system prunedocker rmidocker rmdocker volume rm。如果你希望在指南中看到常见的清理任务,请在评论中提问或提出建议。

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

想要了解更多关于云服务的技术教程,可访问DigitalOcean 博客教程资源中心,我们还将持续更新更多教程。