配置direct-lvm
关于 Docker 存储引擎
在 CentOS 上安装 Docker 时,默认的存储方式为 devicemapper,而 devicemapper 又有两种模式,默认为 loop-lvm,也就是挂载 loop 设备的方式,在安装 Doccker 后,它会挂载两个 loop 设备用作存储,这两个 loop 设备对应 Docker 安装目录下的两个文件,如下:
[user@ser0 ~]$ sudo losetup -a
/dev/loop0: [64770]:2164801071 (/var/lib/docker/devicemapper/devicemapper/data)
/dev/loop1: [64770]:2164801072 (/var/lib/docker/devicemapper/devicemapper/metadata)
看下它们的大小:
[user@ser0 ~]$ sudo ls -hls /var/lib/docker/devicemapper/devicemapper/
total 52G
52G -rw-------. 1 root root 100G Jan 7 07:28 data
54M -rw-------. 1 root root 2.0G Jan 7 15:28 metadata
它的优点是不用过多配置,开箱即用,但性能很差,默认可使用的空间是100G,在使用时有各种问题,官方不推荐这种方式用在生产中,另一种方式是direct-lvm,性能好且稳定,本文将介绍如何配置它。
基本原理
准备一块单独的磁盘给Docker存储用,逻辑物理均可,用lvm2工具将这块磁盘分为两个逻辑卷,再将这两个逻辑卷转换成thin pool类型,然后配置给Docker。
开始配置
查看当前存储引擎:
[user@ser0 ~]$ sudo docker info
...
Server Version: 1.12.1 Storage Driver: devicemapper
Pool Name: docker-253:2-6442838537-pool # 这里表示当前是loop-lvm模式
Pool Blocksize: 65.54 kB
Base Device Size: 53.69 GB
Backing Filesystem: xfs
Data file: /dev/loop0
Metadata file: /dev/loop1
Data Space Used: 55.5 GB
Data Space Total: 107.4 GB # 默认只有100G可用空间,届时将无法创建容器
Data Space Available: 51.88 GB
Metadata Space Used: 33.37 MB
Metadata Space Total: 2.147 GB
Metadata Space Available: 2.114 GB
Thin Pool Minimum Free Space: 10.74 GB
Udev Sync Supported: true
...
查看磁盘使用情况
[user@ser0 ~]$ sudo df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root xfs 50G 842M 50G 2% /
devtmpfs devtmpfs 63G 0 63G 0% /dev
tmpfs tmpfs 63G 0 63G 0% /dev/shm
tmpfs tmpfs 63G 8.8M 63G 1% /run
tmpfs tmpfs 63G 0 63G 0% /sys/fs/cgroup
/dev/sda2 xfs 497M 123M 374M 25% /boot
/dev/mapper/centos-home xfs 5.5T 33M 5.5T 1% /home
tmpfs tmpfs 13G 0 13G 0% /run/user/0
看来有一块磁盘是专门用来做数据分区的,即/dev/mapper/centos-home,而且来没有被使用,那我们就用它来配置 Docker 的 direct-lvm模式 了
停掉 Docker服务,如果本机上有镜像的话,先push到 Docker Hub 或者自的私有仓库中,容器当然也一样。
sudo systemctl stop docker
卸载逻辑卷
sudo umount /home
删除逻辑卷,请一定备份好数据
[user@ser0 ~]$ sudo lvdisplay
...
--- Logical volume ---
LV Path /dev/centos/home
LV Name home
VG Name centos
LV UUID l0j4kt-eOu4-1fSh-WIqU-X4mN-SAmj-ThdaNO
LV Write Access read/write
LV Creation host, time localhost, 2017-01-05 00:35:37 +0800
LV Status available
$ sudo open 1
LV Size 5.40 TiB
Current LE 1416435
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:2
...
这里看到它属于cetnos这个VG,然后删除它:
sudo lvremove /dev/centos/home
这时进入 /etc/fstab 查看 /dev/centos/home 这一行在不在了,如果还在,一定将 /dev/centos/home 这一行注释掉,否则系统将无法启动!!
VG空间剩余量:
[user@ser0 ~]$ sudo vgdisplay
--- Volume group ---
VG Name centos
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 21
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 4
Open LV 3
Max PV 0
Cur PV 1
Act PV 1
VG Size 5.46 TiB
PE Size 4.00 MiB
Total PE 1430274
Alloc PE / Size 1430222 / 5.46 TiB
Free PE / Size 1410256 / 5.30 TiB
VG UUID W6gHFG-SVtL-wdck-amUk-SRHL-ct7h-Zv70Pd
这里看到刚才那LV的容量都归centos这个VG了
创建thin pool
用centos中剩余的空间创建两个LV
sudo lvcreate --wipesignatures y -n thinpool -l 90%VG centos
sudo lvcreate --wipesignatures y -n thinpoolmeta -L 2G centos
将两个 LV 合并为 thin pool
sudo lvconvert -y --zero n -c 512K --thinpool centos/thinpool --poolmetadata centos/thinpoolmeta
配置thin pool
[user@ser0 ~]$ sudo vi /etc/lvm/profile/docker-thinpool.profile
activation{
thin_pool_autoextend_threshold=80
thin_pool_autoextend_percent=20
}
使配置生效
sudo lvchange --metadataprofile docker-thinpool centos/thinpool
查看 thinpool 是否能监视到状态
[user@ser0 ~]$ sudo lvs -o+seg_monitor
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
data centos -wi-ao---- 469.00g
root centos -wi-ao---- 50.00g
swap centos -wi-ao---- 31.50g
thinpool centos twi-a-t--- 4.91t 0.00 0.07
修改Docker配置
[user@ser0 ~]$ sudo vi /usr/lib/systemd/system/docker.service
...
ExecStart=/usr/bin/dockerd \
--storage-driver=devicemapper \
--storage-opt=dm.thinpooldev=/dev/mapper/centos-thinpool \
--storage-opt=dm.use_deferred_removal=true \
--storage-opt=dm.use_deferred_deletion=true
ExecReload=/bin/kill -s HUP $MAINPID
...
启动Docker服务,如果有以前的镜像数据必须删掉,所以先备份以前的数据:
sudo mv /var/lib/docker /var/lib/docker.bak
sudo systemclt start docker
查看当前存储引擎:
[user@ser0 ~]$ sudo docker info
...
Server Version: 1.12.5
Storage Driver: devicemapper
Pool Name: centos-thinpool # 这里是我们刚才创建的LV逻辑盘
Pool Blocksize: 524.3 kB
Base Device Size: 10.74 GB
Backing Filesystem: xfs
Data file:
Metadata file:
Data Space Used: 19.92 MB
Data Space Total: 5.399 TB # 总大小也变了
Data Space Available: 5.399 TB
Metadata Space Used: 2.916 MB
Metadata Space Total: 4.295 GB
Metadata Space Available: 4.292 GB
Thin Pool Minimum Free Space: 539.9 GB
Udev Sync Supported: true
...
到这里 direct-lvm 配置就完成了