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 images
和 grep 的组合找到所有与某个模式匹配的镜像。一旦确定,可以使用 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
并根据它们的状态筛选容器:created
、restarting
、running
、paused
或 exited
。要查看已退出容器的列表,请使用 -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 ps
和 grep
的组合找到所有与某个模式匹配的容器。当你确定拥有想要删除的列表时,可以使用 awk
和 xargs
将 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 stop
和 docker 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 prune
、docker rmi
、docker rm
和 docker volume rm
。如果你希望在指南中看到常见的清理任务,请在评论中提问或提出建议。
想要详细了解 Docker 容器的不同组件,请查看《Docker 生态系统:常见组件简介》。
想要了解更多关于云服务的技术教程,可访问DigitalOcean 博客教程资源中心,我们还将持续更新更多教程。