Centos-7 + Docker-1.12 中 devicemapper + direct_lvm 的 Docker 存储配置

html,body { font-size: 12pt }
body { font-family: Helvetica, "Hiragino Sans GB", "微软雅黑", "Microsoft YaHei UI", SimSun, SimHei, arial, sans-serif; line-height: 1.6; margin: 0 auto; padding: 1.25rem 1rem }
h1,h2,h3,h4,h5,h6 { margin: 1.25rem 0 0.625rem; padding: 0; font-weight: bold }
h1 { font-size: 1.67rem }
h2 { font-size: 1.5rem }
h3 { font-size: 1.25rem }
h4 { font-size: 1.17rem }
h5 { font-size: 1rem }
h6 { font-size: 1rem; color: #777777; margin: 1rem 0 }
div,p,ul,ol,dl,li { margin: 0 }
blockquote,table,pre,code { margin: 8px 0 }
ul,ol { padding-left: 2rem }
ol.wiz-list-level1>li { list-style-type: decimal }
ol.wiz-list-level2>li { list-style-type: lower-latin }
ol.wiz-list-level3>li { list-style-type: lower-roman }
blockquote { padding: 0 0.75rem }
blockquote>:first-child { margin-top: 0 }
blockquote>:last-child { margin-bottom: 0 }
img { border: 0; max-width: 100%; height: auto !important; margin: 2px 0 }
table { border-collapse: collapse; border: 1px solid #bbbbbb }
td,th { padding: 4px 8px; border-collapse: collapse; border: 1px solid #bbbbbb; min-height: 28px }
.wiz-hide { display: none !important }

应用背景:

Docker最先就是跑在Ubuntu和Debian上的,使用的就是aufs存储器.因为docker越来越流行,许多公司希望在rhel上使用,但是上游内核中并没有包括aufs,所以rhel不能使用aufs. 最终,开发者们开发了一个新的后端存储引擎devicemapper,基于已有的Device Mapper技术,并且使docker 支持可插拔,现在全世界有很多真实案例在生产环境中使用devicemapper.

因为上述的原因,对于centos/rhel这类没有相关驱动的系统,一般使用devicemapper驱动利用LVM的一些机制来模拟分层存储。这样的做法除了性能比较差之外,稳定性一般也不好,而且配置相对复杂。Docker安装在CentOS/RHEL 上后,会默认选择 devicemapper,但是为了简化配置,其 devicemapper 是跑在一个稀疏文件模拟的块设备上,也被称为 loop-lvm。这样的选择是因为不需要额外配置就可以运行 Docker,这是自动配置唯一能做到的事情。但是 loop-lvm 的做法非常不好,其稳定性、性能更差,无论是日志还是 docker info 中都会看到警告信息。官方文档有明确的文章讲解了如何配置块设备给 devicemapper 驱动做存储层的做法,这类做法也被称为配置 direct-lvm。

除了前面说到的问题外,devicemapper + loop-lvm 还有一个缺陷,因为它是稀疏文件,所以它会不断增长。用户在使用过程中会注意到 /var/lib/docker/devicemapper/devicemapper/data 不断增长,而且无法控制。很多人会希望删除镜像或者可以解决这个问题,结果发现效果并不明显。原因就是这个稀疏文件的空间释放后基本不进行垃圾回收的问题。因此往往会出现即使删除了文件内容,空间却无法回收,随着使用这个稀疏文件一直在不断增长。

所以,对于 CentOS/RHEL 的用户来说,在没有办法使用 UnionFS 的情况下,一定要配置 direct-lvm 给 devicemapper,无论是为了性能、稳定性还是空间利用率

配置环境:

centos 7

docker 1.12

配置步骤:

1.停止 docker daemon(root)

#> systemctl stop docker

2.创建相关逻辑卷以及 thinpool(root)

(1).分配磁盘

分配磁盘予服务器,利用 fdisk 进行分区。

(2).创建 PV

例如:已分配磁盘 /dev/sdb1

#> pvcreate /dev/sdb1

(3).创建 VG

#> vgcreate dockervg /dev/sdb1

(4).创建 thinpool 逻辑卷

#> lvcreate --wipesignatures y -n thinpool -l 50%VG dockervg

lvcreate --wipesignatures y -n thinpoolmeta -l 1%VG dockervg

可通过如下命令检验

#> lvscan

(5).转换成 thinpool

#> lvconvert -y --zero n -c 512K --thinpool dockervg/thinpool --poolmetadata dockervg/thinpoolmeta

输出结果类似如下。

可以通过如下命令查看 thinpool 状态

#> lvs -o lv_name,data_percent,metadata_percent,lv_size,lv_metadata_size,data_lv,metadata_lv

输出结果类似如下。

注意:其中 LSize 即为 Data 的空间大小,Msize 即为 MetaData 的空间大小,Data 为 Data 对应逻辑卷,Meta 为 MetaData 对应逻辑卷。

(6).扩展 thinpool(选做)

该步骤选做,用于 MetaData 或 Data 空间不足时的扩容。

例如:MetaData 对应逻辑卷路径为 /dev/mapper/dockervg-thinpool_tmeta,则扩容命令如下。

#> lvresize -L +1G /dev/mapper/dockervg-thinpool_tmeta

例如:thinpool 整体对应逻辑卷路径为 dockervg-thinpool,则扩容命令如下。

#> lvresize -L +5G /dev/mapper/dockervg-thinpool

3.备份并删除 Docker 存储目录(root)

(1).备份

#>  mkdir /var/lib/docker.bk

mv /var/lib/docker/* /var/lib/docker.bk

(2).删除原存储目录

#> rm -rf /var/lib/docker/*

4.修改 Docker 启动参数并启动(root)

修改 daemon.json 配置文件
#> vi /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",

"dm.basesize=25G"
   ]
}

注意:dm.basesize 指定了 images 以及 container 可以扩展到的最大空间

5.重启 Docker 服务(root)

#> systemctl daemon-reload

systemctl start docker

6.验证(root)

a.docker info 检查

#> docker info

结果类似如下。

其中,方框内信息表明以使用了 direct_lvm 的 Docker 存储模式,同时images 以及 container 可以扩展到的最大空间已修改所需大小。

b.试运行 hello-world

#> docker pull hello-world

docker run hello-world

结果类似如下,即表明运行正常。

参考资料:

https://docs.docker.com/engine/userguide/storagedriver/device-mapper-driver/#configure-direct-lvm-mode-for-production

时间: 2024-10-07 17:50:40

Centos-7 + Docker-1.12 中 devicemapper + direct_lvm 的 Docker 存储配置的相关文章

Docker在CentOS7中的安装与启动

Docker是当下很流行的应用容器,在系统快速部署方面有着独特的优势.由于最近在做的一个项目需要用到Docker,所以找了些资料学了学.Docker不仅仅在应用快速部署方面有着独特的优势,而且在资源共享和利用方面也不错.比如,你可以在一台机器上开成百上千个容器,却不能开成百上千台虚拟机.现在,docker得到了很多厂商的支持,是很火的一项技术.好了,废话少说,让咱们先从安装开始吧^_^ Docker的安装 由于CentOS在extra库列表中已经添加了docker源,因此在CentOS上安装是一

Docker学习总结(12)——非常详细的 Docker 学习笔记

一.Docker 简介 Docker 两个主要部件: Docker: 开源的容器虚拟化平台 Docker Hub: 用于分享.管理 Docker 容器的 Docker SaaS 平台 -- Docker Hub Docker 使用客户端-服务器 (C/S) 架构模式.Docker 客户端会与 Docker 守护进程进行通信.Docker 守护进程会处理复杂繁重的任务,例如建立.运行.发布你的 Docker 容器.Docker 客户端和守护进程可以运行在同一个系统上,当然你也可以使用 Docker

docker探索-CentOS7中配置Docker的yum源并升级安装docker1.13(十)

此处使用的是CentOS7,内核版本为 [[email protected] ~]# uname -r 3.10.0-327.el7.x86_64 该版本下,配置了yum的源为阿里的镜像源,具体的配置方法可以参见阿里镜像源配置方法 为了方便的安装升级Docker,同时按照Docker官方文档中的方式,配置Docker的yum源,具体参见CentOS docker yum 源配置方法 配置好yum源之后,可以通过yum的list命令,获取可以安装的docker版本 [[email protecte

Docker 1 12新功能探索(9) network基础

docker1.12中的network功能作了一定改进, 但是关于network应该如何使用,docker中的网络模型是如何设计的,当我们在run起来一个container而全然没有意识到network的时候,docker是怎样处理的,在这篇文章中,我们回去尝试一探究竟. docker1.12有关network的特性增加 特性 Built-in Virtual-IP based internal and ingress load-balancing using IPVS Routing Mesh

Docker 1 12新功能探索(8) Remote Api 1 24

Docker的Remote Api并不是1.12才有的,Docker1.12的Remote Api升到了1.24.Remote api的使用在1.12中没有大的变化,稍微大一点的变化是到这个版本之后,二进制文件分裂成了主client的docker以及主server的dockerd了.在centos上通过systemd的配置变化不大,无非是将tcp://ip:port设定到启动的Option中而已,下面来看一下如何设定和简单使用. 事前确认 可以看到只有unix socket的方式 [[email

Docker 1.12.0将要发布的新功能

导读 按计划,6/14 是1.12.0版本的 feature冻结 的日子,再有两个星期Docker 1.12.0也该发布了.这里列出来的新功能,都是已经合并到主分支的功能,不出意外,下一个版本的Docker应该是能体验到了. 下周2016 DockerCon也该开始了,好像也有一场专门来讲Docker新特性的,不过在这之前,我们就可以抢先一步,浏览一下这些新功能.新特性.尤其是前两个,都是比较吸引人的功能. Swarmkit集成 前几天Docker刚刚发布了 Swarmkit ,也就是Swarm

Docker 1.12 集群

? ? 环境介绍 虚拟机两台,vmware ,网络为NAT node139:192.168.190.139 Node140: 192.168.190.140 ? ? 设置hostname 以139为例 [[email protected] ~]$ hostname localhost.localdomain [[email protected] ~]$ sudo hostnamectl set-hostname node139 [sudo] password for demo: [[email 

Ununtu 12.04 x64位安装docker

什么是 Docker Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护. Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc.Redhat 已经在 其 RHEL6.5 中集中支持 Docker:Google 也在其 PaaS

docker 1.12 版本 的新特性

(1)docker swarm:集群管理,子命令有init, join, leave, update (2)docker service:服务创建,子命令有create, inspect, update, remove, tasks (3)docker node:节点管理,子命令有accept, promote, demote, inspect, update, tasks, ls, rm (4)docker stack/deploy:试验特性,用于多应用部署, 类似与 docker-compo