在centos6.x和centos7.x环境下停机扩容docker的pool空间

前端之家收集整理的这篇文章主要介绍了在centos6.x和centos7.x环境下停机扩容docker的pool空间前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一、首先介绍一下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

#cat/proc/filesystems|grepaufs#没有结果表示不支持

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空间也有几种方式:

第一种:使用文件

#ddif=/dev/zeroof=/var/lib/docker/devicemapper/devicemapper/databs=1Gcount=0seek=500
这样将会创建一个500G的稀疏文件,如果不使用seek选项,那么它会创建一个普通文件,而不是一个稀疏文件

第二种:使用磁盘

额外在docker宿主机添加一块磁盘,然后格式化磁盘,并软链接到docker数据存储目录

#ln-s/dev/sdb/var/lib/docker/devicemapper/devicemapper/data
然后再重启docker服务

第三种:使用逻辑卷(没有测试过)

ln-s/dev/mapper/centos-dockerdata/var/lib/docker/devicemapper/devicemapper/data

下面开始在centos6.x和centos7.x下进行操作

1、centos6.x 环境

配置yum源,使用yum安装docker-io,启动docker,这些在这里不在赘述了。

第一种方式:简单介绍

备份镜像和容器

#dockersave-ocentos6.tarcentos:centos6#备份镜像
#dockerexporthttpserver>/root/httpserver.tar#备份容器

备份iptables规则

#cp/etc/sysconfig/iptables/root/iptables_backup#在恢复容器的时候,这些规则可以作为参考

停止当前docker所有的容器

#dockerstop`dockerps-a-q`

停掉docker服务

#servicedockerstop

备份旧的docker数据

#cp-a/var/lib/docker//root/docker_backup/#备份旧数据是为了进行失败回滚

删除旧的docker数据文件

#rm-rf/var/lib/docker/

使用dd命令增大pool容量

#mkdir/var/lib/docker/devicemapper/devicemapper-pv#创建文件

生成200G的pool空间

#ddif=/dev/zeroof=/var/lib/docker/devicemapper/devicemapper/databs=1Gcount=0seek=200#增大到200G
0+0recordsin
0+0recordsout
0bytes(0B)copied,0.000379694s,0.0kB/s
#ll/var/lib/docker/devicemapper/devicemapper/#查看pool文件大小
total0
-rw-r--r--1rootroot214748364800Aug1616:13data

启动docker

#systemctlstartdocker#如果可以正常启动,pool容器就会扩大到200G
通过查看docker的pool空间大小来确认,使用命令:dockerinfo

第二种方式:着重介绍

docker的安装就不说了,直接介绍扩容pool空间

查看docker默认的pool空间大小,如下:

#dockerinfo
Containers:1
Images:2
StorageDriver:devicemapper
PoolName:docker-8:3-656635-pool
PoolBlocksize:65.54kB
BackingFilesystem:extfs
Datafile:/dev/loop0
Metadatafile:/dev/loop1
DataSpaceUsed:640.2MB
DataSpaceTotal:107.4GB#pool空间为107G
DataSpaceAvailable:27.3GB
MetadataSpaceUsed:1.044MB
MetadataSpaceTotal:2.147GB
MetadataSpaceAvailable:2.146GB
UdevSyncSupported:true
DeferredRemovalEnabled:false
Dataloopfile:/var/lib/docker/devicemapper/devicemapper/data
Metadataloopfile:/var/lib/docker/devicemapper/devicemapper/Metadata
LibraryVersion:1.02.89-RHEL6(2014-09-01)
ExecutionDriver:native-0.2
LoggingDriver:json-file
KernelVersion:2.6.32-504.el6.x86_64
OperatingSystem:<unknown>
cpus:2
TotalMemory:992.4MiB
Name:test
ID:BIW3:V2R2:7CWN:XQWW:4WO2:PUYO:JHOG:3N3F:DMU6:TKVR:R2EC:CORL

查看安装的docker 版本

#dockerversion
Clientversion:1.7.1
ClientAPIversion:1.19
Goversion(client):go1.4.2
Gitcommit(client):786b29d/1.7.1
OS/Arch(client):linux/amd64
Serverversion:1.7.1
ServerAPIversion:1.19
Goversion(server):go1.4.2
Gitcommit(server):786b29d/1.7.1
OS/Arch(server):linux/amd64

然后添加一块独立的磁盘,并格式化,如下:

#fdisk-l
Disk/dev/sda:32.2GB,32212254720bytes
255heads,63sectors/track,3916cylinders
Units=cylindersof16065*512=8225280bytes
Sectorsize(logical/physical):512bytes/512bytes
I/Osize(minimum/optimal):512bytes/512bytes
Diskidentifier:0x0009053b

DeviceBootStartEndBlocksIdSystem
/dev/sda1*12620480083Linux
Partition1doesnotendoncylinderboundary.
/dev/sda2265220480082Linuxswap/Solaris
Partition2doesnotendoncylinderboundary.
/dev/sda35239173104665683Linux

Disk/dev/sdb:128.8GB,128849018880bytes#新添加的磁盘
255heads,15665cylinders
Units=cylindersof16065*512=8225280bytes
Sectorsize(logical/physical):512bytes/512bytes
I/Osize(minimum/optimal):512bytes/512bytes
Diskidentifier:0x00000000
格式化:
#mkfs.ext4/dev/sdb

在容器中创建文件和安装httpd服务

查看镜像
#dockerimages
REPOSITORYTAGIMAGEIDCREATEDVIRTUALSIZE
centos6latest273a1eca2d3a2weeksago194.6MB
查看容器
#dockerps-a
CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
43f8196d81fccentos6"/bin/bash"2hoursagoUp3seconds0.0.0.0:5000->80/tcphttp
进入容器安装httpd,创建文件
#dockerattach43f8196d81fc
#vidocker_test.txt
thisisabackupfileindockerhost
#yuminstallhttpd-y
创建默认页面:
#echo"<h1>hellodocker!</h1>">/var/www/html/index.html
启动httpd
#servicehttpdstart
在浏览器访问:http://10.0.90.26:5000

wKioL1e1GSqTJE08AAA9_WTZ_Ls579.png

备份docker所有的镜像和容器,并将新添加的磁盘软链到docker数据文件目录

备份镜像
#dockersave-ocentos6_2.tarcentos6
备份容器
#dockerexporthttp>/root/centos6_http2.tar
停止docker中正在运行的所有容器
#dockerstop`dockerps-a-q`
停掉docker服务
#servicedockerstop
备份docker的数据文件目录,以免出现意外的情况下回滚数据
#cp-a/var/lib/docker/root/BackUp/
删除旧的docker数据
#rm-rf/var/lib/docker/
创建docker数据存储路径
#mkdir-pv/var/lib/docker/devicemapper/devicemapper
然后创建软连接,指向添加的磁盘设备
#ln-sv/dev/sdb/var/lib/docker/devicemapper/devicemapper/data
`/var/lib/docker/devicemapper/devicemapper/data'->`/dev/sdb'
启动docker服务
#servicedockerstart
Startingdocker:[OK]
查看docker数据存储路径文件
#ll/var/lib/docker/devicemapper/devicemapper/
total820
lrwxrwxrwx1rootroot8Aug1720:08data->/dev/sdb
-rw-------1rootroot2147483648Aug1720:09Metadata
然后再次运行dockerinfo,查看pool空间是否扩容成功,如下
#dockerinfo
Containers:0
Images:0
StorageDriver:devicemapper
PoolName:docker-8:3-656121-pool
PoolBlocksize:65.54kB
BackingFilesystem:extfs
Datafile:/dev/loop0
Metadatafile:/dev/loop1
DataSpaceUsed:305.7MB
DataSpaceTotal:128.8GB##已经由原来的107扩容到了128G
DataSpaceAvailable:128.5GB
MetadataSpaceUsed:811kB
MetadataSpaceTotal:2.147GB
MetadataSpaceAvailable:2.147GB
UdevSyncSupported:true
DeferredRemovalEnabled:false
Dataloopfile:/var/lib/docker/devicemapper/devicemapper/data
Metadataloopfile:/var/lib/docker/devicemapper/devicemapper/Metadata
LibraryVersion:1.02.89-RHEL6(2014-09-01)
ExecutionDriver:native-0.2
LoggingDriver:json-file
KernelVersion:2.6.32-504.el6.x86_64
OperatingSystem:<unknown>
cpus:2
TotalMemory:992.4MiB
Name:test
ID:BIW3:V2R2:7CWN:XQWW:4WO2:PUYO:JHOG:3N3F:DMU6:TKVR:R2EC:CORL

最后恢复镜像和容器,并测试

#dockerload--inputcentos6_2.tar#恢复镜像#
#catcentos6_http2.tar|dockerimport-webserver:test#将容器恢复成镜像
dd0deadd4cb5bee6c6febb21f4e884a846a853396a24fd5eb3cab1a9640b9fcb
查看恢复后的镜像
#dockerimages
REPOSITORYTAGIMAGEIDCREATEDVIRTUALSIZE
webservertestdd0deadd4cb5Aboutaminuteago266.4MB
centos6latest273a1eca2d3a2weeksago194.6MB
通过webserver这个镜像重新run起来一个web容器
#dockerrun-d-i-t--privileged=true-p5000:80--namehttpwebserver:test/bin/bash
9b07c82278421fe3395a5504e0e4c9c20513018edfcb0342fa1db961c6680751
#dockerps-a
CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
9b07c8227842webserver:test"/bin/bash"AboutaminuteagoUpAboutaminute0.0.0.0:5000->80/tcphttp
进入容器查看扩容pool之前创建的文件以及web默认页面
#dockerattach9b07c8227842
[root@9b07c8227842/]#
[root@9b07c8227842~]#ll
total20
-rw-------1rootroot2525Jul2914:12anaconda-ks.cfg
-rw-r--r--1rootroot37Aug1709:38docker_test.txt
-rw-r--r--1rootroot7275Jul2914:12install.log
-rw-r--r--1rootroot1680Jul2914:11install.log.syslog
[root@9b07c8227842~]#catdocker_test.txt#可以看到扩容之前创建的文件
thisisabackupfileindockerhost
#cat/var/www/html/index.html#创建的web页面也是存在的
<h1>hellodocker!</h1>
启动http服务,在浏览器访问http://10.0.90.26:5000是可以正常访问的。

2、centos7.x环境

第一种方法:使用文件(dd 命令)

配置yum源并安装docker

#cat/etc/yum.repos.d/docker.repo
[dockerrepo]
name=DockerRepository
baseurl=https://yum.dockerproject.org/repo/main/centos/7
enabled=1
gpgcheck=1
gpgkey=
使用yum来安装docker
#yuminstalldocker-engine-y

启动docker

#systemctlstartdocker

查看docker详细信息:

#dockerinfo
Containers:2
Running:2
Paused:0
Stopped:0
Images:2
ServerVersion:1.12.0
StorageDriver:devicemapper
PoolName:docker-8:2-524741-pool
PoolBlocksize:65.54kB
BaseDeviceSize:10.74GB
BackingFilesystem:xfs
Datafile:/dev/loop0
Metadatafile:/dev/loop1
DataSpaceUsed:584.5MB
DataSpaceTotal:107.4GB#pool空间为107G
DataSpaceAvailable:29.43GB
MetadataSpaceUsed:1.065MB
MetadataSpaceTotal:2.147GB
MetadataSpaceAvailable:2.146GB
ThinPoolMinimumFreeSpace:10.74GB
UdevSyncSupported:true
DeferredRemovalEnabled:false
DeferredDeletionEnabled:false
DeferredDeletedDeviceCount:0
Dataloopfile:/var/lib/docker/devicemapper/devicemapper/data
Metadataloopfile:/var/lib/docker/devicemapper/devicemapper/Metadata
LibraryVersion:1.02.107-RHEL7(2015-10-14)
……

可以看到docker版本是1.12.0,pool是107.4G,已经使用了584.5MB

查看docker镜像和容器的信息,如下:

#dockerimages
REPOSITORYTAGIMAGEIDCREATEDSIZE
centoscentos6a3c09d36ab4a2weeksago194.6MB
centoslatest9706330364442weeksago196.7MB
#dockerps-a
CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
eab85feb5eeecentos:centos6"/bin/bash"21hoursagoUp15minutes0.0.0.0:5000->80/tcptestweb
adbf1d4ccc10centos:centos6"/bin/bash"27hoursagoUp13minutesweb
ps:我事先在testweb容器中创建了testfile.txt文件内容是Hellodocker!,等扩容恢复之后,看此文件是否存在!

接下来开始备份docker镜像和容器

备份所有docker的container
#dockerps-a|grep-v"NAMES"|awk'{print$NF}'|xargs-I{}sh-c"dockerexport{}>/root/docker_{}.tar"
备份镜像:
#dockersave-ocentos6.tarcentos:centos6
#dockersave-ocentos7.tarcentos

停掉当前正在运行的容器

#dockerstopeab85feb5eeeadbf1d4ccc10

停掉docker服务并备份docker旧数据

停掉docker
#systemctlstopdocker
备份docker旧数据
#mkdir/root/docker_backup
#cp-a/var/lib/docker//root/docker_backup/

再将docker旧数据删除

#rm-rf/var/lib/docker/

使用dd命令生成一个大文件作为pool的容量空间,具体大小根据情况自定义

#mkdir/var/lib/docker/devicemapper/devicemapper-pv
#ddif=/dev/zeroof=/var/lib/docker/devicemapper/devicemapper/databs=1Gcount=0seek=200#增大到200G
0+0recordsin
0+0recordsout
0bytes(0B)copied,0.0kB/s
查看
#ll/var/lib/docker/devicemapper/devicemapper/
total0
-rw-r--r--1rootroot214748364800Aug1616:13data

然后启动docker,查看pool空间是否扩容成功

启动docker
#systemctlstartdocker
查看docker的pool空间大小
#dockerinfo
Containers:0
Running:0
Paused:0
Stopped:0
Images:0
ServerVersion:1.12.0
StorageDriver:devicemapper
PoolName:docker-8:2-524675-pool
PoolBlocksize:65.54kB
BaseDeviceSize:10.74GB
BackingFilesystem:xfs
Datafile:/dev/loop0
Metadatafile:/dev/loop1
DataSpaceUsed:38.2MB
DataSpaceTotal:214.7GB##可以看到pool的空间已经是200G
DataSpaceAvailable:27.45GB
MetadataSpaceUsed:1.507MB
MetadataSpaceTotal:2.147GB
MetadataSpaceAvailable:2.146GB
ThinPoolMinimumFreeSpace:21.47GB
UdevSyncSupported:true
DeferredRemovalEnabled:false
DeferredDeletionEnabled:false
DeferredDeletedDeviceCount:0
Dataloopfile:/var/lib/docker/devicemapper/devicemapper/data
Metadataloopfile:/var/lib/docker/devicemapper/devicemapper/Metadata
LibraryVersion:1.02.107-RHEL7(2015-10-14)
LoggingDriver:json-file
……

剩下的任务就是恢复之前备份的镜像和容器了,查看数据是否恢复成功

恢复images
#dockerload--inputcentos6.tar
6b5c6954e3d5:Loadinglayer[==================================================>]202.2MB/202.2MB
Loadedimage:centos:centos6
[root@docker~]#dockerload--inputcentos7.tar
Loadedimage:centos:centos6
f59b7e59ceaa:Loadinglayer[==================================================>]204.3MB/204.3MB
Loadedimage:centos:latest
恢复容器
[root@docker~]#catdocker_testweb.tar|dockerimport-testweb:new
sha256:12f36d4bd6105ec495893df2b356f3d1046ebecafa72a2c60f0ff487806f9dac
[root@docker~]#catdocker_web.tar|dockerimport-web:new
sha256:ef7db6ffb3e0cf59d78dd46deba1e39f047960ec8835552b37c1d724b6ec42d8
查看镜像
#dockerimages
REPOSITORYTAGIMAGEIDCREATEDSIZE
webnewef7db6ffb3e05secondsago269.2MB
testwebnew12f36d4bd61024secondsago194.6MB
centoscentos6a3c09d36ab4a2weeksago194.6MB
centoslatest9706330364442weeksago196.7MB

使用testweb镜像重新run起来一个容器,查看在扩容pool空间之间创建的文件是否可以恢复

#dockerrun-d-i-t--privileged-p5000:80--nameweb1testweb:new/bin/bash
9edc76e959ba336381c58f9ccf570d04818961e9c6e91a164a7ea2b49c6b5a0a
进入容器
#dockerattach222140ba7bc5
[root@222140ba7bc5~]#ll
total20
-rw-------1rootroot2525Jul2914:12anaconda-ks.cfg
-rw-r--r--1rootroot7275Jul2914:12install.log
-rw-r--r--1rootroot1680Jul2914:11install.log.syslog
-rw-r--r--1rootroot14Aug1606:12testfile.txt
#cattestfile.txt
Hellodocker!#说明是可以正常恢复的

补充:如果容器都使用默认的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来挂载!!!

猜你在找的CentOS相关文章