摘要:用了Docker,好处挺多的,但是有一个不大不小的问题,它会一不小心占用太多磁盘,这就意味着我们必须及时清理。

作为一个有信仰的技术公司,我们Fundebug的后台采用了酷炫的全Docker化架构,所有服务,包括数据库都运行在Docker里面。这样做当然不是为了炫技,看得清楚的好处还是不少的:

  • 所有服务器的配置都非常简单,只安装了Docker,这样新增服务器的时候要简单很多。
  • 可以非常方便地在服务器之间移动各种服务,下载Docker镜像就可以运行,不需要手动配置运行环境。
  • 开发/测试环境与生产环境严格一致,不用担心由于环境问题导致部署失败。

至少,上线这一年多来,Docker一直非常稳定,没有出什么问题。但是,它有一个不大不小的问题,会比较消耗磁盘空间。

如果Docker一不小心把磁盘空间全占满了,你的服务也就算玩完了,因此所有Docker用户都需要对此保持警惕。当然,大家也不要紧张,这个问题还是挺好解决的。

1. docker system命令

在谁用光了磁盘?Docker System命令详解中,我们详细介绍了docker system命令,它可以用于管理磁盘空间。

docker system df命令,类似于Linux上的df命令,用于查看Docker的磁盘使用情况:

docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              147                 36                  7.204GB             3.887GB (53%)
Containers          37                  10                  104.8MB             102.6MB (97%)
Local Volumes       3                   3                   1.421GB             0B (0%)
Build Cache                                                 0B                  0B

可知,Docker镜像占用了7.2GB磁盘,Docker容器占用了104.8MB磁盘,Docker数据卷占用了1.4GB磁盘。

docker system prune命令可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)。docker system prune -a命令清理得更加彻底,可以将没有容器使用Docker镜像都删掉。注意,这两个命令会把你暂时关闭的容器,以及暂时没有用到的Docker镜像都删掉了...所以使用之前一定要想清楚吶。

执行docker system prune -a命令之后,Docker占用的磁盘空间减少了很多:

docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              10                  10                  2.271GB             630.7MB (27%)
Containers          10                  10                  2.211MB             0B (0%)
Local Volumes       3                   3                   1.421GB             0B (0%)
Build Cache                                                 0B                  0B

2. 手动清理Docker镜像/容器/数据卷

对于旧版的Docker(版本1.13之前),是没有docker system命令的,因此需要进行手动清理。这里给出几个常用的命
删除所有关闭的容器

docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs docker rm

删除所有dangling镜像(即无tag的镜像):

docker rmi $(docker images | grep "^<none>" | awk "{print $3}")

删除所有dangling数据卷(即无用的volume):

docker volume rm $(docker volume ls -qf dangling=true)

Fundebug提供实时、专业的错误监控服务,为您的线上代码保驾护航,欢迎大家免费使用!

3. 限制容器的日志大小

有一次,当我使用1与2提到的方法清理磁盘之后,发现并没有什么作用,于是,我进行了一系列分析。

在Ubuntu上,Docker的所有相关文件,包括镜像、容器等都保存在/var/lib/docker/目录中:

du -hs /var/lib/docker/
97G    /var/lib/docker/

Docker竟然使用了将近100GB磁盘,这也是够了。使用du命令继续查看,可以定位到真正占用这么多磁盘的目录:

92G    /var/lib/docker/containers/a376aa694b22ee497f6fc9f7d15d943de91c853284f8f105ff5ad6c7ddae7a53

docker ps可知,nginx容器的ID恰好为a376aa694b22,与上面的目录/var/lib/docker/containers/a376aa694b22的前缀一致:

docker ps
CONTAINER ID        IMAGE                                       COMMAND                  CREATED             STATUS              PORTS               NAMES
a376aa694b22        192.168.59.224:5000/nginx:1.12.1            "nginx -g 'daemon off"   9 weeks ago         Up 10 minutes                           nginx

因此,nginx容器竟然占用了92GB的磁盘。进一步分析可知,真正占用磁盘空间的是nginx的日志文件。那么这就不难理解了。我们Fundebug每天的数据请求为百万级别,那么日志数据自然非常大。

使用truncate命令,可以将nginx容器的日志文件“清零”:

truncate -s 0 /var/lib/docker/containers/a376aa694b22ee497f6fc9f7d15d943de91c853284f8f105ff5ad6c7ddae7a53/*-json.log

当然,这个命令只是临时有作用,日志文件迟早又会涨回来。要从根本上解决问题,需要限制nginx容器的日志文件大小。这个可以通过配置日志的max-size来实现,下面是nginx容器的docker-compose配置文件:

nginx:image: nginx:1.12.1restart: alwayslogging:driver: "json-file"options:max-size: "5g"

重启nginx容器之后,其日志文件的大小就被限制在5GB,再也不用担心了~

4. 重启Docker

还有一次,当我清理了镜像、容器以及数据卷之后,发现磁盘空间并没有减少。根据Docker disk usage提到过的建议,我重启了Docker,发现磁盘使用率从83%降到了19%。根据高手指点,这应该是与内核3.13相关的BUG,导致Docker无法清理一些无用目录:

it's quite likely that for some reason when those container shutdown, docker couldn't remove the directory because the shm device was busy. This tends to happen often on 3.13 kernel. You may want to update it to the 4.4 version supported on trusty 14.04.5 LTS.

The reason it disappeared after a restart, is that daemon probably tried and succeeded to clean up left over data from stopped containers.

我查看了一下内核版本,发现真的是3.13:

uname -r
3.13.0-86-generic

如果你的内核版本也是3.13,而且清理磁盘没能成功,不妨重启一下Docker。当然,这个晚上操作比较靠谱。

参考

  • 谁用光了磁盘?Docker System命令详解
  • INTRODUCING DOCKER 1.13
  • Docker文档:docker system
  • Docker文档:json-file
  • Docker disk usage

关于Fundebug

Fundebug专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了6亿+错误事件,得到了Google、360、金山软件等众多知名用户的认可。欢迎免费试用!

版权声明

转载时请注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2018/01/10/how-to-clean-docker-disk/

如何清理Docker占用的磁盘空间?相关推荐

  1. Docker - 清理Docker占用的磁盘空间

    通过docker重新发布一个线上jar包时,报错如下: failed to copy files: failed to copy file: Error processing tar file(exi ...

  2. 如何清理Docker占用的磁盘空间? 1

    摘要:用了 Docker,好处挺多的,但是有一个不大不小的问题,它会一不小心占用太多磁盘,这就意味着我们必须及时清理. 作为一个有信仰的技术公司,我们Fundebug的后台采用了酷炫的全 Docker ...

  3. centos一键清理磁盘空间_如何清理 Docker 占用的磁盘空间

    Docker 很占用空间,每当我们运行容器.拉取镜像.部署应用.构建自己的镜像时,我们的磁盘空间会被大量占用. 如果你也被这个问题所困扰,咱们就一起看一下 Docker 是如何使用磁盘空间的,以及如何 ...

  4. /var/lib/docker/overlay2 占用很大,清理Docker占用的磁盘空间,迁移 /var/lib/docker 目录

    0  du -hs /var/lib/docker/ 命令查看磁盘使用情况. linlf@dacent:~$ sudo du -hs /var/lib/docker/ 237G /var/lib/do ...

  5. /var/lib/docker/overlay2 占用很大,清理Docker占用的磁盘空间

    博主半夜的时候收到客户的通知说系统崩溃了,于是去后台 df -h 当然后这是正常的disk usage, 之前/dev/vda1 , 所有的overlay全部100%. 网上很多误导说是overlay ...

  6. 清理微信占用大量磁盘空间

    1.打开微信选择"三-设置" 2.点击"文件管理",看见微信文件的默认保存位置,选择"打开文件夹" 3.找到C:\新建文件夹\WeChat ...

  7. [转帖]Docker 清理占用的磁盘空间

    Docker(二十七)-Docker 清理占用的磁盘空间 https://www.cnblogs.com/zhuochong/p/10076599.html docker system docker ...

  8. 清理 Docker 占用磁盘空间

    前言 Docker 容器跑久了,其产生的日志可能会占用比较多的空间,如果你跟我一样,使用的小水管级的服务器,很容易就爆了,此时就需要清理一下,今天恰巧遇到这种情况,具体如下图: 从上图可知,空间使用率 ...

  9. 【已解决】docker overlay2占用大量磁盘空间处理方法

    在使用docker容器的时候遇到了容量上的问题,做一个记录 处理方式1: 在使用docker时,往往会出现磁盘空间不足,导致该问题的通常原因是因为docker中部署的系统输出了大量的日志内容. 此时, ...

最新文章

  1. pytorch dropout用法
  2. POJ 3468 A Simple Problem with Integers (1)
  3. 注册表编辑器厘米爱你找不到mysql,win7系统中安装mysql后找不到服务或出现找不到指定文件的解决方法...
  4. .NET实时2D渲染入门·动态时钟
  5. php编译成二进制文件_2020年小米高级 PHP 工程师面试题
  6. 小程序 自定义遮照 mask 禁止上下滑动
  7. java开发_mysql中获取数据库表描述_源码下载
  8. 第 19 次 CCF CSP 认证 202006-4 1246(digits)
  9. 天翼短信 java_中国电信天翼开放平台自定义短信验证码和模板短信demo
  10. JDBC中的Statement和PreparedStatement的差别
  11. 计算机应用基础题excel,计算机应用基础专练习题excel.doc
  12. html在线取色,JS实现的RGB网页颜色在线取色器完整实例
  13. 自底向上和自顶向下的区别
  14. ecshop二次开发之模板整合
  15. scRNA-seq Course 学习
  16. 本地事务、分布式事务以及解决方案
  17. 2018厦门大学计算机技术分数线,厦门大学录取分数线2018 厦门大学录取分数最高的专业...
  18. 《一切都是最好的安排》之感想
  19. 使用get-pip.py 安装python2 的pip
  20. 一个简单的文本编辑器。(是在DEV C++下写的)

热门文章

  1. MDC机制实现日志的链路追踪
  2. Wireshark初步入门
  3. 循环队列(java)
  4. 删除共享登陆用户信息||无权访问共享资源解决方法
  5. linux 什么数据类型 8字节,linuxea:go数值类型(8)
  6. android select下拉列表_Python+selenium自动化之下拉列表操作(一)
  7. 《学习JavaScript数据结构与算法》 第四章笔记 栈
  8. html设置nav标签高度,html – Bootstrap带导航栏的100%高度
  9. Matt Speake
  10. c语言入门经典课后作业,C语言入门经典习题答案.doc