docker磁盘占用清理问题

2023-05-16

本文转自http://dockone.io/article/3056

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

【编者的话】用了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)
  

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.1
restart: always
logging:
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

转载于:https://www.cnblogs.com/yongan/p/10681737.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

docker磁盘占用清理问题 的相关文章

  • 数据分析实战(一):2019北大软微考研初试分析

    2019考研的初试成绩陆续放出 xff0c 也是几家欢喜几家愁 北大确实公平公正公开 xff0c 所有成绩 xff0c 排名在其研招网均能悉数找到 xff0c 下面选取了较为热门的北大软件与微电子学院考研初试成绩进行数据分析 导入excel
  • 程序员如何写项目经历

    对于程序员的简历来说 xff0c 简历的好坏可能影响着你能不能拿到满意的offer和薪资 xff0c 所以写一份高质量的简历 xff0c 突出自己技术能力非常重要 xff0c 就大家如何写简历中最重要的项目经历部分给出一些建议 了解项目的背
  • TypeError: iter() returned non-iterator of type ‘xxx‘

    最近在读 Python高级编程 xff08 Ziade著 xff09 xff0c 看到里面的自我设计的迭代器 xff1a 自己写的 xff1a span class token keyword class span span class t
  • memcpy与memmove函数的区别和实现

    1 函数定义 memcpy与memmove都是C语言的库函数 xff0c 在头文件string h中 xff0c 作用是内存拷贝 唯一的区别是 xff0c 当内存发生局部重叠时 xff0c memmove保证了拷贝的结果是正确的 xff0c
  • C语言strstr()函数用法-字符串查找

    1 函数定义 strstr 函数是一个参数为两个字符指针类型 xff0c 返回值是char 类型的函数 用于找到子串 xff08 str2 xff09 在一个字符串 xff08 str1 xff09 中第一次出现的位置 xff08 不包括s
  • "XXXX" is not translated in "en" (English), "zh" (Chinese)

    http www jianshu com p 39cd21451f06 Android Lint 34 XXXX 34 is not translated in 34 en 34 English 34 zh 34 Chinese 字数269
  • Qt之make: Nothing to be done for ‘first‘

    今天在修改了pro cpp h等文件 xff0c 重新编译时 xff0c 出现了标题所示的内容 如下图1所示 和同事讨论了一下 xff0c 主要有几个问题 xff0c 可能导致make不成功 1 xff09 工程文件内容没有变化 xff0c
  • cannot open shared object file: No such file or directory

    在一台Linux上编译库文件和执行文件后 xff0c 放到另一台Linux机器上 xff0c 执行报错 xff0c 显示 xff1a cannot open shared object file No such file or direct
  • C++ float转换int,四舍五入

    正常的float 转换为 int 的情况是采用去尾巴的方式 xff0c 也就是说去掉小数点后面的数值 1 常规的float 转换为 int xff1a 例如 xff1a 9 34 61 xff08 int xff09 9 xff1b 9 9
  • 如何隐藏QTabWidget中的一个tab

    QTabWidget 中的tab xff0c 采用hide xff0c close xff0c setHidden true xff0c setVisible false 等方式都无法隐藏tab 可以通过以下方式隐藏 ui gt tabWi
  • C++排序之stable_sort()的方法

    stable sort 可以对vector的某个成员进行排序 xff0c 而且可保证相等元素的原本相对次序在排序后保持不变 下面是该函数的实现方法代码 xff1a include lt iostream gt include lt math
  • QString和QDateTime之间的相互转换

    1 QDateTime 转换为QString QString strBuffer QDateTime time time 61 QDateTime currentDateTime strBuffer 61 time toString 34
  • QDateEdit日历修改之QCalendarWidget 样式设置

    1 QDateEdit控件显示日历 xff0c 需要用下面的setCalendarPopup true xff1b ui dateEdit gt setCalendarPopup true 2 日历样式的修改需要用到QCalendarWid
  • 解决ssh连接远程机器时提示“ssh_exchange_identification: Connection closed by remote host”或 Connection refused

    不少人在ssh连接远程机器时遇到过ssh exchange identification Connection closed by remote host的问题 xff0c 在网上找了一堆教程试了都不行 xff0c 博主总结了常见的几种解决
  • 百度地图POI数据获取并转为Excel文件

    查看全文百度地图POI数据获取并转为Excel文件
  • HAL库版STM32双轮自平衡车(四) ———— 原理图以及PCB绘制

    系列文章目录 HAL库版STM32双轮自平衡车 一 代码思路和PID基础精讲 HAL库版STM32双轮自平衡车 二 CubeMX的配置 原理图接线 物料准备 HAL库版STM32双轮自平衡车 三 代码精讲 HAL库版STM32双轮自平衡车
  • 关于VR的历史及发展

    寒假我看了关于一些虚拟现实的东西 xff0c 并在网上查获了一些资料 xff0c 作出以下归纳总结 xff1a 虚拟现实 xff0c 无法绕开它的历史 xff0c 最早可以追溯到公元前427年的古希腊时代 xff0c 当时的哲学家柏拉图在提
  • 机器人RPY角和Euler角 -- 基本公式

    参考 xff1a 机器人学 熊有伦等 编著 机械工业出版社 P36 P40 说明 xff1a 假设两个坐标系A和B xff0c 二者初始时完全重合 一 绕定轴X Y Z旋转 xff08 RPY角 xff09 过程如下 xff1a B绕A的X
  • solvepnp函数-世界坐标系

    一 二 世界坐标系是任意选定的 xff0c 可以任意事先定义 xff0c 然后给出每个特征点在世界坐标系下的三维坐标 xff0c 然后以一定顺序存储这些点 特征点的像素坐标 xff0c 一般是通过角点检测算法直接得到的 xff0c 角点检测
  • 【C++】STL-迭代器

    Iterator xff08 迭代器 xff09 模式又称游标 xff08 Cursor xff09 模式 xff0c 就是把不同集合类的访问逻辑抽象出来 xff0c 使得不用暴露集合内部的结构而达到循环遍历集合的效果 xff0c 而又不需

随机推荐

  • Windows11 + Linux子系统(ubuntu)体验(篇一)

    今年10月份微软发布了新一代的Windows系统 Windows11 xff0c 这距离上一代产品Windows10发布已经有6年之久 xff0c 打破了微软自Windows7之后每三年更新一代操作系统的传统 可以说这一代Win11是蓄势已
  • 喜获蚂蚁offer,定级p7,面经分享,万字长文带你走完面试全过程

    前言 在今天 xff0c 我收到了蚂蚁金服A级的实习录用offer 从开始面试到拿到口头offer xff08 四面技术 43 一面HR xff09 战线大约拉了半个月 xff0c 从拿到口头offer到收到正式录用邮件大概又是半个月 思前
  • C++中 #define的用法

    C 43 43 中 define的用法 转自 xff1a http www dingge com main article asp id 61 10 今天整理了一些 define的用法 xff0c 与大家共享 xff01 1 简单的defi
  • LeetCode的语言使用

    看来以后不能再用python来写算法的题目了 用python竟然是一种取巧的办法 xff0c 以后还是用C 43 43 来写吧 python里面有很多内置的库 xff0c 这也就导致掩盖了很多复杂的算法的特性 虽然在写代码的时候很简单 xf
  • Windows10安装Ubuntu16.04

    由于最近要在Ubuntu上面开发 xff0c 得安装一个Ubuntu的系统 xff0c 这些是很常见的安装 xff0c 但是也踩了一些坑 xff0c 下面记录下来 安装环境 Windows10Ubuntu16 04 基础理论 在安装的时候有
  • python 下划线 _ __ 开头的变量 详解

    在python中 xff0c 我们经常能看到很多变量名以 下划线开头 xff0c 而且下划线的数量还不一样 xff0c 那么这些变量的作用到底是什么 xff1f 变量名分类 xff1a 以数字 字母开头 xff1a 正常的公有变量名 a 6
  • 两个画图工具助力论文绘图

    欢迎关注笔者的微信公众号 如果使用matplotlib绘制论文图片时需要做非常多的设置 xff0c 字体 xff0c 大小 xff0c 间距 xff0c 多子图配置等 xff0c 而这些操作可以封装好从而简化用户工作量 Proplot对ma
  • 对自然数e的理解,推导(基础)

    对自然数e的理解 xff0c 推导 基础 在前面的博文 古典概型事件数计算 分房 xff0c 配对 xff0c 乱序 概统1 一文中 xff0c 已经写到了对e的理解 xff0c 在n把钥匙配n把锁的 乱序配对 问题中 xff0c 当n很大
  • 检验和算法

    1 CRC xff08 循环冗余码 校验和的算法为 xff1a 所有各字节的和模256的余 即各字节二进制算术和 xff0c 不计超过256的溢出值 xff08 即只取其和 的低8位数据 xff09 xff0c 然后用0x100减去这个算数
  • 我的四轴专用PID参数整定方法及原理---超长文慎入

    给四轴调了好久的PID xff0c 总算是调好了 xff0c 现分享 PID 参数整定的心得给大家 xff0c 还请大家喷的时候手下留情 首先说明一下 xff0c 这篇文章的主旨并不是直接教你怎么调 xff0c 而是告诉你这么调有什么道理
  • px4原生源码学习-(1)

    接触px4代码有几天了 xff0c 想把自己所学所想记录下来 px4就不过多介绍了 xff0c 算得上目前使用的最广泛的开源飞控了 为什么说 px4原生代码学习呢 xff0c 这还得追溯到被大疆干死的3DR xff0c 3DR想做消费级无人
  • px4原生源码学习-(2)--实时操作系统篇

    po上我使用到的硬件和开发环境 px4硬件 xff1a 某宝销量最高的pixhawk套件 xff08 主机 xff0c gps 43 指南针 xff0c 数传 xff0c pwm转pmm xff0c 安全开关 xff0c 蜂鸣器 xff0c
  • px4原生源码学习-(3)--Nuttx实时操作系统的使用

    po上我使用到的硬件和开发环境 px4硬件 xff1a 某宝销量最高的pixhawk套件 xff08 主机 xff0c gps 43 指南针 xff0c 数传 xff0c pwm转pmm xff0c 安全开关 xff0c 蜂鸣器 xff0c
  • 为单反拍摄照片批量加入地理位置信息(POS点)和EXIF信息

    很多航测朋友对于照片中没有POS点很是懊恼 xff0c 单反同飞控是分离的 xff0c 照片由单反生成 xff0c 而POS点的数据由飞控生成 对于后期数据处理相当不利 xff0c 尤其是目前对于倾斜摄影的朋友 xff0c 地理位置信息一定
  • 解决angular中的版本问题,Metadata version mismatch for module,found version 4, expected 3

    angular版本问题解决办法 xff1b 第一步 xff1a 查出错误模块的当前安装版本 以 ng bootstrap模块为例 npm list ng bootstrap 第二步 xff1a 查出所有版本号 npm view ng boo
  • python2.7爬取京东商品评论

    大神请绕路 xff0c 新手先别急着上车 我们先来了解一下京东商品评论的地址 xff0c 他们的客户评论看似是在商品页 xff08 item jd com xff09 xff0c 但实际上是在club jd com review 这个url
  • 进入docker容器的方法

    最近想着怎么进入到容器内部 xff0c 然后把里面的配置文件拷贝出来 xff0c 下面是一些操作记录 1 进入docker容器的方法 命令 xff1a docker exec it 容器id bin sh 进入容器后相当于进入了另外一个li
  • spring bean的循环引用

    看过一次spring公开课 xff0c 记录一下bean的循环引用问题 问题 public class IndexService 64 Autowired IndexDao indexDao public class IndexDao 64
  • Excel文本格式怎么出现小三角

    左上角的小三角是文本型数字标志 xff0c 将一列数值的左上角一次性加上绿色的三角标示 就是将常规或数值型的数字改变为文本格式数字 办法 xff1a 选定该列数据 xff0c 点菜单 数据 分列 xff0c 点两次 下一步 xff0c 在
  • docker磁盘占用清理问题

    本文转自http dockone io article 3056 如何清理Docker占用的磁盘空间 编者的话 用了Docker xff0c 好处挺多的 xff0c 但是有一个不大不小的问题 xff0c 它会一不小心占用太多磁盘 xff0c