Docker修改Devicemapper存储驱动为Direct-lvm模式
一.说明
Device mapper是基于内核的框架,支持Linux上许多高级卷管理技术。Docker中devicemapper存储驱动程序利用此框架的精简配置和快照功能进行镜像和容器管理。
devicemapper驱动程序使用专用于Docker的块设备,并在块级而非文件级进行操作。这些设备通过将物理存储添加到Docker主机来扩展。并且比在操作I系统级别使用文件系统性能更好。
二.配置场景
系统版本:Centos7.1
内核版本:基于3.10.0-229升级至4.20版本
Docker版本:docker-ce 18.09.2版本
问题:这里由于Centos7.1系统默认安装时根文件系统是xfs类型,而且不支持d_type。由于在Docker中,无论是overlay还是overlay2,它们底层文件系统都是overlayfs文件系统。而overlayfs文件系统就会用到d_type。这里如果我们要用到docker的overlay2(xfs文件系统)需要开启d_type。
[root@k8s001 ~]# xfs_info /
meta-data=/dev/mapper/centos-root isize=256 agcount=4, agsize=3276800 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0 finobt=0 spinodes=0
data = bsize=4096 blocks=13107200, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal bsize=4096 blocks=6400, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
由上面可知,ftype=0,也就是说xfs文件系统不支持d-type。(如果是ftype=1,表示支持d_type)
这里我们介绍下xfs文件系统的d_type:
d_type是Linux内核的一个术语,表示"目录条目类型",而目录条目,其实是文件系统上目录信息的一个数据结构。d_type就是这个数据结构的一个字段,这个字段用来表示文件的类型,是文件还是管道,还是目录或套接字等。
d_type从Linux2.6内核开始已经支持,只不过虽然Linux内核支持,但有些文件系统实现了d_type,有些却没有实现,有些是选择性的实现。也就是需要用户自己用额外的参数来决定是否开启d_type的支持。
问题解决:这里由于系统已经安装好,且安装好的文件系统不支持d_type,这里要么重新安装Centos7.5以上的版本来支持d_type,要么选择devicemapper存储驱动。
三.devicemapper
这里我们选用devicemapper时,可以配置:
- loop-lvm模式
- direct-lvm模式
3.1 loop-lvm模式
默认Centos7下Docker使用的loop-lvm模式。后端为自动生成的稀疏文件:
[root@k8s001 ~]# ls -lsh /var/lib/docker/devicemapper/devicemapper/
total 3.5G
3.5G -rw------- 1 root root 100G Nov 13 11:00 data
4.6M -rw------- 1 root root 2.0G Nov 13 11:00 metadata
其中data(存放数据)和metadata(存放元数据),我们可以从输出来看,初始化默认配置为100G和2G大小,都是稀疏文件,使用多少占用多少。
Docker在初始化的过程中,会创建data和metadata这两个稀疏文件,并分别附加到回环设备/dev/loop0和/dev/loop1上,然后给予回环设备创建thin pool,默认一个container最大存放数据不超过10G。
[root@k8s001 ~]# docker info
Client:
Debug Mode: false
Server:
Containers: 16
Running: 6
Paused: 0
Stopped: 10
Images: 22
Server Version: 18.09.2
Storage Driver: devicemapper
Pool Name: docker-253:0-67339311-pool
Pool Blocksize: 65.54kB
Base Device Size: 10.74GB
Backing Filesystem: xfs
Udev Sync Supported: true
Data file: /dev/loop0
Metadata file: /dev/loop1
Data loop file: /var/lib/docker/devicemapper/devicemapper/data
Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
Data Space Used: 3.777GB
Data Space Total: 107.4GB
Data Space Available: 42.06GB
Metadata Space Used: 21.28MB
Metadata Space Total: 2.147GB
Metadata Space Available: 2.126GB
Thin Pool Minimum Free Space: 10.74GB
Deferred Removal Enabled: true
Deferred Deletion Enabled: true
Deferred Deleted Device Count: 0
Library Version: 1.02.149-RHEL7 (2018-07-20)
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc nvidia
Default Runtime: runc
Init Binary: docker-init
containerd version: b34a5c8af56e510852c35414db4c1f4fa6172339
runc version: 3e425f80a8c931f88e6d94a8c831b9d5aa481657
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 4.20.13-1.el7.elrepo.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 7.79GiB
Name: k8s001.wf
ID: DWXA:MYGC:6VKO:TIFS:UGTT:EG3E:UVVU:YUZ5:ZL36:HYX6:XTDE:SRZV
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
Product License: Community Engine
查看系统的块设备:
[root@k8s001 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop1 7:1 0 2G 0 loop
└─docker-253:0-67339311-pool 253:3 0 100G 0 dm
├─docker-253:0-67339311-03563554f7c7b1ca35c0023fbe6c4f67c62dcf6b5a45ef9a39dc693baff1b24e 253:8 0 10G 0 dm /var/lib/docker/devicemapper/mnt/03563554f7c7b1ca35c002
├─docker-253:0-67339311-c3321ce74e90d9df08793b808c79e1c637cfbfd7e70a74f55933b3f41a56e49a 253:6 0 10G 0 dm /var/lib/docker/devicemapper/mnt/c3321ce74e90d9df08793b
├─docker-253:0-67339311-216e260231a30f484a10a28288509819cf0c7492b27c3bf03394b1932cb637b3 253:4 0 10G 0 dm /var/lib/docker/devicemapper/mnt/216e260231a30f484a10a2
├─docker-253:0-67339311-379abc2c8d2e1f163592595b102fafef869e48c440f7da7b6591d55742640531 253:9 0 10G 0 dm /var/lib/docker/devicemapper/mnt/379abc2c8d2e1f16359259
├─docker-253:0-67339311-24229ad0cba2615ed61273d19673659483018bf7c674c0002f04c7492bf5b720 253:7 0 10G 0 dm /var/lib/docker/devicemapper/mnt/24229ad0cba2615ed61273
└─docker-253:0-67339311-fa5c09702c932d386cc618d54a90c261b4aac5d3e593dac7d60545957cee85e2 253:5 0 10G 0 dm /var/lib/docker/devicemapper/mnt/fa5c09702c932d386cc618
sr0 11:0 1 1024M 0 rom
loop0 7:0 0 100G 0 loop
└─docker-253:0-67339311-pool 253:3 0 100G 0 dm
├─docker-253:0-67339311-03563554f7c7b1ca35c0023fbe6c4f67c62dcf6b5a45ef9a39dc693baff1b24e 253:8 0 10G 0 dm /var/lib/docker/devicemapper/mnt/03563554f7c7b1ca35c002
├─docker-253:0-67339311-c3321ce74e90d9df08793b808c79e1c637cfbfd7e70a74f55933b3f41a56e49a 253:6 0 10G 0 dm /var/lib/docker/devicemapper/mnt/c3321ce74e90d9df08793b
├─docker-253:0-67339311-216e260231a30f484a10a28288509819cf0c7492b27c3bf03394b1932cb637b3 253:4 0 10G 0 dm /var/lib/docker/devicemapper/mnt/216e260231a30f484a10a2
├─docker-253:0-67339311-379abc2c8d2e1f163592595b102fafef869e48c440f7da7b6591d55742640531 253:9 0 10G 0 dm /var/lib/docker/devicemapper/mnt/379abc2c8d2e1f16359259
├─docker-253:0-67339311-24229ad0cba2615ed61273d19673659483018bf7c674c0002f04c7492bf5b720 253:7 0 10G 0 dm /var/lib/docker/devicemapper/mnt/24229ad0cba2615ed61273
└─docker-253:0-67339311-fa5c09702c932d386cc618d54a90c261b4aac5d3e593dac7d60545957cee85e2 253:5 0 10G 0 dm /var/lib/docker/devicemapper/mnt/fa5c09702c932d386cc618
sda 8:0 0 300G 0 disk
├─sda2 8:2 0 299.5G 0 part
│ ├─centos-swap 253:1 0 7.9G 0 lvm
│ ├─centos-home 253:2 0 241.6G 0 lvm /home
│ └─centos-root 253:0 0 50G 0 lvm /
└─sda1 8:1 0 500M 0 part /boot
由于loop-lvm模式从性能和稳定上来看都不可靠,这种模式仅适用于测试环境,不建议在生产环境使用。
3.2 direct-lvm模式
生产模式下,使用devicemapper存储驱动程序的主机必须使用direct-lvm模式,此模式使用块设备来创建精简池,这里使用loop-lvm设备更快,更有效的使用系统资源,并且块设备可以根据需要进行扩增。
3.2.1 配置direct-lvm模式
这里我们需要给系统添加一块磁盘,比如添加一块500G的数据盘。
- 停止Docker服务
[root@k8s001 ~]# systemctl stop docker
- 将整块硬盘创建物理卷
[root@k8s001 ~]# pvcreate /dev/sdb
- 创建dockervg的卷组(VG)
[root@k8s001 ~]# vgcreate dockervg /dev/sdb
- 创建thinpool逻辑卷
[root@k8s001 ~]# lvcreate --wipesignatures y -n thinpool -l 70%VG dockervg
[root@k8s001 ~]# lvcreate --wipesignatures y -n thinpoolmeta -l 5%VG dockervg
[root@k8s001 ~]# lvscan
ACTIVE '/dev/dockervg/thinpool' [<300.00 GiB] inherit
ACTIVE '/dev/centos/swap' [<7.88 GiB] inherit
ACTIVE '/dev/centos/home' [241.57 GiB] inherit
ACTIVE '/dev/centos/root' [50.00 GiB] inherit
- 转换成thinpool
[root@k8s001 ~]# lvconvert -y --zero n -c 512K --thinpool dockervg/thinpool --poolmetadata dockervg/thinpoolmeta
- 查看thinpool状态
[root@k8s001 ~]# lvs -o lv_name,data_percent,metadata_percent,lv_size,lv_metadata_size,data_lv,metadata_lv
LV Data% Meta% LSize MSize Data Meta
home 241.57g
root 50.00g
swap <7.88g
thinpool 1.63 0.29 <300.00g <6.00g [thinpool_tdata] [thinpool_tmeta]
说明:这里LSize为data的空间大小,MSize为Metadata的空间大小,Data为Data对应的逻辑卷,Meta为MetaData对应逻辑卷。
扩展thinpool(根据实际情况进行):
上面的sdb盘我们并没有将空间全部使用完,这里如果Metadata或Data空间不足时,我们可以进行扩容。例如:
# 扩容metadata的大小
[root@k8s001 ~]# lvresize -L +1G /dev/mapper/dockervg-thinpool_tmeta
# 扩容data的大小
[root@k8s001 ~]# lvresize -L +5G /dev/mapper/dockervg-thinpool
- 备份删除原Docker目录
[root@k8s001 ~]# mkdir /var/lib/docker_bak
[root@k8s001 ~]# mv /var/lib/docker/* /var/lib/docker_bak
- 修改Dokcer启动参数
[root@k8s001 ~]# cat /etc/docker/daemon.json
{
"storage-driver": "devicemapper",
"storage-opts": [
"dm.thinpooldev=/dev/mapper/dockervg-thinpool",
"dm.use_deferred_removal=true",
"dm.use_deferred_deletion=true"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "1m",
"max-file": "10"
}
}
- 重启docker服务
[root@k8s001 ~]# systemctl daemon-reload
[root@k8s001 ~]# systemctl start docker
- 验证
[root@k8s001 ~]# docker info
Client:
Debug Mode: false
Server:
Containers: 33
Running: 32
Paused: 0
Stopped: 1
Images: 22
Server Version: 18.09.2
Storage Driver: devicemapper
Pool Name: dockervg-thinpool
Pool Blocksize: 524.3kB
Base Device Size: 10.74GB
Backing Filesystem: xfs
Udev Sync Supported: true
Data Space Used: 5.244GB
Data Space Total: 322.1GB
Data Space Available: 316.9GB
Metadata Space Used: 18.67MB
Metadata Space Total: 6.438GB
Metadata Space Available: 6.42GB
Thin Pool Minimum Free Space: 32.21GB
Deferred Removal Enabled: true
Deferred Deletion Enabled: true
Deferred Deleted Device Count: 0
Library Version: 1.02.149-RHEL7 (2018-07-20)
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc nvidia
Default Runtime: runc
Init Binary: docker-init
containerd version: b34a5c8af56e510852c35414db4c1f4fa6172339
runc version: 3e425f80a8c931f88e6d94a8c831b9d5aa481657
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 4.20.13-1.el7.elrepo.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 8
Total Memory: 15.66GiB
Name: k8s001.wf
ID: 62JF:3A6E:R7BO:R3DM:OKT3:S5JQ:ITT4:64XG:USB4:SJDT:ZNM2:NNKB
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
Product License: Community Engine
Docker修改Devicemapper存储驱动为Direct-lvm模式的更多相关文章
- devicemapper存储驱动下镜像的存储
docker配置devicemapper存储驱动 #查看当前使用的存储驱动,默认为overlay docker info | grep -i storage #停止dockersystemctl st ...
- Docker的OverlayFS存储驱动
OverlayFS存储驱动 OverlayFS是一个现代的Union Filesystem,类似于AUFS,但速度更快,实现更简单.Docker为OverlayFS提供了两个存储驱动程序:overla ...
- [转帖]Docker五种存储驱动原理及应用场景和性能测试对比
Docker五种存储驱动原理及应用场景和性能测试对比 来源:http://dockone.io/article/1513 作者: 陈爱珍 布道师@七牛云 Docker最开始采用AUFS作为文件系统 ...
- Docker修改默认存储位置(转)
方法一.软链接 默认情况下Docker的存放位置为:/var/lib/docker 可以通过下面命令查看具体位置: sudo docker info | grep "Docker Root ...
- docker修改默认存储位置
前言:我这是默认安装的docker,所以其存放位置是/var/lib/docker,你可以发现是在/下面,之后你用docker 拉取的镜像文件也存放在这下面,这样就很快导致/空间爆满 1.修改配置文件 ...
- Docker 修改默认存储位置
首先使用 docker info 查看 docker 的基本信息 sudo docker info Containers: 0 Images: 5 Storage Driver: devicemapp ...
- Docker 修改默认存储路径的一个方法
1. 前期安装创建centOS的虚拟机时发现自己对linux的挂载点不清楚, 造成挂载点的分配不太均匀,如图: root / 节点的大小设置的比较小 /home路径设置的一直比较大 但是docker ...
- centos docker 修改默认存储路径
1.修改配置 将--graph /mnt/docker添加在docker.service文件中的ExecStart字段后面,其中/mnt/docker为你需要修改的存储目录 $ vim /usr/li ...
- Win10 Docker修改镜像存储位置
发生现象: 在windows10下安装docker for windows,随着用docker pull image文件后,C盘的容量越来越小了,你可能也有一种跟我一样的想法,想改变默认的安装路径,本 ...
- Docker存储驱动之Device Mapper简介
Device Mapper是一个基于kernel的框架,它增强了很多Linux上的高级卷管理技术.Docker的devicemapper驱动在镜像和容器管理上,利用了该框架的超配和快照功能.为了区别, ...
随机推荐
- mac brew 安装
Homebrew国内源 知乎文章地址:https://zhuanlan.zhihu.com/p/111014448 苹果电脑安装脚本: /bin/zsh -c "$(curl -fsSL h ...
- Supervisor-进程守护工具
前言 Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启.它是通过fork/exec的方式把这些被管理 ...
- MFC中AfxBeginThread、AfxEndThread、GetExitCodeThread的配合使用(工作者线程)
//线程入口函数(全局) UINT MyThreadProc(LPVOID pParam) { //在需要添加返回值的地方 if (...) { AfxEndThread(0); return 0; ...
- final关键字、Object类--java进阶day01
1.规则 被final修饰的变量,名称都要大写,多单词的名称则需_来分隔 1.修饰方法 method方法已经不能被重写了,因为修饰该方法的是final 2.修饰类 当一个类中所有的成员方法都不想被重写 ...
- Redis + Springboot + Mybatis插入数据时redis中uid为空
原因 插入时数据库的id会自增,bean对象无法自动生成uid 解决 在mybatis的插入方法中添加useGeneratedKeys属性 useGeneratedKeys 对于支持自动生成记录主键的 ...
- 神级辅助工具,解决GPT-SoVITS配音发音纠正和逐句优化
即使地表最强AI配音也无法自动识别360应配音成三百六十还是三六零,在长文配音中很难一次满意,总会因为个别几句配音不理想而毁掉整个配音成果. 在GPT-SoVITS配音中,自动把长文章拆分成段落或长句 ...
- adb常见命令及日志
一.adb介绍 1.adb(Android Debug Bridge)是android sdk的一个工具 2.adb是用来连接安卓设备和PC端的桥梁,用户可以通过adb在电脑上对手机进行一系列操作 3 ...
- Composer的常用命令和关于在哪儿查看composer可用包列表的问题
1.安装: composer的安装就不用多说了,官网下载,一路next 中途貌似要让选择php.exe的所在目录. 2.常用命令: 1).配置/取消国内镜像仓库 /*配置国内镜像*/ composer ...
- Java编程--抽象类和接口的区别
No. 区别 抽象类 接口 1 关键字 abstract class interface 2 组成 构造方法.普通方法.抽象方法.static方法.常量.变量 抽象方法.全局常量 3 子类使用 cla ...
- 使用DbUtils和dbcp连接池写的通用的CRUD工具类
目录 1 项目目录结构 2 工具类需要的jar包 2.1 Dbutils需要的jar包 2.2 dbcp需要的jar包 2.3 数据库jar包 3 代码部分 3.1 dbcp.properties 3 ...