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

典型问题场景

用户发现 Docker 宿主机的磁盘空间使用率非常高。通过 du 逐层分析,发现是 Volume 或 overlay2 等目录占用了过高空间。示例如下:

  1.  
    # 根据使用的存储驱动的不同,相应目录会有所不同:
  2.  
    [root@node3 docker]# du -h --max-depth=1 |sort
  3.  
    104K ./network
  4.  
    13M ./image
  5.  
    20K ./plugins
  6.  
    24G ./overlay2 # 这个目录占用了非常高的磁盘磁盘空间
  7.  
    25G .
  8.  
    283M ./volumes
  9.  
    4.0K ./swarm
  10.  
    4.0K ./tmp
  11.  
    4.0K ./trust
  12.  
    518M ./containers

空间使用分析

遇到此类问题,可以参阅如下步骤进行空间分析,定位占用过高空间的业务来源。

分析 Docker 空间分布

Docker 的内置 CLI 指令 docker system df ,可用于查询镜像(Images)、容器(Containers)和本地卷(Local Volumes)等空间使用大户的空间占用情况。 示例输出如下:

  1.  
    [root@node3 docker]# docker system df
  2.  
    TYPE TOTAL ACTIVE SIZE RECLAIMABLE
  3.  
    Images 17 12 2.713 GB 1.144 GB (42%)
  4.  
    Containers 15 12 10.75 GB 0 B (0%)
  5.  
    Local Volumes 8 4 282.9 MB 241.8 MB (85%)

查看空间占用细节

可以进一步通过 -v 参数查看空间占用细节,以确定具体是哪个镜像、容器或本地卷占用了过高空间。示例输出如下:

  1.  
    [root@node3 docker]# docker system df -v
  2.  
    # 镜像的空间使用情况
  3.  
    Images space usage:
  4.  
     
  5.  
    REPOSITORY TAG IMAGE ID CREATED SIZE SHARED SIZE UNIQUE SIZE CONTAINERS
  6.  
    busybox latest 6ad733544a63 5 days ago 1.129 MB 0 B 1.129 MB 1
  7.  
    nginx latest b8efb18f159b 3 months ago 107.5 MB 107.5 MB 0 B 4
  8.  
    ubuntu latest 14f60031763d 3 months ago 119.5 MB 0 B 119.5 MB 0
  9.  
    alpine 3.3 606fed0878ec 4 months ago 4.809 MB 0 B 4.809 MB 0
  10.  
    tutum/curl latest 01176385d84a 3 years ago 224.4 MB 0 B 224.4 MB 1
  11.  
     
  12.  
    # 容器的空间使用情况
  13.  
    Containers space usage:
  14.  
     
  15.  
    CONTAINER ID IMAGE COMMAND LOCAL VOLUMES SIZE CREATED STATUS NAMES
  16.  
    d1da451ceeab busybox "ping 127.0.0.1" 0 10.7 GB About an hour ago Up About an hour dstest
  17.  
    956ae1d241e8 nginx:latest "nginx -g 'daemon ..." 0 26 B 3 months ago Up 3 months localTest_restserver_2
  18.  
    74973d237a06 nginx:latest "nginx -g 'daemon ..." 0 2 B 3 months ago Up 3 months
  19.  
     
  20.  
    # 本地卷的空间使用情况
  21.  
    Local Volumes space usage:
  22.  
     
  23.  
    VOLUME NAME LINKS SIZE
  24.  
    83ba8747f4172a3c02a15f85b71e1565affca59f01352b4a94e0d28e65c26d1c 0 830 B
  25.  
    a479c303b278f1442f66644f694a554aac630e72b7a27065a11ef85c4d87b648 0 22.16 MB
  26.  
    79a25b6376e0d6587d8f4f24e08f9467981f04daad14bf3353a12d727d065503 1 18.83 MB

空间清理

自动清理

可以通过 Docker 内置的 CLI 指令 docker system prune 来进行自动空间清理。

Tips :

不同状态的镜像

  • 已使用镜像(used image): 指所有已被容器(包括已停止的)关联的镜像。即 docker ps -a 看到的所有容器使用的镜像。
  • 未引用镜像(unreferenced image):没有被分配或使用在容器中的镜像,但它有 Tag 信息。
  • 悬空镜像(dangling image):未配置任何 Tag (也就无法被引用)的镜像,所以悬空。这通常是由于镜像 build 的时候没有指定 -t 参数配置 Tag 导致的。比如:
  1.  
    REPOSITORY TAG IMAGE ID CREATED SIZE
  2.  
    <none> <none> 6ad733544a63 5 days ago 1.13 MB # 悬空镜像(dangling image)

挂起的卷(dangling Volume)
类似的,dangling=true 的 Volume 表示没有被任何容器引用的卷。

docker system prune 自动清理说明:

  • 该指令默认会清除所有如下资源:

    • 已停止的容器(container)
    • 未被任何容器所使用的卷(volume)
    • 未被任何容器所关联的网络(network)
    • 所有悬空镜像(image)。
  • 该指令默认只会清除悬空镜像,未被使用的镜像不会被删除。
  • 添加 -a 或 --all 参数后,可以一并清除所有未使用的镜像和悬空镜像。
  • 可以添加 -f 或 --force 参数用以忽略相关告警确认信息。
  • 指令结尾处会显示总计清理释放的空间大小。

操作示例:

  1.  
    [root@node3 docker]# docker system prune --help
  2.  
     
  3.  
    Usage: docker system prune [OPTIONS]
  4.  
     
  5.  
    Remove unused data
  6.  
     
  7.  
    Options:
  8.  
    -a, --all Remove all unused images not just dangling ones
  9.  
    -f, --force Do not prompt for confirmation
  10.  
    --help Print usage
  11.  
    [root@node3 docker]# docker system prune -a
  12.  
    WARNING! This will remove:
  13.  
    - all stopped containers
  14.  
    - all volumes not used by at least one container
  15.  
    - all networks not used by at least one container
  16.  
    - all images without at least one container associated to them
  17.  
    Are you sure you want to continue? [y/N] y
  18.  
    Deleted Containers:
  19.  
    c09c31c49491ee7f2324160e43947917940221b4e6cc1274906def640a7a631f
  20.  
    2aa0180e1a0f4c2c64349a6ed969651052373e7a9471050dce9015701cf1b957
  21.  
    6d18003b06823c5d76d807a319387b06680fc93d0a32bc29c1cea4c07e8d515d
  22.  
     
  23.  
    Deleted Volumes:
  24.  
    a479c303b278f1442f66644f694a554aac630e72b7a27065a11ef85c4d87b648
  25.  
    79a25b6376e0d6587d8f4f24e08f9467981f04daad14bf3353a12d727d065503
  26.  
     
  27.  
    Deleted Images:
  28.  
    untagged: tutum/curl:latest
  29.  
    untagged: tutum/curl@sha256:b6f16e88387acd4e6326176b212b3dae63f5b2134e69560d0b0673cfb0fb976f
  30.  
    deleted: sha256:01176385d84aeb1d40ed18c6d3f952abf40d2d2b4aa98fcf0a8a4b01010fb9a9
  31.  
    deleted: sha256:c84f85637212412c1d46d1dd50f789df2c3b44678ee3fee6a820888e734f9b5a
  32.  
    untagged: test:lastest
  33.  
    deleted: sha256:794ff09332586a091514eb3d1c44990244e57e34adc71d4b4334c0674a1377e9
  34.  
    deleted: sha256:636a1e7769d2242556243e9a21fb96bb878ab5b94c41ff485667252c968b375e
  35.  
     
  36.  
    Total reclaimed space: 1.565 GB

手工清理

网络清理

网络配置通常占用的空间非常低,略过。

镜像清理

如果通过 docker system df 分析,是镜像占用了过高空间。则可以根据业务情况,评估相关镜像的使用情况。对于悬空和未使用的镜像, 可以使用如下指令手工清理:

  1.  
    # 删除所有悬空镜像,但不会删除未使用镜像:
  2.  
    docker rmi $(docker images -f "dangling=true" -q)
  3.  
     
  4.  
    # 删除所有未使用镜像和悬空镜像。
  5.  
    # 【说明】:轮询到还在被使用的镜像时,会有类似"image is being used by xxx container"的告警信息,所以相关镜像不会被删除,忽略即可。
  6.  
    docker rmi $(docker images-q)

卷清理

如果通过 docker system df 分析,是卷占用了过高空间。则可以根据业务情况,评估相关卷的使用情况。对于未被任何容器调用的卷(-v 结果信息中,"LINKS" 显示为 0),可以使用如下指令手工清理:

  1.  
    # 删除所有未被任何容器关联引用的卷:
  2.  
    docker volume rm $(docker volume ls -qf dangling=true)
  3.  
     
  4.  
    # 也可以直接使用如下指令,删除所有未被任何容器关联引用的卷(但建议使用上面的方式)
  5.  
    # 【说明】轮询到还在使用的卷时,会有类似"volume is in use"的告警信息,所以相关卷不会被删除,忽略即可。
  6.  
    docker volume rm $(docker volume ls -q)

容器清理

如果通过 docker system df 分析,是某个容器占用了过高空间。则可以根据业务情况,评估相关容器的业务归属并进行处理。对于已停止或其它异常状态的容器,可以结合  -f 或 --filter 筛选器,使用类似如下指令来手工清理:

  1.  
    # 删除所有已退出的容器
  2.  
    docker rm -v $(docker ps -aq -f status=exited)
  3.  
    # 删除所有状态为 dead 的容器
  4.  
    docker rm -v $(docker ps -aq -f status=dead)

更多关于 ps 指令支持的筛选器信息,可以参阅官方文档

在用空间资源分析

对于还在使用的空间资源,可以参阅如下说明做进一步排查分析。

镜像空间分析

如果某个镜像占用了过高空间,则可以通过如下方式做进一步空间分析:

  1. 通过 docker system df 获取占用过高空间的镜像信息。
  2. 基于相应镜像创建测试容器。
  3. exec 进入容器后,结合 du 等 shell 指令做进一步空间分析,定位出占用最高空间的目录或文件。
  4. 结合业务情况做进一步处理,重新 build 镜像。

示例:

  1.  
    [root@node3]# docker exec -it dstest sh
  2.  
    / # du -h | head
  3.  
    8.0K ./root
  4.  
    32.0K ./etc
  5.  
    4.0K ./usr/sbin
  6.  
    8.0K ./usr
  7.  
    10.0G ./home/java/logs
  8.  
    10.0G ./home/java
  9.  
    10.0G ./home
  10.  
    1.1M ./bin
  11.  
    0 ./dev/shm
  12.  
    0 ./dev/mqueue

容器空间分析

如果某个运行中的容器占用了过高空间,则可以通过如下方式做进一步空间分析:

Tips :

容器的只读层与镜像层的空间占用情况
一个容器的占用的总空间,包含其最顶层的读写层(writable layer)和底部的只读镜像层(base image layer,read-only)。更多相关说明,可以参阅官方文档
可以通过 docker ps 的 -s 参数来分别显示二者的空间占用情况,进而判断相应容器的空间占用主要是来自原始镜像,还是运行中产生。


示例:

  1.  
    # 如下容器的原始镜像占用了 422MB 空间,实际运行过程中只占用了 2B 空间:
  2.  
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE
  3.  
    ac39128ccbc0 registry.aliyuncs.com/acs-sample/wordpress:4.6 "/entrypoint.sh ap..." 3 months ago Up 11 days 0.0.0.0:32779->80/tcp Web_web_4 2 B (virtual 422 MB)

容器空间占用的分析步骤:

    1. 通过 docker system df 获取占用过高空间的容器信息。
    2. 通过前述 -s 参数确认到底是底层镜像,还是运行过程中产生的数据占用了过高空间。
    3. exec 进入容器,结合 du 等 shell 指令做进一步空间分析,定位出占用最高空间的目录或文件。
    4. 结合业务情况做进一步处理。

docker 磁盘清理 相关的更多相关文章

  1. 查看和清理相关yum安装应用--例如docker包

    查看和清理相关yum安装应用--例如docker包 待办 https://blog.csdn.net/CSDN_duomaomao/article/details/78997138

  2. docker磁盘空间清理办法

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

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

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

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

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

  5. Windows Server 2012 为什么没有“磁盘清理”选项了?

    用习惯了客户端版的Windows,对于磁盘清理想必大家都不会陌生,他具有安全.快捷.准确.集中化的删除系统中的临时文件.管理系统还原卷影副本.添加删除程序的快捷入口等便捷功能,而在Server版的Wi ...

  6. (转) Delete/Truncate删除,释放表空间、降低高水位线、resize释放磁盘空间相关优化

    硬盘空间不足,打算删除数据库中的多余数据,但删除数据后,硬盘硬盘空间不能释放.[delete后用:alter table table_name move    truncate后用:alter tab ...

  7. docker磁盘空间不足解决办法

    docker磁盘空间不足解决办法 导入docker镜像时,错误提示:磁盘空间不足. 1.查看docker镜像存放目录空间大小 du -hs /var/lib/docker/ 2.停止docker服务. ...

  8. 如何在Windows Server 2008 R2没有磁盘清理工具的情况下使用系统提供的磁盘清理工具

    今天,刚好碰到服务器C盘空间满的情况,首先处理了临时文件和有关的日志文件后空间还是不够用,我知道清理C盘的方法有很多,但今天只分享一下如何在Windows Server 2008 R2没有磁盘清理工具 ...

  9. 如何给Windows Server 2012 R2 添加“磁盘清理”选项

    最近想做一个试验,把我的Windows Server 2008 R2 升级为Server 2012 R2,因为手头没有Raid卡和网卡的驱动,所以做了升级安装,于是那个讨厌的Windows.old出现 ...

随机推荐

  1. [mongoDB] mongoDb

    mongodb memcached redis        kv数据库(key/value) mongodb 文档数据库,存储的是文档(Bson->json的二进制化). 特点:内部执行引擎为 ...

  2. 尝试编写的rabbitmq+spring 框架

    spring有自己的一套框架与消息队列结合使用http://projects.spring.io/spring-amqp/,这个接下来会好好的研究一下. 在领导的帮助下,终于勉强写完了这个消息队列的框 ...

  3. Android targetSdkVersion 原理

    前几天 Google 官方发布文章解析 compileSdkVersion.minSdkVersion 以及 targetSdkVersion 的含义,以及合理设置各个值的意义,原文 Picking ...

  4. Adobe Photoshop CC 2015安装激活教程

    Adobe Photoshop CC 2015安装激活教程(附序列号) Adobe Photoshop CC 2015是Adobe针对旗下的创意云Creative Cloud 套装推出了2015年年度 ...

  5. Google Tango初学者教程

    Getting Started with the Tango Java API In this tutorial, we'll go through setting up your build env ...

  6. Linux 基础教程 31-tcpdump命令-3

        经过前面的学习,tcpdump的用法相信应该都掌握了,今天我们来学习对tcpdump输出内容的学习和了解.我们以第一个示例进行讲解如下所示: IP协议包分析 [root@localhost ~ ...

  7. 无线破解那点事(PJ)

    有一段时间没有写博客了.只能说苦逼学生党伤不起啊,还好没挂-废话不说了,近期将会讲讲无线PJ那点事,也不是啥干货,就一些先前的笔记分享把. 0.无线网卡 想要提高破解效率,一块猛一点的USB无线网卡是 ...

  8. 结巴net 分词 配置文件路径,在网站中的出现问题的解决

    用结巴分词net版,部署到网站上的时候,配置文件的地址为相对路径的时候会出现问题,绝对路径就没有问题. 原因是结巴源码中,取路径是取的应用程序的目录.如果是winform程序当然没有问题,在网站就不行 ...

  9. Unity3d中使用Lua

    对于手机游戏,如果可以在线更新以实现bug修复.新功能添加等等,其好处自不必多说. 通过C#的反射机制,也可以实现某种程度上的脚本级更新,具体可以参考 http://docs.unity3d.com/ ...

  10. unity 分数的显示

    通常 在完成 条件之后再增加分数 所以 一开始先增加 public int 得到分数; public Text 分数ui; 在完成条件后增加 得到分数++; 分数ui.text = 得到分数.ToSt ...