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

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

  1. CentOS 7在VMware 12中共享文件看不见的问题?

    前言 由于rhel 7.2因为没有注册导致yum无法使用,包括自己配置本地源,这个命令在你没有注册都不能使用,每次使用rpm去装软件,自己去找缺少的依赖包,实在是麻烦.于是不如就换一个系统,CentO ...

  2. Docker在CentOS7中的安装与启动

    Docker是当下很流行的应用容器,在系统快速部署方面有着独特的优势.由于最近在做的一个项目需要用到Docker,所以找了些资料学了学.Docker不仅仅在应用快速部署方面有着独特的优势,而且在资源共 ...

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

    一.Docker 简介 Docker 两个主要部件: Docker: 开源的容器虚拟化平台 Docker Hub: 用于分享.管理 Docker 容器的 Docker SaaS 平台 -- Docke ...

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

    此处使用的是CentOS7,内核版本为 [root@localhost ~]# uname -r -.el7.x86_64 该版本下,配置了yum的源为阿里的镜像源,具体的配置方法可以参见阿里镜像源配 ...

  5. CentOS7系列--5.2CentOS7中配置和管理Docker

    CentOS7配置和管理Docker Docker是操作系统级别的虚拟化工具,它能自动化布署在容器中的应用 1. 安装Docker 1.1. 安装Docker相关软件 [root@server1 ~] ...

  6. 数人云CTO解读Docker 1.12和金融业容器化

    7月29日 数人云 在上海举办金融沙龙,邀请上交所和近二十家来自银行.保险.证券的IT技术专家一同探讨容器技术在金融业中的最佳实践.数人云CTO肖德时在会上将传统金融行业通过容器可以解决的四大问题做了 ...

  7. 【Docker】在Linux系统中安装Docker虚拟机、启动停止重启查看Docker命令

    安装Docker 文章目录 安装Docker Docker虚拟机架构 在Linux系统中安装Docker虚拟机 管理Docker虚拟机 参考资料 Docker虚拟机架构 Docker创建的所有虚拟实例 ...

  8. 初探Docker CentOS 7.9 2009 Mini 操作系统环境初始化 和Docker初始化

    初探docker 什么是docker?docker就是一种虚拟化技术,将一个服务虚拟化成一个拥有操作系统内核作为基石的快速使用服务.不用担心环境不同服务效果 不同. docker 官网可以从中央仓库中 ...

  9. Docker 1.12 集群

        环境介绍 虚拟机两台,vmware ,网络为NAT node139:192.168.190.139 Node140: 192.168.190.140     设置hostname 以139为例 ...

随机推荐

  1. Element类型知识大全

    Element类型 除了Document类型之外,Element类型就要算是Web编程中最常用的类型了.Element类型用于表现XML或HTML元素,提供了对元素标签名.子节点及特性的访问.   要 ...

  2. reduceByKeyLocally

    2017年3月15日, 星期三 reduceByKeyLocally--Transformation类算子 代码示例  

  3. LAMP环境跟LNMP环境有什么不同,主要用什么地方

    LAMP即Linux+Apache+Mysql/MariaDB+Perl/PHP/Python Linux+Apache+Mysql/MariaDB+Perl/PHP/Python一组常用来搭建动态网 ...

  4. Weblogic jsp页面编译出错,Weblogic jsp编译异常

    Weblogic jsp页面编译出错,Weblogic jsp编译异常 ======================== 蕃薯耀 2018年1月29日 http://www.cnblogs.com/f ...

  5. python中的Queue(队列)详解

    一.Queue简介 python中的队列分类可分为两种: 1.线程Queue,也就是普通的Queue 2.进程Queue,在多线程与多进程会介绍. Queue的种类: FIFO:  Queue.Que ...

  6. Discuz论坛URL静态化规则urlrewrite

    http://blog.csdn.net/u014181418/article/details/53467980 1.在论坛代码目录下新建文件".htaccess" vim /us ...

  7. Web Magic 总体架构

    1.2 总体架构 WebMagic的结构分为Downloader.PageProcessor.Scheduler.Pipeline四大组件,并由Spider将它们彼此组织起来.这四大组件对应爬虫生命周 ...

  8. 计算机改名引发的ORA

    近期上班时,由于开机时老是提示" 局域网出现计算机重名冲突",于是把计算机名字给改了,从PC2010081312zeo改为了CXBIKKKKKKK,结果第二天来的时候,用PL/SQ ...

  9. 一个ios的各种组件、代码分类,供参考

    http://github.ibireme.com/github/list/ios/#

  10. js中的监听事件总结

    javascript事件与功能说明大全:http://tools.jb51.net/table/javascript_event 1.滚动条监听事件 例1:监听滚动条距离页面顶端距离 <scri ...