centos上安装的docker使用的后端存储为device-mapper(docker1.13为overlay),默认使用loopback的文件设备作为存储,在生产环节不推荐此种用法,需使用lvm卷作为docker后端存储,用以存放镜像及容器(容器与镜像的关系理解不同说法不同,作者这里为方便理解分开描述)的数据和元数据。下面是典型的docker存储示意图。
docker官方手册里明确提到用lvm块设备存储时推荐使用thinpool设备:
To make the best use of Docker with the devicemapper backend, you must have a recent version of LVM. Use lvm to create a thin pool.
关于thinpool设备的介绍可参考http://man7.org/linux/man-pages/man7/lvmthin.7.html
要使用lvm卷来作为docker存储,这需要在环境上用lvm创建一个thin pool,操作如下:
lvcreate -n pool0 -L 100G vgdocker 用于存储数据
lvcreate-n pool0meta -L 5G vgdocker 用于存储元数据vgdocker为单独创建的卷组,也可以使用已有的卷组,但要保证有足够空间
lvconvert --type thin-pool --poolmetadatavgdocker/pool0meta vgdocker/pool0 创建thin-pool(将两个lvm卷合并为thinpool,名字为第一个lvm卷的名字)
创建完的thin-pool会隐藏数据和元数据的存储卷,thin-pool的名字为数据卷的名字
[root@centos-78 ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log
root cl -wi-ao---- 46.99g
swap cl -wi-ao---- 2.00g
pool0 vgdocker twi-a-tz-- 100.00g 0.00 0.03使用lvs -a能看到隐藏的卷:
[root@centos-78 ~]# lvs -a
LV VG Attr LSize Pool Origin Data% Meta% Move Log root cl -wi-ao---- 46.99g
swap cl -wi-ao---- 2.00g
[lvol0_pmspare] vgdocker ewi------- 2.00g
pool0 vgdocker twi-a-tz-- 100.00g 0.00 0.03
[pool0_tdata] vgdocker Twi-ao---- 100.00g
[pool0_tmeta] vgdocker ewi-ao---- 2.00g配置docker使用thin-pool
1.systemctl stop docker
2.rm -rf /var/lib/docker/ 会删除docker镜像,需提前备份
3.vi /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --storage-optdm.thinpooldev=/dev/mapper/vgdocker-pool0
4.systemctl daemon-reload
5.systemctl restart docker
6.docker info查看是否使用thin pool
[root@centos-78 ~]# docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 2
Server Version: 1.12.6
Storage Driver: devicemapper
Pool Name: vgdocker-pool0
1. 手动扩容:
vgdocker空间充足的情况下(可以先扩vg:vgextend),直接执行如下命令进行扩容:
lvextend -L 102G /dev/mapper/vgdocker-pool0
lvextend -L 5G/dev/mapper/vgdocker-pool0_tmeta
然后重启下docker服务即可,还有一种自动扩容的配置,需要配置一些动作及扩容阈值等,
/etc/lvm/profile/docker-thinpool.profile
感兴趣可以查下相关资料。