所有文章

Docker - 配置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 配置就完成了

参考

LVM相关介绍


编写日期:2017-01-07