Devicemapper作为graphdriver的docker中,容器镜像之间架构如下
Devicemapper的两个不同模式loop-lvm和direct-lvm区别就在于如何创建最底层的thin-pool
direct-lvm模式采用了LVM来创建thin-pool
LVM是 Logical VolumeManager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,它由Heinz Mauelshagen在Linux2.4内核上实现,基于device mapper,目前最新版本为:稳定版1.0.5,开发版1.1.0-rc2,以及LVM2开发版。Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地评估各分区大小,以分配合适的硬盘空间。普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存放不下某个文件时,这个文件因为受上层文件系统的限制,也不能跨越多个分区来存放,所以也不能同时放到别的磁盘上。而遇到出现某个分区空间耗尽时,解决的方法通常是使用符号链接,或者使用调整分区大小的工具,但这只是暂时解决办法,没有从根本上解决问题。随着Linux的逻辑卷管理功能的出现,这些问题都迎刃而解,用户在无需停机的情况下可以方便地调整各个分区大小。
指磁盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数。
类似于非LVM系统中的物理磁盘,其由一个或多个物理卷PV组成。可以在卷组上创建一个或多个LV(逻辑卷)。
类似于非LVM系统中的磁盘分区,逻辑卷建立在卷组VG之上。在逻辑卷LV之上可以建立文件系统(比如/home或者/usr等)。
类型有:cache-pool, raid1, snapshot, thin, orthin-pool、linear、striped、cache(lvmcache)、thin provisioning(lvmthin)、mirror等
每一个物理卷PV被划分为称为PE(PhysicalExtents)的基本单元,具有唯一编号的PE是可以被LVM寻址的最小单元。PE的大小是可配置的,默认为4MB。所以物理卷(PV)由大小等同的基本单元PE组成。
逻辑卷LV也被划分为可被寻址的基本单位,称为LE。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。
下图所示LVM抽象模型,展示了PV、VG、LV三者之间关系
LVM抽象模型
已有可跳过
$ yum installlvm2
在此之前需要停止docker服务:
$ service docker stop
且需要删除所有镜像和容器,有重要资料,请做好备份:
$ rm -rf /var/lib/docker/*
第一步:创建PV
可用空余硬盘或者硬盘中的分区进行创建PV,这些设备必须未正在被使用,创建之前先将这些设备用fdisk把id改为8e(lvm),效果如下,此处只使用sda5来创建PV
命令:
$ pvcreate /dev/sda5
创建完成:(pvdisplay)
第二步:创建VG
命令:
$ vgcreate docker /dev/sda5
“docker”为vg名,“/dev/sda5”为组成VG的PV路径
创建完成:(vgdisplay)
第三步:创建能够组成thin-pool的两个LV
命令:
$ lvcreate --wipesignaturesy -n thinpool docker -l 95%VG
$ lvcreate --wipesignaturesy -n thinpoolmeta docker -l 1%VG
第四步:根据上一步的两个LV创建thin-pool
命令:
$ lvconvert -y --zero n -c512K --thinpool docker/thinpool --poolmetadata docker/thinpoolmeta
以下步骤可选
第五步:配置thin-pool的自动扩展
修改lvm配置文件
$ vi/etc/lvm/profile/docker-thinpool.profile
如下:
activation{
thin_pool_autoextend_threshold=80
thin_pool_autoextend_percent=20
}
激活配置文件
$ lvchange --metadataprofiledocker-thinpool docker/thinpool
在此之前需要停止docker服务:
$ service dockerstop
服务 docker-storage-setup
可通过service docker-storage-setup status查看执行脚本和环境变量文件
执行脚本:/usr/bin/docker-storage-setup
环境变量文件:/etc/sysconfig/docker-storage-setup
第一种做法:
提供创建POOL的设备,可以是整块硬盘或分区,即在环境变量文件中加入
DEVS="/dev/sda5"
执行脚本:
$ service docker-storage-setup start
docker启动会自动执行该脚本,所以也可直接执行
$ service docker start
第二种做法:
已有VG,或者自行创建VG(手动创建thin-pool中有提到),因为有些linux在安装时分区模式选用了lvm,所以会存在已有VG
在环境变量文件中加入
VG="docker"
“docker”为已有的VG,可通过$vgdisplay查看
执行脚本:
$ service docker-storage-setup start
docker启动会自动执行该脚本,所以也可直接执行
$ service docker start
创建成功后会有:
在docker启动配置文件
/etc/sysconfig/docker-storage
中添加或修改:
DOCKER_STORAGE_OPTIONS=--storage-driverdevicemapper --storage-opt dm.fs=xfs --storage-opt dm.thinpooldev=/dev/mapper/docker-thinpool--storage-opt dm.use_deferred_removal=true
“/dev/mapper/docker-thinpool”为上述步骤中产生的thin-pool
修改完成后启动docker:
$ service docker start
成功后执行
$ docker info
会有如下