系统极客一直在努力
专注操作系统及软件使用技能

Docker 环境清理指南:轻松移除镜像、容器、网络和数据卷

Docker

自从 Docker 问世以来,应用的部署方式就发生了翻天覆地的变化。借助容器化技术,开发与运维流程变得越发灵活,效率也得到了大幅提升。就连 Homelab 玩家,也能随时拉取一个感兴趣的应用来玩玩儿 😘。

但是,随着 Docker 环境的不断扩展,如何高效管理容器、镜像、数据卷和网络等资源,就成了一个不可忽视的问题。于是乎,我们就需要借助一些常用命令和实用技巧,科学地进行 Docker 环境清理,移除那些不再需要的资源,来防止资源堆积,并降低安全风险。

什么是 Docker 清理?

在日常使用过程中,你肯定会不断创建容器。这些容器本质上是轻量级、可移植的运行环境,用来封装应用及其依赖。但随着开发迭代,容器、镜像、数据卷和网络的数量也会不断膨胀。如果不加以清理,这些历史资源就会霸占大量磁盘空间,影响系统性能。

Docker 清理,简单来说就是——对资源进行统一管理合理移除。定期发现并删除那些未被使用已无留存必要冗余资源

这样做不仅能够有效释放磁盘空间,还能提升系统运行效率,让环境更加井然有序,确保应用稳定流畅地运行。

合理进行 Docker 清理,可以有效避免资源堆积,维持整洁的开发与生产环境。

Docker 基础知识回顾

要高效地完成 Docker 清理,首先你得理解 Docker 的核心资源类型

  • 在 Docker 中,「镜像」相当于应用运行所需环境的完整打包,包含了所有必备文件及系统配置。当你基于镜像运行应用时,就会生成一个独立的「容器」。每个容器都是一个隔离的小型运行环境,确保应用彼此独立且高效运行。
  • 容器之间通过「网络」实现互联,可以便捷地进行通讯和数据交换。与此同时,「数据卷」为容器提供了数据持久化支持,即便容器被重启或删除,重要数据也能够保留下来并继续访问。

正因为如此,镜像、容器、网络与数据卷共同构成了 Docker 容器化的基础。只有掌握这些核心概念,才能更有针对性地进行资源管理和清理,让应用的部署与维护更加高效、可靠。

Docker 磁盘空间管理

定期检查 Docker 的磁盘空间占用,是防止「磁盘被爆」的重要举措。这不仅有助于保障系统性能,还能有效预防部署失败、容器运行缓慢等潜在问题。

1你可以使用以下命令,快速了解当前 Docker 占用了多少磁盘空间:

docker system df

这条命令会统计镜像、容器、数据卷以及构建缓存等 Docker 组件的磁盘使用情况,并输出一个概览信息。

2如果你想看到更详细的磁盘占用数据,在命令后面加上-v参数就行:

docker system df -v

这样就能详细列出每个具体资源的使用情况,包括空间占用、文件系统类型、挂载点等信息。

查看 Docker 空间占用
查看 Docker 空间占用

Docker Prune 命令:一键清理神器

docker system prune命令可以说是清理 Docker 环境的「一键神器」。当你的磁盘空间告急,或者只想保留「真正必要」的 Docker 资源时,它都能帮你轻松移除那些无用数据。具体来说,它能自动删除以下内容:

  • 所有「已停止」的容器。
  • 所有未被任何容器使用的网络。
  • 所有悬空镜像。
  • 不使用的构建缓存。

在开发、测试,或者 Homelab 玩家的环境中,由于频繁创建和删除容器、镜像,很容易造成资源堆积。此时,只要你执行下面这条「神操作命令」,就能快速释放磁盘空间,让环境保持整洁高效:

docker system prune
一键清理 Docker 未使用资源
一键清理 Docker 未使用资源

执行该命令后,Docker 就会自动扫描并移除所有未被使用的资源,帮你高效回收空间。虽然也可以加-f参数来强制删除,但极不推荐,(移除前)最好还是先确认一下。

如果你只是想让 Homelab 中的 Docker 环境保持干净清爽,并且支持自动更新镜像和容器,可以考虑装一个 Watchtower 来完成自动化,后文内容可以略过了。

Docker 镜像删除指南

按需删除指定镜像

1我们可以通过以下命令查看当前系统中所有的 Docker 镜像(包括基础镜像和中间层镜像),详细信息包括了镜像 ID 和 Tag 等:

docker images -a

2在确认要删除的镜像后,再通过以下命令,结合镜像 ID 或 Tag 进行精准删除。

  • 根据镜像 ID 删除指定镜像
docker rmi <image_id>

执行完该命令后,Docker 会先解除该镜像的 Tag 绑定,然后彻底删除镜像文件。同时,还会自动识别并清除那些仅被这个镜像引用的层(Layer),进一步节省磁盘空间。

列出及删除指定 Docker 镜像
列出及删除指定 Docker 镜像
  • 根据镜像 Tag 删除
docker rmi <image_tag>
  • 同时删除多个镜像
docker rmi <image1> <image2> <image3>
  • 一键删除全部本地镜像(谨慎使用 😈)
docker rmi $(docker images -a -q)

借助过滤器精准清理镜像

docker image prune命令支持灵活的过滤参数,可以帮你更加精准地批量清理无用(悬空)镜像。比如:

docker image prune --filter "your_filter"

通过不同的过滤条件,可以帮你高效清理特定类型的镜像:

  • 删除 24 小时前创建的悬空镜像
docker image prune --filter "until=24h"
  • 删除带有特定 Label 的镜像
docker image prune --filter "label=unused"
  • 删除所有悬空镜像:
docker image prune --filter "dangling=true"

基于模式批量筛选并删除镜像

如果你想先通过关键词来筛选镜像,然后再批量删除,可以按照以下步骤操作:

1列出所有本地镜像:

docker images -a

2通过命令筛选出符合特定模式的镜像:

docker images -a | grep "node"

3使用awkxargs组合,将筛选结果传递给docker rmi,进行批量删除:

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

通过以上方式,你可以灵活筛选目标镜像,并进行高效批量清理。

Docker 容器删除指南

按需删除指定容器

要删除一个或多个 Docker 容器,可以使用docker rm命令,后接要删除的容器 ID 或名称:

docker rm <ID_or_Name>
列出及删除指定 Docker 容器
列出及删除指定 Docker 容器

容器退出后自动删除

如果你希望容器在退出后自动删除,只需要在运行容器时加上--rm参数:

docker run --rm <image_name>

批量删除所有「已退出」的容器

1使用以下命令,查看所有「已停止」(exited)的容器,识别待清理对象:

docker ps -a -f status=exited

2使用-q参数输出容器 ID,再配合docker rm批量删除所有「已退出」的容器:

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

按模式批量筛选并删除容器

你也可以根据容器名称或其他关键字筛选目标容器,再进行清理。例如:

1查找所有名称或相关信息包含「pattern」的容器:

docker ps -a | grep "pattern"

2再结合awkxargs,批量删除这些容器:

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

一键清理所有「已停止」容器

使用以下命令,可以一键删除所有「已停止」(stopped)的容器(谨慎操作 😈):

docker container prune
清理 Docker 所有「已停止」容器
清理 Docker 所有「已停止」容器

一键删除所有 Docker 容器

如果要彻底删除系统中的所有容器(无论是否正在运行),可以使用以下命令(极度谨慎 😈😈):

docker rm $(docker ps -aq)

Docker 数据卷删除指南

按需删除指定数据卷

1如果你想删除一个或多个特定的数据卷,可以先使用以下命令列出所有数据卷:

docker volume ls

2根据查询结果,使用以下命令,指定要删除的数据卷名称或 ID:

docker volume rm <volume_name> <volume_id>
列出及删除指定 Docker 数据卷
列出及删除指定 Docker 数据卷

删除悬空数据卷

1如果要清理那些未被任何容器使用的悬空数据卷,可以添加-f dangling=true参数进行过滤查看:

docker volume ls -f dangling=true

2然后再使用docker volume rm命令逐个或批量删除。

一键清理未使用数据卷

如果你想一键清理所有无用数据卷,可以使用以下命令(谨慎操作 😈):

docker volume prune
删除并清理 Docker 未使用数据卷
删除并清理 Docker 未使用数据卷

Docker 网络删除指南

删除指定网络

1当你需要删除一个或多个特定网络时,可以先使用以下命令列出当前所有网络:

docker network ls

2根据查询结果,使用以下命令,指定要删除的网络名称或 ID:

docker network rm <network_name> <network_id>
列出及删除指定 Docker 网络
列出及删除指定 Docker 网络

如果你一次性传入多个网络参数,Docker 会按顺序逐个尝试删除。如果其中某个网络无法删除(例如正被某个容器占用),它会自动跳过,并继续删除后续的网络。

Docker 清理命令速查表

为了方便大家快速查阅和动手实操,这里整理了一份最常用的 Docker 清理命令速查表:

命令说明
docker system df查看 Docker 磁盘资源占用情况
docker system prune一键删除所有未使用的容器、网络、镜像
docker rmi $(docker images -a -q)删除所有本地镜像
docker image prune --filter "dangling=true"清理所有悬空镜像
docker rm $(docker ps -a -f status=exited -q)删除所有「已退出」的容器
docker container prune清理所有「已停止」的容器
docker volume prune清理所有未使用的数据卷
docker network prune清理所有未使用的网络

合理的 Docker 清理,是高效管理资源的基础。通过系统性地删除不使用的容器、镜像、数据卷和网络,不仅可以有效释放磁盘空间,还能提升系统整体性能,并降低潜在的安全风险。本文汇总了最实用的清理命令和技巧,希望能你高效维护 Docker 环境,践行最佳实践 🚀。

赞(1)
分享到

评论 抢沙发