一文教你如何清理 Docker 中闲置的镜像、容器和卷
一文教你如何清理 Docker 中闲置的镜像、容器和卷
在使用Docker的过程中,很容易积累大量未使用的镜像、容器和数据卷,这些未使用的资源不仅占据输出空间,还会消耗磁盘空间。这份备忘单式指南为你提供了一些实用的命令快速参考,帮助你通过删除未使用的Docker镜像、容器和卷来释放磁盘空间,保持系统整洁。
本教程采用备忘录格式,包含了所有可执行的操作,以及对应的命令行片段。
注意:命令中使用的命令替换语法,在许多流行的Shell中都可用,如bash、zsh和Windows Powershell。
清除所有未使用或悬空镜像、容器、卷和网络
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。