系列文章目录
第一部分 基于devicemapper 文件存储驱动的docker根卷扩容
第二部分 基于overlay2 文件存储驱动的docker卷管理
文章目录
- 系列文章目录
- 前言
- 一、背景信息
- 二、扩容的方法
- 1.定位块设备布局
- 2.扩容loop块设备
- 3.扩容块设备pool池
- 4.扩容容器块设备
- 5.扩容容器的文件系统
- 总结
前言
使用过docker容器的同学,通常都会发现一个现象,就是随着docker不断运行docker 的存储目录(通常是/var/lib/docker)的磁盘占用会变得越来越大,然后慢慢的将宿主机的磁盘空间耗尽,引起整个宿主机层面的异常。为了避免这类问题发生,有没有一种方法可以管理每一个docker容器根卷的大小呢?
一、背景信息
某一天突然收到一条主机10.216.196.66的磁盘挂载点容量告警,使用率96%。显示是一个docker容器的根卷磁盘满了,那么问题来了,如何对这个容器的根卷进行扩容呢?
二、扩容的方法
1.定位块设备布局
执行命令lsblk
会发现有两个loop设备共同组成了一个 100G的pool,这个pool池上再创建了10个块设备,是不是和lvm 的卷组和逻辑卷很相似。
pool池只有100G,全部已经分给其上的块设备了,所有很明确接下来的扩容思路。
先扩容loop块设备—>再扩容块设备pool池—>然后扩容容器块设备—>最后扩容容器文件系统
2.扩容loop块设备
执行 docker info
,可以发现docker使用的2个loop 块设备文件的位置
查看两个块设备文件的大小,1个100G,1个2G,同时根据名称我们可以猜出一个设备文件是用来存放数据,另一个用来存放元数据。
所以我们先扩容这个存放数据的块设备文件大小
truncate -s 200G /app/docker/devicemapper/devicemapper/data
然后扩容对应的块设备loop0
losetup -c /dev/loop0
truncate 和losetup命令,平时使用的比较少,同学们需要了解一下。
3.扩容块设备pool池
扩容了loop块设备后容量后,pool池的大小是不会自动变大的。
执行下列命令扩容pool池,dmsetup 命令需要了解一下
[root@1a02vla4790zzzz xrdp]# dmsetup table docker-253:2-2418382912-pool
0 209715200 thin-pool 7:1 7:0 128 32768 1 skip_block_zeroing
[root@1a02vla4790zzzz xrdp]# dmsetup suspend docker-253:2-2418382912-pool
[root@1a02vla4790zzzz xrdp]# dmsetup reload docker-253:2-2418382912-pool --table '0 419430400 thin-pool 7:1 7:0 128 32768 1 skip_block_zeroing'
[root@1a02vla4790zzzz xrdp]# dmsetup resume docker-253:2-2418382912-pool
4.扩容容器块设备
先查看当前的devicemapper的映射表,找到和容量告警对应的表项
docker-253:2-2418382912-7671efe7635d7b91aa1d4af6a36f57b75f30519d664c85f07234928c0b1de94d
[root@1a02vla4790zzzz xrdp]# dmsetup table
docker-253:2-2418382912-6d43b2c2155a3e2f1684f5f239b32b74d5f9ca22d9b063ddb92feb53aaa08fe7: 0 20971520 thin 253:3 230
docker-253:2-2418382912-ebb0a7301ee0358050e05ba956b0beef9a2e946ef57a19fee4cf85aef591aeb9: 0 20971520 thin 253:3 223
docker-253:2-2418382912-54b103f895e6d47c19d2d18fc0780b6ebb3abe3d199f6341b274ef775f53158f: 0 20971520 thin 253:3 232
docker-253:2-2418382912-pool: 0 419430400 thin-pool 7:1 7:0 128 32768 1 skip_block_zeroing
docker-253:2-2418382912-7671efe7635d7b91aa1d4af6a36f57b75f30519d664c85f07234928c0b1de94d: 0 20971520 thin 253:3 228
docker-253:2-2418382912-72466918e8fb09e847bff790eed2ef8136bad0b421dba6abf2c2d46b3b13fadd: 0 20971520 thin 253:3 218
docker-253:2-2418382912-c9182440df9a5d2f6c6790c0f27588f27d52536fd9f80cc66eb1f6e50642a796: 0 20971520 thin 253:3 234
docker-253:2-2418382912-5a18ed310c58b1b6a5bc452efdce5d455f2f08a7dc26bda5fd17568da36c0b92: 0 20971520 thin 253:3 225
docker-253:2-2418382912-04cddc85788d23636120f90d59adbc42a858191b202d4baf3b0b9134132ecaca: 0 20971520 thin 253:3 216
docker-253:2-2418382912-fd2a43ebd427b56bfc0c54e8fef92fba59b5a6f42ca4da45e9dd6c8eec01d549: 0 20971520 thin 253:3 233
docker-253:2-2418382912-d4da1f6c1b15ae55bb873030468fd7bea7e7eff71ff6d8e3844eaeb89e73c526: 0 20971520 thin 253:3 222
VGapp-LVapp: 0 104849408 linear 252:4 2048
VGapp-LVapp: 104849408 1048567808 linear 252:16 2048
VGapp-LVapp: 1153417216 840949760 linear 252:32 2048
VolGroup00-LVswap: 0 8126464 linear 252:2 2048
VolGroup00-LVroot: 0 104865792 linear 252:2 8128512
VolGroup00-LVroot: 104865792 53739520 linear 252:3 2048
扩容这个容器块设备的大小
echo 0 41943040 thin 253:3 228 | dmsetup load docker-253:2-2418382912-7671efe7635d7b91aa1d4af6a36f57b75f30519d664c85f07234928c0b1de94d
dmsetup resume docker-253:2-2418382912-7671efe7635d7b91aa1d4af6a36f57b75f30519d664c85f07234928c0b1de94d
5.扩容容器的文件系统
xfs_growfs /dev/mapper/docker-253:2-2418382912-7671efe7635d7b91aa1d4af6a36f57b75f30519d664c85f07234928c0b1de94d
ext4文件系统使用resize2fs 命令进行扩容
扩容之后使用df 查看就已经是新的大小了。
总结
Devicemapper 是 Linux 内核提供的框架,从 Linux 内核 2.6.9 版本开始引入,Devicemapper 与 AUFS 不同,AUFS 是一种文件系统,而Devicemapper 是一种映射块设备的技术框架。
Devicemapper 提供了一种将物理块设备映射到虚拟块设备的机制,目前 Linux 下比较流行的 LVM (Logical Volume Manager 是 Linux 下对磁盘分区进行管理的一种机制)和软件磁盘阵列(将多个较小的磁盘整合成为一个较大的磁盘设备用于扩大磁盘存储和提供数据可用性)都是基于 Devicemapper 机制实现的。
那么docker文件存储驱动,基于块设备和基于文件系统的两种实现方式,他们的区别或者说性能上谁优谁劣呢?