转载于博客园: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

[root@srv00 ~]# systemctl stop docker

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

  检查磁盘

[root@iZ28uvczcf6Z mapper]# fdisk -l   <==检查下磁盘

Disk /dev/xvda: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x635e6c7d Device Boot Start End Blocks Id System
/dev/xvda1 * 2048 209713151 104855552 8e Linux LVM Disk /dev/xvdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x021dd279 Device Boot Start End Blocks Id System
/dev/xvdb1 2048 41943039 20970496 8e Linux LVM

  创建pv

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

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

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

  创建vg

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

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

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

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

  转换成thin pool

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

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

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

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

  查看thinpool是否是已监视状态

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

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

   备份

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

   删除原存储目录

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

"注意备份重要镜像等"

  4.修改启动参数并启动

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

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

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


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

"修改daemon参数需要reload"

  5.检查确认

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

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

[root@iZ28uvczcf6Z mapper]# docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 1
Server Version: 1.12.5
Storage Driver: devicemapper
Pool Name: vgdocker-thinpool
Pool Blocksize: 524.3 kB
Base Device Size: 10.74 GB
Backing Filesystem: xfs
Data file:
Metadata file:
Data Space Used: 990.4 MB
Data Space Total: 20.4 GB
Data Space Available: 19.41 GB
Metadata Space Used: 233.5 kB
Metadata Space Total: 213.9 MB
Metadata Space Available: 213.7 MB
Thin Pool Minimum Free Space: 2.039 GB
Udev Sync Supported: true
Deferred Removal Enabled: true
Deferred Deletion Enabled: true
Deferred Deleted Device Count: 0
Library Version: 1.02.135-RHEL7 (2016-09-28)
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: null host bridge overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: seccomp
Kernel Version: 3.10.0-514.2.2.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 991.2 MiB
Name: iZ28uvczcf6Z
ID: KJ44:XNL6:W5KM:VYDQ:WN4C:FDPF:U52P:27SJ:MCWA:Q6JA:D76Z:JXVC
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
WARNING: bridge-nf-call-iptables is disabled
Insecure Registries:
127.0.0.0/8
[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

  

    

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

  

$ fdisk /dev/xvdb

    Command(m for help): n   n之后,根据自己需要配置,也可以连着3次enter就可以完成配置,初始化为一块分区,分区大小=硬盘大小
Command (m for help): t t是个改类型的指令
Partition number (1-3,default 3):
Partition type (type L to list all types): 8e 最好是给配置为支持LVM的8e类型
Command ( m for help): w 保存 partprobe 用partprobe可以使kernel重新读取分区信息,从而避免重启 //以下的指令非必须,仅做一个备录
pvcreate /dev/sda3
vgextend vg00 /dev/sda3
vgdisplay
lvextend -L +80G /dev/vg00/lv_root
lvdisplay
resize2fs /dev/vg00/lv_root
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. 聊聊多线程那一些事儿(task)之 三 异步取消和异步方法

    hello,咋们又见面啦,通过前面两篇文章的介绍,对task的创建.运行.阻塞.同步.延续操作等都有了很好的认识和使用,结合实际的场景介绍,这样一来在实际的工作中也能够解决很大一部分的关于多线程的业务 ...

  2. 查漏补缺:2020年搞定SpringCloud面试(含答案和思维导图)

    前言 Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总线.负载均衡.断路器.数据监控等,都 ...

  3. java的package和import机制

    在说package.import机制前我们先来了解下java的CLASSPATH. CLASSPATH顾名思义就是class的路径,当我们在系统中运行某个java程序时,它就会告诉系统在这些地方寻找这 ...

  4. 微服务Dubbo和SpringCloud架构设计、优劣势比较

    本文主要围绕微服务的技术选型.通讯协议.服务依赖模式.开始模式.运行模式等几方面来综合比较Dubbo和Spring Cloud 这2种开发框架.架构师可以根据公司的技术实力并结合项目的特点来选择某个合 ...

  5. redis 本地安装

    1.redis介绍 Redis是有名的NoSql数据库,一般Linux都会默认支持.但在Windows环境中,可能需要手动安装设置才能有效使用.简单介绍一下Windows下Redis服务的安装方法. ...

  6. sql函数实用——字符函数(sqlserver与mysql对比)

    1.获取长度 sqlserver写法:关键字:len()    获取参数的字符数量 select  Len('aksjdhh')    输出结果 7 select len('张无忌ooo')   输出 ...

  7. my_mysql

    ###一键偷懒YUM安装MySQbL### 1.安装mysql数据库 #yum install -y mariadb-server  mariadb 2.登录mysql数据库常用选项 -h:指定服务端 ...

  8. 快速开发架构Spring Boot 从入门到精通 附源码

    导读 篇幅较长,干货十足,阅读需花费点时间.珍惜原创,转载请注明出处,谢谢! Spring Boot基础 Spring Boot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计 ...

  9. ASCII、UNICODE、UTF

    在计算机中,一个字节对应8位,每位可以用0或1表示,因此一个字节可以表示256种情况. ascii 美国人用了一个字节中的后7位来表达他们常用的字符,最高位一直是0,这便是ascii码. 因此asci ...

  10. 【转】Hive Data Manipulation Language

    Hive Data Manipulation Language Hive Data Manipulation Language Loading files into tables Syntax Syn ...