文章转自https://mp.weixin.qq.com/s/S8ZjGZF8oLC8c1JRnkE5yw?tdsourcetag=s_pctim_aiomsg

1、整体分析

对于Docker来说,存在镜像、容器、存储卷和网络这些对象。因此,也就会生产相对应的这些对象,这些对象会占据磁盘空间。当这些对象不在被使用时,为了不占据额外的磁盘空间,就需要对这些对象进行清理,即进行垃圾清理。在docker 1.13版本之后,提供了对各种对象的prune命令,也提供了清理所有对象类型的docker system prune命令。但在docker 1.13之前的版本,则需要提供其他方式进行垃圾清理。

2、垃圾清理

2.1 docker v1.13之后版本的垃圾清理

2.1.1 容器

在停止容器时,系统并不会知道删除这个容器,除非在运行此容器时设置了–rm字段。停止后的容器仍然会占据磁盘的存储空间,通过docker container prune能够删除这些被停止后的容器。

  1. $ docker container prune

  2. WARNING! This will remove all stopped containers.

  3. Are you sure you want to continue? [y/N] y

执行此命令时,默认会提示是否继续。如果在执行命令是设置了-f或–force字段,则会直接删除已所有已停止的容器。默认情况下,此命令执行时会删除所有的已停止的容器,也可以通过设置–filter字段,来过滤所要删除的容器。例如,下面的命令仅仅删除停止超过24小时的容器。

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

2.1.2 镜像

通过执行docker images prune命令可以清除所有不再使用的镜像,默认情况下此命令仅仅清除状态为dangling的镜像。状态为dangling的镜像为未被打标签和没有被任何容器引用的镜像。

  1. $ docker image prune

  2. WARNING! This will remove all dangling images.

  3. Are you sure you want to continue? [y/N] y

如果要移除所有未被使用的镜像,则通过设置-a字段来实现:

  1. $ docker image prune -a

  2. WARNING! This will remove all images without at least one container associated to them.

  3. Are you sure you want to continue? [y/N] y

执行此命令时,默认会提示是否继续。如果在执行命令是设置了-f或–force字段,则会直接进行删除操作。可以通过设置–filter字段,来过滤所要删除的镜像。例如,下面的命令仅仅删除停止创建超过24小时的镜像。

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

2.1.3 存储卷

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

  1. $ docker volume prune

  2. WARNING! This will remove all volumes not used by at least one container.

  3. Are you sure you want to continue? [y/N] y

执行此命令时,默认会提示是否继续。如果在执行命令是设置了-f或–force字段,则会直接进行删除操作。默认情况下,此命令执行时会删除所有的未被使用的存储卷,也可以通过设置–filter字段,来过滤所要删除的存储卷。例如,下面的命令仅仅删除label值为keep的存储卷。

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

2.1.4 网络

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

  1. $ docker network prune

  2. WARNING! This will remove all networks not used by at least one container.

  3. Are you sure you want to continue? [y/N] y

执行此命令时,默认会提示是否继续。如果在执行命令是设置了-f或–force字段,则会直接进行删除操作。默认情况下,此命令执行时会删除所有的未被使用的网络,也可以通过设置–filter字段,来过滤所要删除的网络。例如,下面的命令仅仅为被使用超过24小时的网络。

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

2.1.5 删除所有的对象

通过docker system prune命令能够快速的删除所有的未被使用的对象,包括镜像、容器、网络和存储卷。在docker 17.06.0之前,存储卷会同时被清理。在docker 17.06.1之后,需要通过设置–volumes字段,才会同时清理存储卷。

  1. $ docker system prune

  2. WARNING! This will remove:

  3.        - all stopped containers

  4.        - all networks not used by at least one container

  5.        - all dangling images

  6.        - all build cache

  7. Are you sure you want to continue? [y/N] y

如果所使用的docker 17.06.1之后的版本,则需要在命令后添加–volumes字段来清理存储卷的内容。

  1. $ docker system prune --volumes

  2. WARNING! This will remove:

  3.        - all stopped containers

  4.        - all networks not used by at least one container

  5.        - all volumes not used by at least one container

  6.        - all dangling images

  7.        - all build cache

  8. Are you sure you want to continue? [y/N] y

2.2 docker v1.13之前版本的垃圾清理

2.2.1 容器

在停止容器时,系统并不会知道删除这个容器,除非在运行此容器时设置了–rm字段。停止后的容器仍然会占据磁盘的存储空间,通过docker rm能够删除这些被停止后的容器。通过下面的命令能够清除所有已停止的容器。

  1. $ docker rm $(docker ps -a -q)

2.2.2 镜像

通过执行docker rmi命令可以清除所有不再使用的镜像,一般情况下仅仅清除状态为dangling的镜像。状态为dangling的镜像为未被打标签和没有被任何容器引用的镜像。

  1. $ docker rmi $(docker images -q -f "dangling=true")

2.2.3 存储卷

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

  1. $ docker volume rm $(docker volume ls -q -f dangling=true)

参考资料

1.《docker container prune》地址:https://docs.docker.com/engine/reference/commandline/container_prune/

2.《Prune unused Docker objects》地址:https://docs.docker.com/config/pruning/

3.《docker image prune》地址:https://docs.docker.com/engine/reference/commandline/image_prune/

4.《docker volume prune》地址:https://docs.docker.com/engine/reference/commandline/volume_prune/

5.《docker network prune》地址:https://docs.docker.com/engine/reference/commandline/network_prune/

作者简介:
季向远,北京神舟航天软件技术有限公司。本文版权归原作者所有。

(转)Docker磁盘垃圾清理的更多相关文章

  1. docker磁盘空间清理办法

    docker磁盘空间清理办法 前段时间遇到docker磁盘空间太少,无法写入数据的问题.起因是因为我在本地(Mac Pro)运行了多个mysql容器,并且导入了一部分线上数据,最后还没导入完毕就已经没 ...

  2. ubuntu快速清理磁盘垃圾

    .快速清理磁盘垃圾 磁盘空间又不够用了?尝试在终端窗口中输入sudo apt-get autoremove然后输入sudo apt-get clean,前一个命令会卸载系统中所有未被使用的依赖关系,后 ...

  3. linux磁盘清理方法 Linux 下垃圾清理工具 BleachBit

    由于当初安装系统设计不合理,有些分区的过小,以及网络通讯故障等造成日志文件速度增长等其他原因都可以表现为磁盘空间满,造成无法读写磁盘,应用程序无法执行等.下面就给你支几招(以/home空间满为例): ...

  4. docker 磁盘清理 相关

    用户在使用 Docker 部署业务一段时间后,可能会发现宿主节点的磁盘容量持续增长,甚至将磁盘空间耗尽进而引发宿主机异常,进而对业务造成影响. 本文先对 Docker 的空间分析与清理进行说明,然后对 ...

  5. docker 容器大小查看及清理docker磁盘空间

    本文为博主原创,转载请注明出处: 今天打开服务器下载文件时,发现服务器内存不足,并开始清理服务器内存,排查及清理方法如下: 1. 查看服务器内存大小: df -h            通过 df - ...

  6. Docker磁盘空间分析与清理

    首先使用du命令逐层分析docker磁盘的使用情况: (base) [root@openvino docker]# du -h --max-depth=1 | sort 0 ./containerd ...

  7. Ubuntu 16.04 安装垃圾清理工具 BleachBit

    BleachBit 可以清理系统缓存文件, 清理磁盘垃圾. 首先下载最新版 deb安装包,默认下载到Downloads 中, 下载链接: https://www.bleachbit.org/downl ...

  8. Docker registry垃圾回收

    Docker registry垃圾回收 通过: docker run -p 5000:5000 -v /netdata/xxxx/registry:/var/lib/registry registry ...

  9. 给 Linux 系统“减肥”,系统垃圾清理_系统安装与配置管理_Linux Today - Google Chrome

    给 Linux 系统"减肥",系统垃圾清理  2013/10/16  linux  系统安装与配置管理  评论  15,555 Linux 计算机安装后,在我们不断的使用过程中,因 ...

随机推荐

  1. element split 将多个单号分隔

    const condeid = this.formData.WayBillCode; var item = ""; const codes = condeid.split(&quo ...

  2. VB.Net DataSet 填充資料庫內容

    '導入命名空間Imports System.Data.OleDb '定義變量 Dim ds As DataSet = New DataSet() Dim i, cn As Integer Dim Sq ...

  3. 【Java基础】2、Java中普通代码块,构造代码块,静态代码块区别及代码示例

    Java中普通代码块,构造代码块,静态代码块区别及代码示例.Java中普通代码块,构造代码块,静态代码块区别及代码示例 执行顺序:静态代码块>静态方法(main方法)>构造代码块>构 ...

  4. Java并发编程:线程池的使用(转载)

    转载自:https://www.cnblogs.com/dolphin0520/p/3932921.html Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实 ...

  5. Contest2075 - 湖南多校对抗(csu1576)大数 Catalan Square

    Problem C: Catalan Square Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 42  Solved: 16[Submit][Stat ...

  6. 基于mave的dubbo分别架构

    开始前,先看一下demo项目工程结构: 1.抽离接口 dubbo-api工程,根据业务抽离接口,deploy到mave nexus. public interface TestService { /* ...

  7. Jetbrains IDE 中 compass sass 设置

    环境 Ubuntu 13.10 1. 安装ruby sudo apt-get install ruby 如果后面安装 compass 时遇到安装失败,提示:“[Ubuntu] ERROR: Faile ...

  8. 【CF932E】Team Work(第二类斯特林数)

    [CF932E]Team Work(第二类斯特林数) 题面 洛谷 CF 求\(\sum_{i=1}^nC_{n}^i*i^k\) 题解 寒假的时候被带飞,这题被带着写了一遍.事实上并不难,我们来颓柿子 ...

  9. 小结:ES7——async和await初识

    一.async async其实是ES7才有有的关键字,async的意思是异步,顾名思义是有关异步的操作 async用于声明一个函数是异步的. 通常情况下async.await都是跟随promise一起 ...

  10. fetch发送Form Data请求并携带cookie

    今天我们来说说如何fetch发送Form Data请求并携带cookie,直接进入正题好吧,别问我今天为啥不在开始吹两句了,累到一句牛逼不想吹...... 步骤1: 设置头部,"Conten ...