一文教你如何清理 Docker 中闲置的镜像、容器和卷
一文教你如何清理 Docker 中闲置的镜像、容器和卷
Docker在使用过程中很容易积累大量未使用的镜像、容器和数据卷,这些闲置资源不仅占据输出空间,还会消耗磁盘空间。本文将为你提供一系列实用的命令,帮助你通过删除未使用的Docker镜像、容器和卷来释放磁盘空间,保持系统整洁。
清除所有未使用或悬空镜像、容器、卷和网络
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 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
删除镜像:
docker image prune
根据模式删除镜像
你可以使用docker images
和grep
的组合找到所有与某个模式匹配的镜像。一旦确定,可以使用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)
删除容器
删除一个或多个特定容器
使用带有-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。要查看已退出容器的列表,请使用-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 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 prune
、docker rmi
、docker rm
和docker volume rm
。