centos7+ docker1.12 实践部署docker及配置direct_lvm
前言
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, bytes, sectors
Units = sectors of * = bytes
Sector size (logical/physical): bytes / bytes
I/O size (minimum/optimal): bytes / bytes
Disk label type: dos
Disk identifier: 0x635e6c7d Device Boot Start End Blocks Id System
/dev/xvda1 * 8e Linux LVM Disk /dev/xvdb: 21.5 GB, bytes, sectors
Units = sectors of * = bytes
Sector size (logical/physical): bytes / bytes
I/O size (minimum/optimal): bytes / bytes
Disk label type: dos
Disk identifier: 0x021dd279 Device Boot Start End Blocks Id System
/dev/xvdb1 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 %VG vgdocker
Logical volume "thinpool" created.
[root@srv00 ~]# lvcreate --wipesignatures y -n thinpoolmeta -l %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=
thin_pool_autoextend_percent=
}
[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---- .47g
swap centos -wi-ao---- .00g
thinpool vgdocker twi-a-t--- .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:
Running:
Paused:
Stopped:
Images:
Server Version: 1.12.
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:
Library Version: 1.02.-RHEL7 (--)
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.-514.2..el7.x86_64
Operating System: CentOS Linux (Core)
OSType: linux
Architecture: x86_64
CPUs:
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/
[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 (-,default ):
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
后言
站在前人的肩膀上
笔者学习时也是参考了一些博客、文章, 在它们的基础上,做了整理,并修改掉过时的配置信息. 其中一些笔者自己觉得说的挺清晰的,罗列在下面,方便参考:
Docker官方教程 : 官方教程,不用多说,只是英文阅读起来费些力气
Docker--从入门到实践 :gitbook书籍,讲的很详细
以及几篇不错的文章:
http://www.linuxtechi.com/thin-provisioned-logical-volumes-centos-7-rhel-7/
一种简单的方式,配置direct_lvm模式
本文主要讲的是自己手动配置direct_lvm模式的方式,还有一种简单些的配置方式.如 Docker Device Mapper 使用direct_lvm,文章提到了一个工具: docker-storage-setup,貌似基于这个脚本可以比较便捷的进行配置,但是感觉文中内容,笔者看的不是很明白,所以就没有继续了. docker-storage-setup的github网址,笔者也已经找到了:projectatomic/docker-storage-setup 。如果你感兴趣,研究有结果之后,欢迎回来在下方分享给笔者^_^。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利;
本文出自:博客园--别问是谁
centos7+ docker1.12 实践部署docker及配置direct_lvm的更多相关文章
- centos7+ docker 实践部署docker及配置direct_lvm
转载于博客园:http://www.cnblogs.com/Andrew-XinFei/p/6245330.html 前言 Docker现在在后端是那么的火热..尤其当笔者了解了docker是什么.能 ...
- suse 12 脚本部署docker(二进制文件)
suse-linux:~ # cat /etc/issue Welcome to SUSE Linux Enterprise Server 12 SP3 (x86_64) - Kernel \r (\ ...
- centos7 docker1.12 私有仓库
docker1.12私有仓库 参考:http://www.cnblogs.com/xcloudbiz/articles/5497037.html 参考:http://www.07net01.com/2 ...
- Centos-7 + Docker-1.12 中 devicemapper + direct_lvm 的 Docker 存储配置
html,body { font-size: 12pt } body { font-family: Helvetica, "Hiragino Sans GB", "微软雅 ...
- Centos7的安装、Docker1.12.3的安装,以及Docker Swarm集群的简单实例
目录 [TOC] 1.环境准备 本文中的案例会有四台机器,他们的Host和IP地址如下 c1 -> 10.0.0.31 c2 -> 10.0.0.32 c3 -> 10.0.0. ...
- [转载] Centos7的安装、Docker1.12.3的安装,以及Docker Swarm集群的简单实例
1.环境准备 本文中的案例会有四台机器,他们的Host和IP地址如下 c1 -> 10.0.0.31 c2 -> 10.0.0.32 c3 -> 10.0.0.33 c4 -&g ...
- centos7 部署 docker、shipyard
=============================================== 2019/4/9_第3次修改 ccb_warlock 更新说 ...
- centos7 部署 docker swarm
=============================================== 2019/4/9_第3次修改 ccb_warlock 更新说 ...
- Linux环境基于CentOS7 搭建部署Docker容器
1.Docker容器概述 区分Docker容器技术和VM虚拟机技术: evernotecid://394EFE90-9CE0-4D65-A8CD-DFEC0DC8061E/appyinxiangcom ...
随机推荐
- Android开发学习之SQLite数据存取浅析
一.SQLite的介绍 1.SQLite简介 SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入 式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低 ...
- 3.Java基础:String对象的创建和使用
一.常用的创建方式 String s1=”abc“: String s2=”abc“: s1==s2 ==> true 解析:s1和s2指向的是同一个字符串池地址 二.不常用的创建方式 S ...
- angular.js 中同步视图和模型数据双向绑定,$watch $digest $apply 机制
Angular.js 中的特性,双向绑定. 让视图的改变直接反应到数据中,数据的改变又实时的通知到视图,如何做到的? 这要归功于 scope 下面3个重要的方法: $watch $digest $ap ...
- Hadoop2.x介绍与源代码编译
1.Hadoop 项目的四大模块 Hadoop Common: The common utilities that support the other Hadoop modules. Hadoop D ...
- Common Probability Distributions
Common Probability Distributions Probability Distribution A probability distribution describes the p ...
- android笔记-----消息提示
在/res/values目录下的文件中定义要显示的字符串,主要是考虑到后期可能需要换成英文之类的 <string name="login_checkBlank">用户名 ...
- ARM中LDR伪指令与LDR加载指令
ARM指令集中,LDR通常都是作加载指令的,但是它也可以作伪指令. LDR伪指令的形式是“LDR Rn,=expr”.下面举一个例子来说明它的用法. COUNT EQU 0x4000310 ...
- How do I create a List in Scala?
Scala List class FAQ: How do I create a List in Scala? You can create a Scala List in several differ ...
- [原]零基础学习SDL开发之在Android使用SDL2.0显示BMP图
关于如何移植SDL2.0到安卓上面来参考我的上一篇文章:[原]零基础学习SDL开发之移植SDL2.0到Android 在一篇文章我们主要使用SDL2.0来加载一张BMP图来渲染显示. 博主的开发环境: ...
- 解析html文档的java库及范例
用这个工具jsoup <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <v ...