Docker删除未使用的镜像,容器,卷和网络

Docker采用保守的方法来清理未使用的对象(通常称为“垃圾回收”),例如镜像,容器,卷和网络:除非您明确要求Docker这样做,否则通常不会删除这些对象。 这可能会导致Docker使用额外的磁盘空间。 对于每种类型的对象,Docker提供一个prune命令。 另外,您可以使用docker system prune一次清除多种对象。 本主题显示如何使用这些prune命令。

删除镜像

docker image prune命令可让您清理未使用的镜像。 默认情况下,docker image prune只会清除*悬空(dangling)*镜像。 悬空镜像是未标记且未被任何容器引用的镜像。要删除悬空的镜像:

$ docker image prune

WARNING! This will remove all dangling images. 
Are you sure you want to continue? [y/N] y

要删除现有容器未使用的所有镜像,请使用-a标志:

$ docker image prune -a

WARNING! This will remove all images without at least one container associated to them. 
Are you sure you want to continue? [y/N] y

默认情况下,系统会提示您是否继续。要绕过提示,请使用-f--force标志。

您可以使用带有--filter标志的过滤表达式来限制删除哪些镜像。例如,仅考虑24小时前创建的镜像:

$ docker image prune -a --filter "until=24h"

还有其他过滤表达式,有关更多示例,请参见docker image prune参考

删除容器

停止容器时,除非使用--rm标志将其启动,否则不会自动将其删除。 要查看Docker主机上的所有容器,包括已停止的容器,请使用docker ps -a。 您可能会惊讶地发现有多少个容器,尤其是在开发系统上! 停止的容器的可写层仍会占用磁盘空间。 为了清理这个问题,可以使用docker container prune命令。

$ docker container prune

WARNING! This will remove all stopped containers. 
Are you sure you want to continue? [y/N] y

默认情况下,系统会提示您是否继续。 要绕过提示,请使用-f--force标志。

默认情况下,所有停止的容器都将被删除。 您可以使用--filter标志来限制范围。 例如,以下命令仅删除24小时以上的已停止容器:

$ docker container prune --filter "until=24h"

还有其他过滤表达式, 有关更多示例,请参见docker container prune参考

删除卷

卷可由一个或多个容器使用,并占用Docker主机上的空间。 卷不会自动删除,因为这样做可能会破坏数据。

$ docker volume prune

WARNING! This will remove all volumes not used by at least one container. Are you sure you want to continue? [y/N] y

默认情况下,系统会提示您是否继续。 要绕过提示,请使用-f--force标志。

默认情况下,将删除所有未使用的卷。 您可以使用--filter标志来限制范围。 例如,以下命令仅删除没有keep标签的卷:

$ docker volume prune --filter "label!=keep"

还有其他过滤表达式,有关更多示例,请参见docker volume prune参考

删除网络

Docker网络不会占用太多磁盘空间,但它们确实会创建iptables规则,桥接网络设备和路由表条目。 为了清理这些东西,可以使用docker network prune来清理任何容器都没有使用的网络。

$ docker network prune

WARNING! This will remove all networks not used by at least one container. 
Are you sure you want to continue? [y/N] y

默认情况下,系统会提示您是否继续。 要绕过提示,请使用-f--force标志。

默认情况下,将删除所有未使用的网络。 您可以使用--filter标志来限制范围。 例如,以下命令仅删除早于24小时的网络:

$ docker network prune --filter "until=24h"

还有其他过滤表达式。 有关更多示例,请参见docker network prune参考

删除一切

docker system prune命令是删除镜像,容器和网络的快捷方式。 在Docker 17.06.0及更早版本中,还删除了卷。 在Docker 17.06.1及更高版本中,必须为docker system prune指定--volumes标志以删除卷。

$ docker system prune

WARNING! This will remove:
        - all stopped containers
        - all networks not used by at least one container
        - all dangling images
        - all build cache 
Are you sure you want to continue? [y/N] y

如果您使用的是Docker 17.06.1或更高版本,并且还想删除卷,请添加--volumes标志:

$ docker system prune --volumes

WARNING! This will remove:
        - all stopped containers
        - all networks not used by at least one container
        - all volumes not used by at least one container
        - all dangling images
        - all build cache 
Are you sure you want to continue? [y/N] y

默认情况下,系统会提示您是否继续。 要绕过提示,请使用-f--force标志。