CentOS系统故障 | 一桩"血案"引发的容器存储驱动比较
写在前面:
由于红帽在Linux界的影响力,相信很多朋友在测试和生产系统用的是RedHat或者CentOS系统,这次我在CentOS系统上遇到了一个很有意思的故障,通过这次故障的原因分析及解决,特意写了这篇文章分享给大家。
我们在CentOS上部署了一套Docker系统,运行了一段时间后,突然发现所有容器运行异常,同时宿主机内核报磁盘I/O错误:

看到问题的第一反映是查看磁盘状态和空间使用情况,发现系统的根目录已经用完:

我们知道,Docker默认的存储目录是在/var/lib/docker/下,同时我们也知道,可以通过使用-g, --graph=”/var/lib/docker” 参数修改Docker 默认存放路径。知道了问题后,我们可以通过挂载一个大硬盘到系统,并将Docker的目录更改为新挂载到硬盘上:

我将Docker的存储目录设置到刚才新增加的/data目录下,但是原来的镜像和容器都找不到了,因为路径改了。原来的镜像是在/var/lib/docker/devicemapper/devicemapper/{data,metadata},转移文件后继续运行Docker服务,这样我们就有了一个300G的大房子给Docker们用了。
大家以为事情到了这里就完结了么?其实我也想,但是我顺便折腾了一下,于是又发生了接下来的事情。说我手贱也好,瞎折腾也罢,导入一堆容器镜像和运行一堆容器后,系统又光荣告诉我所有的容器根目录全部变成了只读,宿主机内核同样报磁盘I/O错误,一开始我以为data目录又被写满了,但是用df –Th命令查看后,发现目录还有很多空间:

但是残酷的现实是,只用了不到一半的空间后,所有的容器就全部出现异常了,这是我祭出了经典三板斧:重启容器,重启Docker服务,重启服务器。然并卵,容器还是运行异常。通过在网上爬了一堆资料,在http://jpetazzo.github.io/2014/01/29/docker-device-mapper-resize/上查到,CentOS默认用的是Device Mapper作为容器的存储驱动的,大家可以用dockers info命令查看,Docker服务启动时默认会在/var/lib/docker/devicemapper/devicemapper/目录创建一个100G(由于1000和1024换算的关系,系统实际显示的是107.4G,其他数字亦同)的data文件,然后启动的容器的所有变更的数据全部保存到这个data文件中;也就是说当容器内产生的相关data数据超过100G后容器就再也没有多余的空间可用,从而导致所有容器的根目录变为只读!同时它会限制每个容器最大为 10GB。太坑爹了有木有,给了大房子只能用100G!

为了找到根本原因,我们需要了解Device Mapper存储驱动的原理: Device Mapper存储驱动是以精简配置的方式运行的,它实际上是目标块设备的快照。
Docker启动时会设置一个100G的sparse文件( /var/lib/docker/devicemapper/devicemapper/data,元数据为/var/lib/docker/devicemapper/devicemapper/metadata ),并将其作为Device Mapper的存储池,而所有容器都从该存储池中分配默认10G的存储空间使用,如下图所示:

当有实际读写后,这些存储块将在存储池中被标记为已使用(或者从池中拿走)。当实际读写的块容量大于池的容量时,容器的运行空间不足,所以报I/O错误。
Device Mapper存储驱动非常方便,你不需要做任何安装部署便可以使用:如创建额外的分区来存储 Docker 容器,或者建立LVM。然而它也有两个缺点:
• 存储池会有一个默认 100GB 的容量,满足不了大存储的需求。
• 它将会被稀疏文件所支持(精简配置,一开始基本不占用空间,只有当实际需要写的时候才会使用磁盘的存储块)但性能较差。
针对这些问题,有两个解决方案:
1. 使用更大的文件/磁盘/逻辑卷创建data文件:

2. 通过Docker启动参数的--storage-opt选项来限制每个容器初始化的磁盘大小,如-storage-opt dm.basesize=80G 这样每个容器启动后,根目录的总空间就是80G。
但是我总觉得这样的解决方式不够优雅,需要多步操作才能满足需求,同时,容器的空间还是被限制的,只是限制的大小变化而已。那有没有更好的办法呢? 让我们继续来爬资料,在Docker的官方网站上:
(https://docs.docker.com/engine/reference/commandline/dockerd/)

Docker在存储驱动方面支持 AUFS、Device Mapper、Btrfs、ZFS、 Overlay 、Overlay2等多址方式,现由于AUFS并未并入内核,目前只有Ubuntu系统上能够使用aufs作为docker的存储引擎,而在CentOS系统上默认使用Device Mapper,但是幸运的是,在Linux内核3.18.0以上的版本,是可以原生支持Overlay驱动方式的,Overlayfs跟AUFS很像,但是性能比AUFS好,有更好的内存利用。
Docker通过-s参数选择存储驱动, 通过-s=overlay,我们将存储驱动器设置为Overlay方式,再重启Docker应用。

大家可以看到,现在Docker已经是使用了OverlayFS(这里大家要注意,如果系统有存储的镜像和运行的容器,更改存储驱动后将都不可用,请先行备份)。
通过修改为OverlayFS,Device Mapper的存储池容量限制及单个容器运行最大空间限制统统没有了,同时Overlay的读写性能也好于Device Mapper,只需通过-s=overlay一个参数即可优雅的使用更好的文件系统来运行容器。
至此,容器运行时I/O错误的原因已经完美解决,希望这篇文章能帮到在使用过程中遇到相同问题的朋友。
CentOS系统故障 | 一桩"血案"引发的容器存储驱动比较的更多相关文章
- Centos 配置开机启动脚本启动 docker 容器
Centos 配置开机启动脚本启动 docker 容器 Intro 我们的 Centos 服务器上部署了好多个 docker 容器,因故重启的时候就会导致还得手动去手动重启这些 docker 容器,为 ...
- CentOS7更改Docker默认镜像和容器存储位置
图片出处:https://bobcares.com/wp-content/uploads/docker-change-directory.jpg 一.Why? 通常,当你开始使用docker时,我们并 ...
- CentOS 6.6下 BCM4312 802.11b/g无线网卡驱动安装
1.目前www.broadcom.com网站上最新版本为hybrid-v35,但此版本与2.6.32不匹配,无法识别验证密码,搜索网上说是要求升级内核,后根据http://www.dadclab.co ...
- kubernetes/k8s CSI分析-容器存储接口分析
更多 k8s CSI 的分析,可以查看这篇博客kubernetes ceph-csi分析,以 ceph-csi 为例,做了详细的源码分析. 概述 kubernetes的设计初衷是支持可插拔架构,从而利 ...
- docker容器存储
写在前面 我们在上篇学习了容器网络,对容器网络驱动bridge工作原理做了较为详细的介绍,今天小作文一起看看容器中另一个关键域-存储. 容器的存储可以分为两大类: 一种是与镜像相关的即我们在<d ...
- Longhorn 企业级云原生分布式容器存储-券(Volume)和节点(Node)
内容来源于官方 Longhorn 1.1.2 英文技术手册. 系列 Longhorn 是什么? Longhorn 云原生分布式块存储解决方案设计架构和概念 Longhorn 企业级云原生容器存储解决方 ...
- context-param引发spring容器以及servlet容器的关联
转自:http://blog.csdn.net/liaoxiaohua1981/article/details/6759206 格式定义: [html] view plaincopy <cont ...
- 阿里云CentOS 6.5 设备、执行Docker容器和步骤的方法
ssh阿里云计算落地ssh username@ip uname -a 查看linux内核版本号,由于Docker推荐使用3.8内核以上,设版本号低可能会不稳定,因此须要选用yum方式升级内核. 导入 ...
- 由上一个血案引发的关于property和attribute关系的思考
boss说,学习要刨根问底. 好的,开刨. 一.property和attribute在英语里有什么区别 看似没有区别.但其实大神说: property是 物体本身自带属性,不能改变的(一旦改了就是另外 ...
随机推荐
- Linux CentOS删除或重命名文件夹和文件的办法
Linux.CentOS操作系统下如何删除和重命名文件夹呢?办法如下: 一.Linux.CentOS下重命名文件和文件夹 mv:move 用移动文件命令就可以了,因为linux系统没有专门的重命名命令 ...
- Windows和linux环境下按文件名和字符串搜索命令
Windows 1.遍历C盘下所有txt 命令:for /r c:\ %i in (*.txt) do @echo %i 注释:for 循环的意思 /r 按照路径搜索 c:\ 路径 %i in ( ...
- VS2008 专业版试用到期破解 【转】
对于在win7内核下的vs2008破解,和在xp内核系统下的破解是不同的.传统(XP)的破解方式: 一.先安装试用版,然后在“添加或删除程序”里找到VS2008,点“更改/删除”就会看到一个输入序列号 ...
- SpringBoot系列——CORS(跨源资源共享)
前言 出于安全原因,浏览器禁止ajax调用当前源之外的资源(同源策略),我们之前也有写个几种跨域的简单实现(还在问跨域?本文记录js跨域的多种实现实例),本文主要详细介绍CORS,跨源资源共享,以及如 ...
- 职业生涯之完成OCM考试后的感想
背景知识:关于OCM认证,百科是这样描述的: Oracle Certified Master(OCM) 大师认证资质是Oracle认证的最高级别.此认证是对技术.知识和操作技能的最高级别的认可.Ora ...
- ZigBee按键中断
何为按键中断? 在了解按键中断之前,我们先来了解一下什么是中断?中断就是程序执行当前代码,当前任务的时候: 突然有自身函数或外部的影响,而使程序执行到别的任务再回来. 举个栗子: 当你在做饭的时候,电 ...
- JS代码实现复制功能
本人没什么基础看了好久百度,不知道为什么在百度上问一个js实现copy功能会多出那么多代码出来,感觉废话一堆效果还没能达到需要复制 的效果. 然而在我看来,js复制代码 无非就那么几句罢了.原生cop ...
- 关于Markdown编辑器的基本使用规则
@TOC 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页.如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown ...
- UVA663 Sorting Slides(烦人的幻灯片)
UVA663 Sorting Slides(烦人的幻灯片) 第一次做到这么玄学的题,在<信息学奥赛一本通>拓扑排序一章找到这个习题(却发现标程都是错的),结果用二分图匹配做了出来 蒟蒻感觉 ...
- Error:Failed to resolve: com.android.support:support-annotations:26.0.2
异常信息记录: Error:Failed to resolve: com.android.support:support-annotations:26.0.2 <a href="ins ...