docker配置device-lvm

本文详细介绍了Docker的devicemapper存储驱动,包括其背景、工作原理及配置方式,并对比了loop-lvm与direct-lvm两种模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

devicemapper介绍

Device Mapper是Linux系统中基于内核的高级卷管理技术框架。Docker的devicemapper存储驱动就是基于该框架的精简置备和快照功能来实现镜像和容器的管理。

注:Device Mapper是Linux的一种技术框架,而devicemapper是Docker Engine基于Device Mapper提供的一种存储驱动。

早期的Docker运行在Ubuntu和Debian Linux上并使用AUFS作为后端存储。Docker流行之后,越来越多的的公司希望在Red Hat Enterprise Linux这类企业级的操作系统上面运行Docker,但可惜的是RHEL的内核并不支持AUFS。

这个时候红帽公司出手了,决定和Docker公司合作去开发一种基于Device Mapper技术的后端存储,也就是现在的devicemapper。

devicemapper驱动将每一个Docker镜像和容器存储在它自身的具有精简置备(thin-provisioned)、写时拷贝(copy-on-write)和快照功能(snapshotting)的虚拟设备上。由于Device Mapper技术是在块(block)层面而非文件层面,所以Docker Engine的devicemapper存储驱动使用的是块设备来存储数据而非文件系统。

devicemapper的模式

devicemapper是RHEL下Docker Engine的默认存储驱动,它有两种配置模式:loop-lvm和direct-lvm。

loop-lvm是默认的模式,它使用OS层面离散的文件来构建精简池(thin pool)。该模式主要是设计出来让Docker能够简单的被”开箱即用(out-of-the-box)”而无需额外的配置。但如果是在生产环境的部署Docker,官方明文不推荐使用该模式。我们使用docker info命令可以看到以下警告:

WARNING: Usage of loopback devices is strongly discouraged for production use. Either use `–storage-opt dm.thinpooldev` or use `–storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning.

direct-lvm是Docker推荐的生产环境的推荐模式,他使用块设备来构建精简池来存放镜像和容器的数据。

前段时间有篇很不错的微信文章是关于老司机填devicemapper坑的血泪史,仔细研读之后发现老司机使用的是loop-lvm模式,那个坑有可能由此引起,最终老司机使用overlayfs的存储驱动解决了问题。

注:Linux内核在3.18以上才能支持overlayfs,但RHEL 7.2的内核版本为3.10,所以原生并不支持。但是的确有人在RHEL7.2上成功应用了overlayfs驱动,个人猜测可能是手动在内核里面加载了overlay的模块。

精简池介绍

这里写图片描述

精简资源调配是什么?

精简资源调配用于LVM以在精简池中创建虚拟磁盘。我们假定我服务器上有15GB的存储容量,而我已经有2个客户各自占去了5GB存储空间。你是第三个客户,你也请求5GB的存储空间。在以前,我们会提供整个5GB的空间(富卷)。然而,你可能只使用5GB中的2GB,其它3GB以后再去填满它。

而在精简资源调配中我们所做的是,在其中一个大卷组中定义一个精简池,再在精简池中定义一个精简卷。这样,不管你写入什么文件,它都会保存进去,而你的存储空间看上去就是5GB。然而,这所有5GB空间不会全部铺满整个硬盘。对其它客户也进行同样的操作,就像我说的,那儿已经有两个客户,你是第三个客户。

那么,让我们想想,我到底为客户分配了总计多少GB的空间呢?所有15GB的空间已经全部分配完了,如果现在有某个人来问我是否能提供5GB空间,我还可以分配给他么?答案是“可以”。在精简资源调配中,我可以为第四位客户分配5GB空间,即使我已经把那15GB的空间分配完了。

警告:从那15GB空间中,如果我们对资源调配超过15GB了,那就是过度资源调配了。

它是怎么工作的?我们又是怎样为客户提供存储空间的?

我已经提供给你5GB空间,但是你可能只用了2GB,而其它3GB还空闲着。在富资源调配中,我们不能这么做,因为它一开始就分配了整个空间。

在精简资源调配中,如果我为你定义了5GB空间,它就不会在定义卷时就将整个磁盘空间全部分配,它会根据你的数据写入而增长,希望你看懂了!跟你一样,其它客户也不会使用全部卷,所以还是有机会为一个新客户分配5GB空间的,这称之为过度资源调配。

但是,必须对各个卷的增长情况进行监控,否则结局会是个灾难。在过度资源调配完成后,如果所有4个客户都尽量写入数据到磁盘,你将碰到问题了。因为这个动作会填满15GB的存储空间,甚至溢出,从而导致这些卷下线。

配置device-lvm

当前服务器为centos7系统,磁盘分配如下

[root@node05 ~]# vgs
  VG #PV #LV #SN Attr   VSize   VFree
  cl   1   3   0 wz--n- 556.75g 4.00m

[root@node05 ~]# lvs
  LV   VG Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  home cl -wi-ao---- 475.37g                                                    
  root cl -wi-ao----  50.00g                                                    
  swap cl -wi-ao----  31.38g  

从home盘抽出115g给docker用

 lvreduce -L 360g /dev/cl/home
 [root@node05 ~]# vgs
  VG #PV #LV #SN Attr   VSize   VFree  
  cl   1   3   0 wz--n- 556.75g 115.37g

(扩展用lvextend,删除用lvremove)
创建LV并转换成精简卷

lvcreate  -n thinpool cl -L 90g
lvcreate  -n thinpoolmeta cl -L 10g
lvconvert -y --zero n -c 512K --thinpool cl/thinpool --poolmetadata cl/thinpoolmeta

疑问?

[root@node05 ~]# vgs
  VG #PV #LV #SN Attr   VSize   VFree
  cl   1   4   0 wz--n- 556.75g 5.37g

剩了5g空间,加上分配的thinpool 90+10=100g,还有10g左右的空间谁占用了?这个坑如果把握不好,lvconvert的时候会出现提示空间不够insufficient free space

修改配置文件,占用超过80%时自动扩展20%
vi /etc/lvm/profile/cl-thinpool.profile

activation {
    thin_pool_autoextend_threshold=80
    thin_pool_autoextend_percent=20
}

lvchange –metadataprofile cl-thinpool cl/thinpool
查看是否监视

[root@node05 ~]# lvs -o+seg_monitor
  LV       VG Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert Monitor  
  home     cl -wi-ao---- 360.00g                                                              
  root     cl -wi-ao----  50.00g                                                              
  swap     cl -wi-ao----  31.38g                                                              
  thinpool cl twi-a-t---  90.00g             0.00   0.01                             monitored

安装docker

yum install docker -y

创建/etc/sysconfig/docker-storage,内容如下

DOCKER_STORAGE_OPTIONS="--storage-driver devicemapper --storage-opt dm.fs=xfs --storage-opt dm.thinpooldev=/dev/mapper/cl-thinpool --storage-opt dm.use_deferred_removal=true --storage-opt dm.use_deferred_deletion=true"

启动docker

systemctl daemon-reload
systemctl start docker

到此结束

官网device-lvm配置
https://docs.docker.com/v1.12/engine/userguide/storagedriver/device-mapper-driver/

<think>好的,我需要帮助用户通过yum正确安装Docker及其相关组件。首先,我应该回顾用户提供的引用内容,特别是引用[1]和引用[2],因为它们直接涉及安装和卸载步骤。 首先,用户可能已经安装了旧版本的Docker,根据引用[2],必须先卸载旧版本。步骤包括停止Docker服务,用yum remove卸载相关软件包,并删除残留文件。所以,我应该建议用户先执行这些卸载步骤,确保系统干净。 接下来,安装新版本。引用[1]给出了两种安装方式:安装特定版本或最新版本。用户的问题中没有指定版本,所以应该默认推荐安装最新版本。命令是sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin。需要确保用户正确执行这条命令。 另外,引用[4]提到安装时可能出现公钥错误。这可能是因为缺少GPG密钥。解决方法应该是导入Docker的官方GPG密钥,或者在yum命令中添加--nogpgcheck选项。不过,推荐先导入密钥,因为禁用GPG检查可能有安全风险。因此,步骤中需要包括添加Docker仓库和导入密钥的步骤,这可能用户之前没做导致错误。 引用[3]提到安装docker-compose,但用户的问题中已经包含docker-compose-plugin,所以可能需要确认是否需要额外的步骤,但根据引用[1],安装docker-compose-plugin已经通过yum完成,所以可能不需要单独安装。 最后,安装完成后,启动并启用Docker服务,以及验证安装是否成功,这些步骤也是必要的。用户可能需要知道如何测试Docker是否正常工作。 需要确保所有步骤顺序正确:卸载旧版本 -> 安装依赖 -> 添加仓库 -> 安装 -> 启动服务 -> 验证。 可能遗漏的步骤是添加Docker的yum仓库,因为默认的CentOS仓库可能不包含Docker CE。因此,用户需要先设置Docker的官方仓库,这涉及到安装yum-utils包,添加仓库,并更新yum缓存。这些步骤在引用中没有提到,但根据Docker官方文档,这是必须的,否则用户可能找不到docker-ce等包。 综上,正确的步骤应该是: 1. 卸载旧版本Docker(引用[2]) 2. 安装必要依赖包(yum-utils等) 3. 添加Docker的yum仓库 4. 安装所需软件包(引用[1]) 5. 处理可能的GPG错误(引用[4]) 6. 启动并启用服务 7. 验证安装 需要将这些步骤详细写出,并注意可能的错误处理,比如公钥问题。</think>以下是通过yum命令安装Docker及相关组件的分步指南: ### 一、卸载旧版本(必须操作) 1. 停止Docker服务 ```bash sudo systemctl stop docker ``` 2. 卸载旧版本组件 ```bash sudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-engine docker-client docker-common ``` 3. 清理残留文件 ```bash sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd ``` 此步骤确保旧版本完全清除[^2] ### 二、安装前置依赖 1. 安装基础工具 ```bash sudo yum install -y yum-utils device-mapper-persistent-data lvm2 ``` 2. 添加Docker官方仓库 ```bash sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo ``` 3. 更新yum缓存 ```bash sudo yum makecache fast ``` ### 三、安装新版本组件 1. 安装最新版(推荐) ```bash sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin ``` 或安装指定版本: ```bash sudo yum install docker-ce-23.0.3-1 docker-ce-cli-23.0.3-1 containerd.io-1.6.22-3.1.el7 docker-buildx-plugin-0.10.5-1.el7 docker-compose-plugin-2.17.3-1.el7 ``` [^1] ### 四、处理GPG错误 若出现`Public key for XXXXXXX.rpm is not installed`错误: ```bash sudo rpm --import https://download.docker.com/linux/centos/gpg ``` 然后重试安装命令[^4] ### 五、启动服务 ```bash sudo systemctl start docker sudo systemctl enable docker ``` ### 六、验证安装 ```bash sudo docker run hello-world ``` 成功输出包含`Hello from Docker!`即表示安装完成
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值