Docker安装后默认在/var/lib/docker/devicemapper/devicemapper目录下生成data和metadata两个文件用于存放docker的数据,然而这种默认的loop-lvm挂载方式不适合生产环境使用,并且你也会收到docker的如下提示,生产环境应改为direct-lvm方式。
WARNING: devicemapper: usage of loopback devices is strongly discouraged for production use.
Use `--storage-opt dm.thinpooldev` to specify a custom block storage device.
以下是更改docker device mapper的方法
方法一: 允许Docker配置direct-lvm模式
编辑/etc/docker/daemon.json文件(如果该文件不存在则进行创建),参数表如下
dm.directlvm_device:块设备路径(必须)
dm.thinp_percent:块设备使用比率,默认95
dm.thinp_metapercent:元数据使用比率,默认1
dm.thinp_autoextend_threshold:自动扩容阈值,默认80
dm.thinp_autoextend_percent:自动扩容比率,20
dm.directlvm_device_force:强制格式化设备,默认false
以下为示例
{ "storage-driver": "devicemapper", "storage-opts": [ "dm.directlvm_device=/dev/xdf", "dm.thinp_percent=95", "dm.thinp_metapercent=1", "dm.thinp_autoextend_threshold=80", "dm.thinp_autoextend_percent=20", "dm.directlvm_device_force=false" ] }
重启docker以生效
sudo systemctl restart docker
方法二: 手工配置direct-lvm模式
停止docker服务
sudo systemctl stop docker
安装必要的软件包
sudo yum install -y device-mapper-persistent-data lvm2
创建pv,示例中/dev/sdb需改为对应物理卷
sudo pvcreate /dev/sdb
创建用于docker的vg
sudo vgcreate vgdocker /dev/sdb
创建两个lv,用于data和metadata,最后两个参数指定了该thin pool允许自动扩容能到达的VG百分比
sudo lvcreate --wipesignatures y -n thinpool vgdocker -l 95%VG sudo lvcreate --wipesignatures y -n thinpoolmeta vgdocker -l 1%VG
将lv转换为thin pool
sudo lvconvert -y --zero n -c 512K \ --thinpool vgdocker/thinpool \ --poolmetadata vgdocker/thinpoolmeta
修改自动扩容配置,其中thin_pool_autoextend_threshold为自动扩容阈值,thin_pool_autoextend_percent为每次扩容的比率
sudo cat <<EOF > /etc/lvm/profile/vgdocker-thinpool.profile activation { thin_pool_autoextend_threshold=80 thin_pool_autoextend_percent=20 } EOF
应用LVM profile
sudo lvchange --metadataprofile vgdocker-thinpool vgdocker/thinpool
启动lv监控来实现自动扩容
sudo lvs -o+seg_monitor
移动旧docker数据以便恢复
mkdir /var/lib/docker.bak mv /var/lib/docker/* /var/lib/docker.bak
修改/etc/docker/daemon.json(如果该文件不存在则进行创建)
{ "storage-driver": "devicemapper", "storage-opts": [ "dm.thinpooldev=/dev/mapper/vgdocker-thinpool", "dm.use_deferred_removal=true", "dm.use_deferred_deletion=true" ] }
启动docker服务
sudo systemctl start docker
确认已使用pool
docker info | grep Pool
确认无问题后删除旧docker数据
rm -rf /var/lib/docker.bak
逻辑卷的扩容
扩展vg,/dev/sdc为新加的物理卷
sudo vgextend docker /dev/sdc
扩展lv,并通过docker info命令确认扩容情况
sudo lvextend -l+100%FREE -n vgdocker/thinpool docker info
重启后的激活
若系统重启后发现docker无法启动,能需要使用以下命令重新激活lv
sudo lvchange -ay vgdocker/thinpool