docker+DeviceMapper方案
预备
devicemapper
要求需要安装 lvm2和 device-mapper-persistent-data- 切换容器存储驱动,需要使用docker save -o 机器镜像 ,然后push 镜像到docker Hub或者私有仓库
配置DeviceMapper作为docker存储驱动
配置loop-lvm模式(测试环境)
loop-lvm模式利用loopback机制,该机制该允许将本地磁盘上的文件读取和写入就像一个实际的物理磁盘或块设备。然而loopback机制,与操作系统文件系统的交互层,意味着可以缓慢,资源密集型的IO操作。使用loopback也可以引入竞争条件。然而,建立loop-lvm模式可以帮助识别基本问题(如丢失的用户空间包、内核驱动程序等)之前,尝试启用direct-lvm模式所需的更复杂的设置。loop-lvm模式应只用于配置direct-lvm之前执行基本的测试。
-
停止docker
systemctl stop docker
-
配置/etc/docker/daemon.json
{ "storage-driver": "devicemapper" }
-
启动docker
systemctl start docker
配置direct-lvm模式(生产环境)
生产环境使用devicemapper存储驱动必须使用direct-lvm模式。这个模式使用块设备创建thin pool。这种模式速度比loopback 使用系统资源更有效率,块设备可以根据需要增加。
direct-lvm配置选项:
{
/etc/daemon.json配置示例:
{
"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"
]
}
-
确定使用的块设备(/dev/xxx,例如/dev/xvdf)
-
停止docker
-
安装
- RHEL / CentOS:
device-mapper-persistent-dat,
lvm2以及所有依赖
- Ubuntu / Debian / SLES 15:
thin-provisioning-tools
,lvm2
以及所有依赖
- RHEL / CentOS:
-
使用步骤1块设备创建物理逻辑卷
pvcreate /dev/xvdf
-
创建docker卷组
sudo vgcreate docker /dev/xvdf
-
创建两个逻辑卷thinpool 和thinpoolmeta。最后一个参数指定剩余空间以便为了数据或元数据自动扩展。如果空间运行低,作为一个暂时的权宜之计。这是推荐的值。
sudo lvcreate --wipesignatures y -n thinpool docker -l 95%VG sudo lvcreate --wipesignatures y -n thinpoolmeta docker -l 1%VG
-
转换卷为一个thin pool和一个存储medata的pool
sudo lvconvert -y \ --zero n \ -c 512K \ --thinpool docker/thinpool \ --poolmetadata docker/thinpoolmeta
-
配置autoextension thin pool
sudo vi /etc/lvm/profile/docker-thinpool.profile
-
指定thin_pool_autoextend_threshold和 thin_pool_autoextend_percent值
activation { thin_pool_autoextend_threshold=80 thin_pool_autoextend_percent=20 }
-
应用lvm profile文件
sudo lvchange --metadataprofile docker-thinpool docker/thinpool
-
确保启用监视逻辑卷
sudo lvs -o+seg_monitor sudo lvchange --monitor y docker/thinpool
-
如果你曾经在这个主机上运行Docker,,或者如果/var/lib/docker/已经存在,移动该目录,使用新的LVM池存储镜像和容器的内容
sudo su - mkdir /var/lib/docker.bk mv /var/lib/docker/* /var/lib/docker.bk exit
-
编辑/etc/docker/daemon.json,添加devicemapper需要的参数选项:
{ "storage-driver": "devicemapper", "storage-opts": [ "dm.thinpooldev=/dev/mapper/docker-thinpool", "dm.use_deferred_removal=true", "dm.use_deferred_deletion=true" ] }
-
启动docker
systemctl start docker
-
查看docker使用新的配置
docker info
-
如果确定配置无误,可以删除/var/lib/docker.bk目录
rm -rf /var/lib/docker.bk
管理devicemapper
-
监控thin pool
使用lvs或者lvs -a监控剩余空间
sudo journalctl -fu dm-event.service
-
扩容运行磁盘
-
设置loop-lvm thin pool
-
设置loop-lvm thin pool可以使用device_tool,也可以使用操作系统工作替代
device_tools.go工具仓库
moby/contrib/docker-device-tool at master · moby/moby
- 手动编译工具,使用contrib/docker-device-tool
-
使用这个工具,设置thin pool 大小到200G
./device_tool resize 200GB
-
-
更新操作系统
- 设置direct-lvm this pool
-
收集卷组信息
sudo pvdisplay |grep 'VG Name'
-
扩展新的块设备
sudo vgextend docker /dev/xvdg
-
扩展/docker/thinpool 逻辑卷,这个命令会立即使用100%的空阿金,不会自动扩展。扩展metadata,使用docker/thinpool_meta
sudo lvextend -l+100%FREE -n docker/thinpool
-
使用docker info 查看新 thin pool的大小
Storage Driver: devicemapper Pool Name: docker-thinpool Pool Blocksize: 524.3 kB Base Device Size: 10.74 GB Backing Filesystem: xfs Data file: Metadata file: Data Space Used: 212.3 MB Data Space Total: 212.6 GB Data Space Available: 212.4 GB Metadata Space Used: 286.7 kB Metadata Space Total: 1.07 GB Metadata Space Available: 1.069 GB
-
-
重启后激活devicemapper
如果您重新启动主机,发现, docker服务启动失败,“Non existing device”。你需要重新激活的逻辑卷命令:
sudo lvchange -ay docker/thinpool
-
检查devicemapper 工作
- lsblk
mount |grep devicemapper /dev/xvda1 on /var/lib/docker/devicemapper type xfs (rw,relatime,seclabel,attr2,inode64,noquota)