docker垃圾回收机制

做者: 张首富
时间: 2019-04-10
w x: y18163201

说明

对于Docker来讲,存在镜像/容器/存储卷和网络(iptables规则)这些对象.所以docker也会产生出这些对应的对象,这些对象会占据磁盘空间,当这些对象不会再被使用的时候,为了节省磁盘空间,就须要对这些对象进行清理,即docker的垃圾清理.咱们这边针对docker 1.13 之后的版本进行清理docker

docker的垃圾清理

清理中止的容器

当咱们使用docker stop $ContainerName命令中止容器的时候,系统并不知道会删除这个容器,除非在运行此容器的时候设置了-rm参数,中止后的容器仍然会占据cipan的存储空间,经过docker container prune可以删除这些被中止后的容器bash

# 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 images prune命令能够清除全部再也不使用的镜像,默认状况下此命令仅仅清除状态为dangling的镜像。
什么样的镜像才为dangling的镜像: 为未被打标签和没有被任何容器引用的镜像。
什么状况下才会出现: 原来为 mongo:3.2, 随着官方镜像维护, 发布了新版本后, 从新 docker pull mongo:3.2 时, mongo:3.2 这个镜像名被转移到了新下载的镜像身上, 而旧的镜像上的这个名称则被取消, 从而成为了 <none>. 除了 docker pull 可能致使这种状况, docker build 也一样能够致使这种现象. 因为新旧镜像同名, 旧镜像名称被取消, 从而出现仓库名、标签均为 <none> 的镜像.ide

# docker image prune

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

移除全部未被使用的镜像,这须要经过设置-a字段来实现,只要未被使用都会被删除ui

# 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小时的镜像。code

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

删除存储卷

存储卷能够被一个或者多个容器使用,也会占据磁盘空间。为保持数据,存储卷永远都不会自动被删除.对象

# 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字段,来过滤所要删除的存储卷。例如,下面的命令仅仅删除label值为keep的存储卷。ip

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

清除网络(iptables规则)

docker网络并不会占据磁盘空间,可是会建立iptables规则,桥网络设备和路由表。所以,但如何再也不使用这些资源时,应该对其进行清理。ci

# 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 system prune命令可以快速的删除全部的未被使用的对象,包括镜像、容器、网络和存储卷。在docker 17.06.0以前,存储卷会同时被清理。在docker 17.06.1以后,须要经过设置–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
相关文章
相关标签/搜索