一、首先介绍一下docker的存储驱动Device Mapper插件的工作原理
如果在CentOS 、REHL 、Fedor或者其他默认没有 AUFS支持的Linux发行版上使用Docker,你需要用到Device Mapper的存储插件。将这个插件设置为默认,它会把你所有的容器存储到一个100G的简短文件中,并且限制每个容器最大为10GB。最初Docker仅能在支持Aufs文件系统的Linux发行版上运行,但是由于Aufs未能加入Linux内核,为了寻求兼容性、扩展性,Docker在内部通过graphdriver机制这种可扩展的方式来实现对不同文件系统的支持。目前,Docker支持Aufs,Devicemapper,Btrfs和Vfs四种文件系统。
查看linux系统是否支持aufs
1 |
|
Device Mapper插件是基于Device Mapper的“精简目标”的特性。它实际上是目标块设备的快照,之所以被称为“精简”是因为它允许精简配置。精简配置意味着你有一个(希望很大)可用存储块的池,接着你可以从那个池中创建任意大小的块设备(虚拟磁盘,如有需要);在你实际读写后,这些存储块将会被标记为已使用(或者从池中拿走)。这意味着你是可以超额使用这个池,比如在一个 100GB 的池里面创建几千个 10GB 的卷,甚至可能是一个 100TB 的卷在一个 1GB 的池里面。只要你的实际读写的块的容量不大于池的大小,你怎么做都可以。除此之外,精简目标的方式是可以做快照的。这表明无论何时,你都可以创建一个存在的卷的浅拷贝。在用户看来,就像你有两个一样的卷,它们可以独立地各自修改。即使你做了一个完整的拷贝,除了在时间上它是瞬间发生的(即使是很大的卷),它们不会两次重复使用存储。额外的存储只有当其中任何一卷有变化的时候才会发生,然后精简目标会从池里面分配一个存储快。从本质上来看,“精简目标”实际上使用了两个存储设备:一个(大)的是存储块池自己,还有一个小的存储了一些元数据。这些元数据中包括了卷、快照、以及每个卷的块或者快照同存储池中块的映射信息。
当 Docker 使用 Device Mapper 存储插件的时候,它会在 /var/lib/docker/devicemapper/devicemapper/data和/var/lib/docker/devicemapper/devicemapper/metadata 下创建两个文件(如果它们不存在)来存储对应的存储池和相关的元数据。这非常方便,你不需要做任何安装部署的工作(你不需要额外的分区来存储 Docker容器,或者建立LVM 或其他类似的东西)然而它也有两个缺点:
第一:存储池会有一个默认100GB 的容量
第二:它将会被稀疏文件所支持。从磁盘的使用效率的观点来看,这还不错的(就像在精简池中的卷,它一开始是小的,只有当实际需要写的时候才会使用磁盘的存储块)但是从性能的角度来看就不那么好了,因为 VFS 增加了一些额外的负担,特别是"第一次写的时候"。
PS:容器快照保存容器中所有的更新,当数据写入容器时,devicemapper从存储池中按需分配空间。
参考链接:http://www.cnblogs.com/feisky/p/4106004.html
二、这里介绍在centos6.x环境和centos7.x环境扩容docker的pool的方法
参考链接:http://dl528888.blog.51cto.com/2382721/1618893
其实扩容docker的pool空间也有几种方式:
第一种:使用文件
1 2 |
|
第二种:使用磁盘
额外在docker宿主机添加一块磁盘,然后格式化磁盘,并软链接到docker数据存储目录
1 2 |
|
第三种:使用逻辑卷(没有测试过)
1 |
|
下面开始在centos6.x和centos7.x下进行操作
1、centos6.x 环境
配置yum源,使用yum安装docker-io,启动docker,这些在这里不在赘述了。
第一种方式:简单介绍
备份镜像和容器
1 2 |
|
备份iptables规则
1 |
|
停止当前docker所有的容器
1 |
|
停掉docker服务
1 |
|
备份旧的docker数据
1 |
|
删除旧的docker数据文件
1 |
|
使用dd命令增大pool容量
1 |
|
生成200G的pool空间
1 2 3 4 5 6 7 |
|
启动docker
1 2 |
|
第二种方式:着重介绍
docker的安装就不说了,直接介绍扩容pool空间
查看docker默认的pool空间大小,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
查看安装的docker 版本
1 2 3 4 5 6 7 8 9 10 11 |
|
然后添加一块独立的磁盘,并格式化,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
在容器中创建文件和安装httpd服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
备份docker所有的镜像和容器,并将新添加的磁盘软链到docker数据文件目录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
|
最后恢复镜像和容器,并测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
2、centos7.x环境
第一种方法:使用文件(dd 命令)
配置yum源并安装docker
1 2 3 4 5 6 7 8 9 |
|
启动docker
1 |
|
查看docker详细信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
可以看到docker版本是1.12.0,pool是107.4G,已经使用了584.5MB
查看docker镜像和容器的信息,如下:
1 2 3 4 5 6 7 8 9 |
|
接下来开始备份docker镜像和容器
1 2 3 4 5 |
|
停掉当前正在运行的容器
1 |
|
停掉docker服务并备份docker旧数据
1 2 3 4 5 |
|
再将docker旧数据删除
1 |
|
使用dd命令生成一个大文件作为pool的容量空间,具体大小根据情况自定义
1 2 3 4 5 6 7 8 9 |
|
然后启动docker,查看pool空间是否扩容成功
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
剩下的任务就是恢复之前备份的镜像和容器了,查看数据是否恢复成功
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
使用testweb镜像重新run起来一个容器,查看在扩容pool空间之间创建的文件是否可以恢复
1 2 3 4 5 6 7 8 9 10 11 12 |
|
补充:如果容器都使用默认的10g空间,迁移没有出现问题,但如果容器进行了动态扩展,比如默认10g空间,你扩展到了30g或者更高,那么备份恢复容器的时候,会出现下面报错
[c3c929fe] +job import(-, cocos-play, )
write /var/lib/docker/devicemapper/mnt/19b84c235a7ed914871c0f10b5b17af9fc89955b077ad85afe0ec6e4b253c92b/rootfs/home/www/cocosplay/uploads/neatgame/ah2ssp/r_scene_20.cpk: no space left on device
所以建议大家不要动态扩展容器磁盘空间,尽量使用volume来挂载!!!
第二种方法:使用磁盘
说明:在centos7.x安装的docker(1.12.0),使用磁盘方式扩容pool无法成功,一切准备OK之后,启动docker报错,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
鼎峰胡佳雄
QQ.2881064155
Skype.live:2881064155