转载于博客园:http://www.cnblogs.com/Andrew-XinFei/p/6245330.html

前言

  Docker现在在后端是那么的火热..尤其当笔者了解了docker是什么、能做什么之后,真的是感觉特别的exciting,便迫不及待的去实践部署一下. 但是在实际部署中,因为笔者使用的是阿里云ecs服务器,centos7系统,因为centos7与ubuntu的差异性,所以,需要自己把后端存储引擎devicemapper从loop_lvm模式配置为direct_lvm模式。在这其中又遇到了坑,所以觉得很有必要记录下来,做个备忘.

为什么要配置devicemapper

  几点原因:

    ubuntu与contos的差异: 在Ubuntu/Debian上有UnionFS可以使用,如aufs或者overlay2,而CentOS和RHEL的内核中没有相关驱动。

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

    loop_lvm和direct_lvm区别

      因为上述的原因,对于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 中存在被 backports 回来的 overlay 驱动,不过 CentOS 里的这个驱动达不到生产环境使用的稳定程度,所以不推荐使用。

  (参考自:Docker--从入门到实践)

安装及运行docker

  比较easy,自己参考Docker--从入门到实践,在其中讲的有具体步骤,很详细了。本文的重点是direct_lvm模式的配置,这里就不再细说。

为生产环境配置direct_lvm模式

  生产环境下应该使用direct_lvm,如果之前有镜像在loop_lvm模式下创建,需要切换,则需要把镜像做备份(push到hub或者私有registry).所以最好的做法,还是: 在刚刚给centos服务器安装docker的时候,直接做好配置.

  1.停止docker daemon

  1. [root@srv00 ~]# systemctl stop docker

  2.创建相关的逻辑卷和thinpool

  检查磁盘

  1. [root@iZ28uvczcf6Z mapper]# fdisk -l <==检查下磁盘
  2.  
  3. Disk /dev/xvda: 107.4 GB, 107374182400 bytes, 209715200 sectors
  4. Units = sectors of 1 * 512 = 512 bytes
  5. Sector size (logical/physical): 512 bytes / 512 bytes
  6. I/O size (minimum/optimal): 512 bytes / 512 bytes
  7. Disk label type: dos
  8. Disk identifier: 0x635e6c7d
  9.  
  10. Device Boot Start End Blocks Id System
  11. /dev/xvda1 * 2048 209713151 104855552 8e Linux LVM
  12.  
  13. Disk /dev/xvdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
  14. Units = sectors of 1 * 512 = 512 bytes
  15. Sector size (logical/physical): 512 bytes / 512 bytes
  16. I/O size (minimum/optimal): 512 bytes / 512 bytes
  17. Disk label type: dos
  18. Disk identifier: 0x021dd279
  19.  
  20. Device Boot Start End Blocks Id System
  21. /dev/xvdb1 2048 41943039 20970496 8e Linux LVM

  创建pv

  1. [root@srv00 ~]# pvcreate /dev/xvdb1
  2. Physical volume "/dev/xvdb" successfully created

  注意: pvcreate 指令后面配置的硬盘(此处为"xvdb1")必须为独立的挂载硬盘,而不能是系统盘,否则会报错,创建失败.

  (关于挂载新硬盘后,如何对硬盘进行"初始化"、"分区" ,在本文最后会单独讲解。(比如在本代码中,把Disk "/dev/xvdb"初始化成一块分区 "/dev/xvdb1",大小等同于磁盘大小(约20G)。)

  创建vg

  1. [root@srv00 ~]# vgcreate vgdocker /dev/xvdb1
  2. Volume group "vgdocker" successfully created

  创建一个thin pool,名字叫thinpool,先来创建逻辑卷

  1. [root@srv00 ~]# lvcreate --wipesignatures y -n thinpool -l 95%VG vgdocker
  2. Logical volume "thinpool" created.
  3. [root@srv00 ~]# lvcreate --wipesignatures y -n thinpoolmeta -l 1%VG vgdocker
  4. Logical volume "thinpoolmeta" created.
  5. [root@srv00 ~]# lvscan
  6. ACTIVE '/dev/centos/swap' [4.00 GiB] inherit
  7. ACTIVE '/dev/centos/root' [35.47 GiB] inherit
  8. ACTIVE '/dev/vgdocker/thinpool' [28.50 GiB] inherit
  9. ACTIVE '/dev/vgdocker/thinpoolmeta' [304.00 MiB] inherit

"剩余的4%留给它们自动扩展"

  转换成thin pool

  1. [root@srv00 ~]# lvconvert -y --zero n -c 512K --thinpool vgdocker/thinpool --poolmetadata vgdocker/thinpoolmeta
  2. WARNING: Converting logical volume vgdocker/thinpool and vgdocker/thinpoolmeta to pool's data and metadata volumes.
  3. THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.)
  4. Converted vgdocker/thinpool to thin pool.

  设置thinpool的自动扩展参数,并应用此profile

  1. [root@srv00 ~]# vi /etc/lvm/profile/docker-thinpool.profile
  2. activation {
  3. thin_pool_autoextend_threshold=80
  4. thin_pool_autoextend_percent=20
  5. }
  6. [root@srv00 ~]# lvchange --metadataprofile docker-thinpool vgdocker/thinpool
  7. Logical volume "thinpool" changed.

"当空间大于80%时进行扩展.扩展的大小是空闲空间的20%"

  查看thinpool是否是已监视状态

  1. [root@srv00 ~]# lvs -o+seg_monitor
  2. LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Monitor
  3. root centos -wi-ao---- 35.47g
  4. swap centos -wi-ao---- 4.00g
  5. thinpool vgdocker twi-a-t--- 28.50g 0.00 0.02 monitored

  3.备份并删除docker存储目录(是否备份,根据自己需求)

   备份

  1. $ mkdir /var/lib/docker.bk
  2. $ mv /var/lib/docker/* /var/lib/docker.bk

   删除原存储目录

  1. [root@srv00 ~]# rm -rf /var/lib/docker/*

"注意备份重要镜像等"

  4.修改启动参数并启动

   我们通过systemd的drop-in方式修改,也是官方推荐的

  1.   编辑config文件
  1. [root@srv00 ~]# mkdir /etc/systemd/system/docker.service.d
  2. [root@srv00 ~]# vi /etc/systemd/system/docker.service.d/daemon.conf
  3. [Service]
  4. ExecStart=
  5. ExecStart=/usr/bin/dockerd

"ExecStart= 第一行是空.否则启动会报错; "  


  1.   实际启动时,是需要一些参数的,我们把它配置在daemon.json文件中。文件的位置是/etc/docker/daemon.json 通过vi指令编辑、保存,即可. daemon.json文件内容如下:
  1. {
  2. "storage-driver": "devicemapper",
  3. "storage-opts": [
  4. "dm.thinpooldev=/dev/mapper/vgdocker-thinpool",
  5. "dm.use_deferred_removal=true",
  6. "dm.use_deferred_deletion=true"
  7. ]
  8. }
  1.   重新reload
  1. [root@srv00 ~]# systemctl daemon-reload
  2. [root@srv00 ~]# systemctl start docker
  1.  

"修改daemon参数需要reload"

  5.检查确认

   可以看到,direct_lvm模式已经配置成功.

   注: 因为笔者机器已经配置完毕,无法重新配置前面的步骤,所以前面的一些代码,均是从一篇他人的博客(点击访问)中粘贴过来的,并进行了一些整理。 不过差别只是硬盘名称不一样,流程和输入指令完全可以直接照搬.

  1. [root@iZ28uvczcf6Z mapper]# docker info
  2. Containers: 0
  3. Running: 0
  4. Paused: 0
  5. Stopped: 0
  6. Images: 1
  7. Server Version: 1.12.5
  8. Storage Driver: devicemapper
  9. Pool Name: vgdocker-thinpool
  10. Pool Blocksize: 524.3 kB
  11. Base Device Size: 10.74 GB
  12. Backing Filesystem: xfs
  13. Data file:
  14. Metadata file:
  15. Data Space Used: 990.4 MB
  16. Data Space Total: 20.4 GB
  17. Data Space Available: 19.41 GB
  18. Metadata Space Used: 233.5 kB
  19. Metadata Space Total: 213.9 MB
  20. Metadata Space Available: 213.7 MB
  21. Thin Pool Minimum Free Space: 2.039 GB
  22. Udev Sync Supported: true
  23. Deferred Removal Enabled: true
  24. Deferred Deletion Enabled: true
  25. Deferred Deleted Device Count: 0
  26. Library Version: 1.02.135-RHEL7 (2016-09-28)
  27. Logging Driver: json-file
  28. Cgroup Driver: cgroupfs
  29. Plugins:
  30. Volume: local
  31. Network: null host bridge overlay
  32. Swarm: inactive
  33. Runtimes: runc
  34. Default Runtime: runc
  35. Security Options: seccomp
  36. Kernel Version: 3.10.0-514.2.2.el7.x86_64
  37. Operating System: CentOS Linux 7 (Core)
  38. OSType: linux
  39. Architecture: x86_64
  40. CPUs: 1
  41. Total Memory: 991.2 MiB
  42. Name: iZ28uvczcf6Z
  43. ID: KJ44:XNL6:W5KM:VYDQ:WN4C:FDPF:U52P:27SJ:MCWA:Q6JA:D76Z:JXVC
  44. Docker Root Dir: /var/lib/docker
  45. Debug Mode (client): false
  46. Debug Mode (server): false
  47. Registry: https://index.docker.io/v1/
  48. WARNING: bridge-nf-call-iptables is disabled
  49. Insecure Registries:
  50. 127.0.0.0/8
  51. [root@iZ28uvczcf6Z mapper]#

  

有哪些坑?

  硬盘挂载

    一定不能是系统盘

  "Docker 1.12 on CentOS no longer uses socket activation"

    因为Docker 1.12的一些新变化,基于网上的一些博客、文章,在配置时,就要有一些改变,否则你可能会遇到错误:"no sockets found via socket activation: make sure the service was started by systemd"。这个错误的解决方式,感兴趣的可以自行查看此链接: "docker daemon -H fd://" fails with message "No sockets found" under Ubuntu 15.10 #22847

  

    

挂载硬盘的初始化和分区方式

  

  1. $ fdisk /dev/xvdb
  2.  
  3. Command(m for help): n n之后,根据自己需要配置,也可以连着3enter就可以完成配置,初始化为一块分区,分区大小=硬盘大小
  4. Command (m for help): t t是个改类型的指令
  5. Partition number (1-3,default 3):
  6. Partition type (type L to list all types): 8e 最好是给配置为支持LVM8e类型
  7. Command ( m for help): w 保存
  8.  
  9. partprobe partprobe可以使kernel重新读取分区信息,从而避免重启
  10.  
  11. //以下的指令非必须,仅做一个备录
  12. pvcreate /dev/sda3
  13. vgextend vg00 /dev/sda3
  14. vgdisplay
  15. lvextend -L +80G /dev/vg00/lv_root
  16. lvdisplay
  17. resize2fs /dev/vg00/lv_root
  18. df -h

后言

  站在前人的肩膀上

    笔者学习时也是参考了一些博客、文章, 在它们的基础上,做了整理,并修改掉过时的配置信息. 其中一些笔者自己觉得说的挺清晰的,罗列在下面,方便参考:

    devicemapper 最佳实践

    Docker官方教程 : 官方教程,不用多说,只是英文阅读起来费些力气

    Docker--从入门到实践 :gitbook书籍,讲的很详细

    

    以及几篇不错的文章:

    http://www.linuxtechi.com/thin-provisioned-logical-volumes-centos-7-rhel-7/

    Docker一些启动安装指令

  一种简单的方式,配置direct_lvm模式

    本文主要讲的是自己手动配置direct_lvm模式的方式,还有一种简单些的配置方式.如 Docker Device Mapper 使用direct_lvm,文章提到了一个工具: docker-storage-setup,貌似基于这个脚本可以比较便捷的进行配置,但是感觉文中内容,笔者看的不是很明白,所以就没有继续了. docker-storage-setup的github网址,笔者也已经找到了:projectatomic/docker-storage-setup 。如果你感兴趣,研究有结果之后,欢迎回来在下方分享给笔者^_^。

 

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利;

centos7+ docker 实践部署docker及配置direct_lvm的更多相关文章

  1. centos7+ docker1.12 实践部署docker及配置direct_lvm

    前言 Docker现在在后端是那么的火热..尤其当笔者了解了docker是什么.能做什么之后,真的是感觉特别的exciting,便迫不及待的去实践部署一下. 但是在实际部署中,因为笔者使用的是阿里云e ...

  2. (二)docker的部署安装,配置,基础命令

    一.docker 的安装部署 这里不过多介绍,下面这两个linux发型版 安装可以参考 ubuntu的 docker-ce安装 centos7的 docker-ce安装 二.docker配置文件 重要 ...

  3. 在docker中部署redis主从配置

    环境说明: 阿里云服务器 Ubuntu 16.04 docker 1.拉取Redis镜像 docker pull redis 2.配置Redis启动配置文件,此处我创建一个专用目录,存放Redis相关 ...

  4. Docker实践 - 安装Docker并在容器里运行tomcat

    安装Docker yum install docker 本文使用的系统是centos7,ubuntu使用以下命令 sudo apt-get update sudo apt-get install do ...

  5. ubuntu docker方式部署docker registry v2

    生成自己签名的证书 生成签名的过程需要根据提示输入一些参数,需要注意的时Common Name的时候需要输入一个自己需要的域名,如果时内部域名记得访问的时候需要修改hosts. mkdir /data ...

  6. Docker实践--部署Nodejs应用

    这个例子的目标是为了向大家展示如何在Docker的container里运行Node.js程序.我会先创建一个简单的Node.js web app,来构建一个镜像.然后基于这个Image运行一个cont ...

  7. Docker实践3: Docker常用命令(未完)

    查看容器及运行进程 docker ps 查看容器内部信息 docker inspect container_id 进入容器 docker attach container_id 退出容器 docker ...

  8. 【linxu】部署docker容器虚拟化平台

    实验所涉内容 Docker 概述 部署 docker 容器虚拟化平台 docker 平台基本使用方法 创建docker镜像和发布镜像方法 Container 容器端口映射 一 Docker 概述 Do ...

  9. docker快速部署本地项目到服务器(tomcat8+mysql8)

    目标是:将本地运行的spring项目,部署到服务器上 为什么使用docker? 环境隔离 服务器上,各种环境交杂,使用docker,能清楚的把各个项目进行隔离,不单维护的人员方便,也会省去很多维护这些 ...

随机推荐

  1. 百度DMA+小度App的蓝牙语音解决方案技术难点解析

    前记   你平时在商场看到的语音助手,看起来非常的简单,其实,这个小小语音助手的背后,是一个非常的复杂的技术支撑.从前端到后端的技术依次是:前端语音降噪技术,高效的音频编解码技术,蓝牙双模技术,DMA ...

  2. Java泛型类特性

    在2004年末Java推出了Java5,其中提供了对泛型方法和类的支持,也围绕着泛型推出了一下特性,本章将对Java泛型进行综合的概括 1.泛型特性构件pre-Java 5 1.使用Object表示泛 ...

  3. linux 更新jdk

    1.上传jdk版本的包 下载JDK地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.h ...

  4. 别怕,"卷积"其实很简单(下)

        文章来自我的CSDN同名博客,欢迎文末扫码关注~   定义 基于上一篇文章的通俗化例子,我们从基本概念上了解了卷积,那么更严格的定义是怎样的呢? 从数学上讲,卷积只不过是一种运算,对于很多没有 ...

  5. iptables详细参数讲解

    table 表 --> chain 链 --->rule 规则Commands:Either long or short options are allowed. --append -A ...

  6. git基础命令的使用-附命令汇总

    本文从https://www.liaoxuefeng.com/wiki/896043488029600学习,边学习边记录. git命令:创建版本库:git init : 把当前目录变成Git可以管理的 ...

  7. $Noip2014/Luogu2312$ 解方程

    $Luogu$ $Sol$ 枚举解+秦九韶公式计算+取模. $Code$ #include<iostream> #include<cstdio> #include<cst ...

  8. 大数据-HDFS 集群搭建的配置文件

    1.HDFS简单版集群搭建相关配置文件 1.core-site.xml文件 <property> <name>fs.defaultFS</name> <val ...

  9. (三)unittest断言方法的介绍

    断言如同在测试用例上,类似于预期结果与实际结果是否一致,如果一致则表示测试通过,Assert断言很好的用于测试结果判断上,更灵活的对预期结果和实际结果进行对比,下面简单的介绍一下unittest的As ...

  10. 2018铁人三项测评题 IOS99

    下面这一部分是我从网上复制过来的, 2.IOS 解题链接:http://ctf4.shiyanbar.com/web/IOS/index.php 这题页面中提示系统升级到了IOS99,我们可以想到修改 ...