标签:
一、首先介绍一下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
|
#cat /proc/filesystems | grep aufs #没有结果表示不支持 |
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
|
#dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1G count=0 seek=500 这样将会创建一个500G的稀疏文件,如果不使用 seek 选项,那么它会创建一个普通文件,而不是一个稀疏文件 |
第二种:使用磁盘
额外在docker宿主机添加一块磁盘,然后格式化磁盘,并软链接到docker数据存储目录
1
2
|
#ln -s /dev/sdb /var/lib/docker/devicemapper/devicemapper/data 然后再重启docker服务 |
第三种:使用逻辑卷(没有测试过)
1
|
ln -s /dev/mapper/centos-dockerdata /var/lib/docker/devicemapper/devicemapper/data |
下面开始在centos6.x和centos7.x下进行操作
1、centos6.x 环境
配置yum源,使用yum安装docker-io,启动docker,这些在这里不在赘述了。
第一种方式:简单介绍
备份镜像和容器
1
2
|
#docker save -o centos6.tar centos:centos6 #备份镜像 #docker export httpserver > /root/httpserver.tar #备份容器 |
备份iptables规则
1
|
#cp /etc/sysconfig/iptables /root/iptables_backup #在恢复容器的时候,这些规则可以作为参考 |
停止当前docker所有的容器
1
|
#docker stop `docker ps -a -q` |
停掉docker服务
1
|
#service docker stop |
备份旧的docker数据
1
|
#cp -a /var/lib/docker/ /root/docker_backup/ #备份旧数据是为了进行失败回滚 |
删除旧的docker数据文件
1
|
#rm -rf /var/lib/docker/ |
使用dd命令增大pool容量
1
|
#mkdir /var/lib/docker/devicemapper/devicemapper -pv #创建文件夹 |
生成200G的pool空间
1
2
3
4
5
6
7
|
#dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1G count=0 seek=200 #增大到200G 0+0 records in 0+0 records out 0 bytes (0 B) copied, 0.000379694 s, 0.0 kB /s #ll /var/lib/docker/devicemapper/devicemapper/ #查看pool文件大小 total 0 -rw-r--r-- 1 root root 214748364800 Aug 16 16:13 data |
启动docker
1
2
|
#systemctl start docker #如果可以正常启动,pool容器就会扩大到200G 通过查看docker的pool空间大小来确认,使用命令:docker info |
第二种方式:着重介绍
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 info Containers: 1 Images: 2 Storage Driver: devicemapper Pool Name: docker-8:3-656635-pool Pool Blocksize: 65.54 kB Backing Filesystem: extfs Data file : /dev/loop0 Metadata file : /dev/loop1 Data Space Used: 640.2 MB Data Space Total: 107.4 GB #pool空间为107G Data Space Available: 27.3 GB Metadata Space Used: 1.044 MB Metadata Space Total: 2.147 GB Metadata Space Available: 2.146 GB Udev Sync Supported: true Deferred Removal Enabled: false Data loop file : /var/lib/docker/devicemapper/devicemapper/data Metadata loop file : /var/lib/docker/devicemapper/devicemapper/metadata Library Version: 1.02.89-RHEL6 (2014-09-01) Execution Driver: native-0.2 Logging Driver: json- file Kernel Version: 2.6.32-504.el6.x86_64 Operating System: <unknown> CPUs: 2 Total Memory: 992.4 MiB Name: test ID: BIW3:V2R2:7CWN:XQWW:4WO2:PUYO:JHOG:3N3F:DMU6:TKVR:R2EC:CORL |
查看安装的docker 版本
1
2
3
4
5
6
7
8
9
10
11
|
#docker version Client version: 1.7.1 Client API version: 1.19 Go version (client): go1.4.2 Git commit (client): 786b29d /1 .7.1 OS /Arch (client): linux /amd64 Server version: 1.7.1 Server API version: 1.19 Go version (server): go1.4.2 Git commit (server): 786b29d /1 .7.1 OS /Arch (server): linux /amd64 |
然后添加一块独立的磁盘,并格式化,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#fdisk -l Disk /dev/sda : 32.2 GB, 32212254720 bytes 255 heads, 63 sectors /track , 3916 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical /physical ): 512 bytes / 512 bytes I /O size (minimum /optimal ): 512 bytes / 512 bytes Disk identifier: 0x0009053b Device Boot Start End Blocks Id System /dev/sda1 * 1 26 204800 83 Linux Partition 1 does not end on cylinder boundary. /dev/sda2 26 52 204800 82 Linux swap / Solaris Partition 2 does not end on cylinder boundary. /dev/sda3 52 3917 31046656 83 Linux Disk /dev/sdb : 128.8 GB, 128849018880 bytes #新添加的磁盘 255 heads, 63 sectors /track , 15665 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical /physical ): 512 bytes / 512 bytes I /O size (minimum /optimal ): 512 bytes / 512 bytes Disk identifier: 0x00000000 格式化: #mkfs.ext4 /dev/sdb |
在容器中创建文件和安装httpd服务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
查看镜像 # docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos6 latest 273a1eca2d3a 2 weeks ago 194.6 MB 查看容器 # docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 43f8196d81fc centos6 "/bin/bash" 2 hours ago Up 3 seconds 0.0.0.0:5000->80 /tcp http 进入容器安装httpd,创建文件 #docker attach 43f8196d81fc #vi docker_test.txt this is a backup file in docker host #yum install httpd -y 创建默认页面: #echo "<h1>hello docker!</h1>" > /var/www/html/index.html 启动httpd #service httpd start 在浏览器访问:http: //10 .0.90.26:5000 |
备份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
|
备份镜像 #docker save -o centos6_2.tar centos6 备份容器 #docker export http > /root/centos6_http2.tar 停止docker中正在运行的所有容器 #docker stop `docker ps -a -q` 停掉docker服务 #service docker stop 备份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服务 # service docker start Starting docker: [ OK ] 查看docker数据存储路径文件 # ll /var/lib/docker/devicemapper/devicemapper/ total 820 lrwxrwxrwx 1 root root 8 Aug 17 20:08 data -> /dev/sdb -rw------- 1 root root 2147483648 Aug 17 20:09 metadata 然后再次运行docker info,查看pool空间是否扩容成功,如下 #docker info Containers: 0 Images: 0 Storage Driver: devicemapper Pool Name: docker-8:3-656121-pool Pool Blocksize: 65.54 kB Backing Filesystem: extfs Data file : /dev/loop0 Metadata file : /dev/loop1 Data Space Used: 305.7 MB Data Space Total: 128.8 GB ##已经由原来的107扩容到了128G Data Space Available: 128.5 GB Metadata Space Used: 811 kB Metadata Space Total: 2.147 GB Metadata Space Available: 2.147 GB Udev Sync Supported: true Deferred Removal Enabled: false Data loop file : /var/lib/docker/devicemapper/devicemapper/data Metadata loop file : /var/lib/docker/devicemapper/devicemapper/metadata Library Version: 1.02.89-RHEL6 (2014-09-01) Execution Driver: native-0.2 Logging Driver: json- file Kernel Version: 2.6.32-504.el6.x86_64 Operating System: <unknown> CPUs: 2 Total Memory: 992.4 MiB Name: test ID: BIW3:V2R2:7CWN:XQWW:4WO2:PUYO:JHOG:3N3F:DMU6:TKVR:R2EC:CORL |
最后恢复镜像和容器,并测试
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 load --input centos6_2.tar #恢复镜像# # cat centos6_http2.tar | docker import - webserver:test #将容器恢复成镜像 dd0deadd4cb5bee6c6febb21f4e884a846a853396a24fd5eb3cab1a9640b9fcb 查看恢复后的镜像 # docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE webserver test dd0deadd4cb5 About a minute ago 266.4 MB centos6 latest 273a1eca2d3a 2 weeks ago 194.6 MB 通过webserver这个镜像重新run起来一个web容器 # docker run -d -i -t --privileged=true -p 5000:80 --name http webserver:test /bin/bash 9b07c82278421fe3395a5504e0e4c9c20513018edfcb0342fa1db961c6680751 # docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9b07c8227842 webserver: test "/bin/bash" About a minute ago Up About a minute 0.0.0.0:5000->80 /tcp http 进入容器查看扩容pool之前创建的文件以及web默认页面 #docker attach 9b07c8227842 [root@9b07c8227842 /] # [root@9b07c8227842 ~] # ll total 20 -rw------- 1 root root 2525 Jul 29 14:12 anaconda-ks.cfg -rw-r--r-- 1 root root 37 Aug 17 09:38 docker_test.txt -rw-r--r-- 1 root root 7275 Jul 29 14:12 install .log -rw-r--r-- 1 root root 1680 Jul 29 14:11 install .log.syslog [root@9b07c8227842 ~] # cat docker_test.txt #可以看到扩容之前创建的文件 this is a backup file in docker host #cat /var/www/html/index.html #创建的web页面也是存在的 <h1>hello docker!< /h1 > 启动http服务,在浏览器访问http: //10 .0.90.26:5000 是可以正常访问的。 |
2、centos7.x环境
第一种方法:使用文件(dd 命令)
配置yum源并安装docker
1
2
3
4
5
6
7
8
9
|
#cat /etc/yum.repos.d/docker.repo [dockerrepo] name=Docker Repository baseurl=https: //yum .dockerproject.org /repo/main/centos/7 enabled=1 gpgcheck=1 gpgkey= 使用yum来安装docker #yum install docker-engine -y |
启动docker
1
|
#systemctl start 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
|
#docker info Containers: 2 Running: 2 Paused: 0 Stopped: 0 Images: 2 Server Version: 1.12.0 Storage Driver: devicemapper Pool Name: docker-8:2-524741-pool Pool Blocksize: 65.54 kB Base Device Size: 10.74 GB Backing Filesystem: xfs Data file : /dev/loop0 Metadata file : /dev/loop1 Data Space Used: 584.5 MB Data Space Total: 107.4 GB #pool空间为107G Data Space Available: 29.43 GB Metadata Space Used: 1.065 MB Metadata Space Total: 2.147 GB Metadata Space Available: 2.146 GB Thin Pool Minimum Free Space: 10.74 GB Udev Sync Supported: true Deferred Removal Enabled: false Deferred Deletion Enabled: false Deferred Deleted Device Count: 0 Data loop file : /var/lib/docker/devicemapper/devicemapper/data Metadata loop file : /var/lib/docker/devicemapper/devicemapper/metadata Library Version: 1.02.107-RHEL7 (2015-10-14) …… |
可以看到docker版本是1.12.0,pool是107.4G,已经使用了584.5MB
查看docker镜像和容器的信息,如下:
1
2
3
4
5
6
7
8
9
|
#docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos centos6 a3c09d36ab4a 2 weeks ago 194.6 MB centos latest 970633036444 2 weeks ago 196.7 MB #docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES eab85feb5eee centos:centos6 "/bin/bash" 21 hours ago Up 15 minutes 0.0.0.0:5000->80 /tcp testweb adbf1d4ccc10 centos:centos6 "/bin/bash" 27 hours ago Up 13 minutes web ps :我事先在testweb容器中创建了testfile.txt文件,内容是Hello docker!,等扩容恢复之后,看此文件是否存在! |
接下来开始备份docker镜像和容器
1
2
3
4
5
|
备份所有docker的container #docker ps -a | grep -v "NAMES" | awk ‘{print $NF}‘|xargs -I {} sh -c "docker export {} > /root/docker_{}.tar" 备份镜像: #docker save -o centos6.tar centos:centos6 #docker save -o centos7.tar centos |
停掉当前正在运行的容器
1
|
#docker stop eab85feb5eee adbf1d4ccc10 |
停掉docker服务并备份docker旧数据
1
2
3
4
5
|
停掉docker #systemctl stop docker 备份docker旧数据 #mkdir /root/docker_backup #cp -a /var/lib/docker/ /root/docker_backup/ |
再将docker旧数据删除
1
|
#rm -rf /var/lib/docker/ |
使用dd命令生成一个大文件作为pool的容量空间,具体大小根据情况自定义
1
2
3
4
5
6
7
8
9
|
#mkdir /var/lib/docker/devicemapper/devicemapper -pv #dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1G count=0 seek=200 #增大到200G 0+0 records in 0+0 records out 0 bytes (0 B) copied, 0.000379694 s, 0.0 kB /s 查看 #ll /var/lib/docker/devicemapper/devicemapper/ total 0 -rw-r--r-- 1 root root 214748364800 Aug 16 16:13 data |
然后启动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
|
启动docker #systemctl start docker 查看docker的pool空间大小 # docker info Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 0 Server Version: 1.12.0 Storage Driver: devicemapper Pool Name: docker-8:2-524675-pool Pool Blocksize: 65.54 kB Base Device Size: 10.74 GB Backing Filesystem: xfs Data file : /dev/loop0 Metadata file : /dev/loop1 Data Space Used: 38.2 MB Data Space Total: 214.7 GB ##可以看到pool的空间已经是200G Data Space Available: 27.45 GB Metadata Space Used: 1.507 MB Metadata Space Total: 2.147 GB Metadata Space Available: 2.146 GB Thin Pool Minimum Free Space: 21.47 GB Udev Sync Supported: true Deferred Removal Enabled: false Deferred Deletion Enabled: false Deferred Deleted Device Count: 0 Data loop file : /var/lib/docker/devicemapper/devicemapper/data Metadata loop file : /var/lib/docker/devicemapper/devicemapper/metadata Library Version: 1.02.107-RHEL7 (2015-10-14) Logging Driver: json- file …… |
剩下的任务就是恢复之前备份的镜像和容器了,查看数据是否恢复成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
恢复images #docker load --input centos6.tar 6b5c6954e3d5: Loading layer [==================================================>] 202.2 MB /202 .2 MB Loaded image: centos:centos6 [root@docker ~] # docker load --input centos7.tar Loaded image: centos:centos6 f59b7e59ceaa: Loading layer [==================================================>] 204.3 MB /204 .3 MB Loaded image: centos:latest 恢复容器 [root@docker ~] # cat docker_testweb.tar | docker import - testweb:new sha256:12f36d4bd6105ec495893df2b356f3d1046ebecafa72a2c60f0ff487806f9dac [root@docker ~] # cat docker_web.tar | docker import - web:new sha256:ef7db6ffb3e0cf59d78dd46deba1e39f047960ec8835552b37c1d724b6ec42d8 查看镜像 #docker images REPOSITORY TAG IMAGE ID CREATED SIZE web new ef7db6ffb3e0 5 seconds ago 269.2 MB testweb new 12f36d4bd610 24 seconds ago 194.6 MB centos centos6 a3c09d36ab4a 2 weeks ago 194.6 MB centos latest 970633036444 2 weeks ago 196.7 MB |
使用testweb镜像重新run起来一个容器,查看在扩容pool空间之间创建的文件是否可以恢复
1
2
3
4
5
6
7
8
9
10
11
12
|
# docker run -d -i -t --privileged -p 5000:80 --name web1 testweb:new /bin/bash 9edc76e959ba336381c58f9ccf570d04818961e9c6e91a164a7ea2b49c6b5a0a 进入容器 #docker attach 222140ba7bc5 [root@222140ba7bc5 ~] # ll total 20 -rw------- 1 root root 2525 Jul 29 14:12 anaconda-ks.cfg -rw-r--r-- 1 root root 7275 Jul 29 14:12 install .log -rw-r--r-- 1 root root 1680 Jul 29 14:11 install .log.syslog -rw-r--r-- 1 root root 14 Aug 16 06:12 testfile.txt #cat testfile.txt Hello docker! #说明是可以正常恢复的 |
补充:如果容器都使用默认的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
|
启动docker服务 # systemctl start docker.service Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details. 报错了,然后根据提示,查看 #systemctl status docker.service ● docker.service - Docker Application Container Engine Loaded: loaded ( /usr/lib/systemd/system/docker .service; disabled; vendor preset: disabled) Active: failed (Result: exit -code) since Wed 2016-08-17 14:55:40 CST; 53s ago Docs: https: //docs .docker.com Process: 2532 ExecStart= /usr/bin/dockerd (code=exited, status=1 /FAILURE ) Main PID: 2532 (code=exited, status=1 /FAILURE ) Memory: 4.0K CGroup: /system .slice /docker .service Aug 17 14:55:39 docker systemd[1]: Starting Docker Application Container Engine... Aug 17 14:55:39 docker dockerd[2532]: time = "2016-08-17T14:55:39.528322618+08:00" level=info msg= "libcontainerd: new containerd process, pid: 2538" Aug 17 14:55:40 docker dockerd[2532]: time = "2016-08-17T14:55:40.549224503+08:00" level=error msg= "[graphdriver] prior storage driver \"devicemapper\" failed: devmapper: Unable to grow loopb...alid argument" Aug 17 14:55:40 docker dockerd[2532]: time = "2016-08-17T14:55:40.549448713+08:00" level=fatal msg= "Error starting daemon: error initializing graphdriver: devmapper: Unable to grow loopback f...alid argument" Aug 17 14:55:40 docker systemd[1]: docker.service: main process exited, code=exited, status=1 /FAILURE Aug 17 14:55:40 docker systemd[1]: Failed to start Docker Application Container Engine. Aug 17 14:55:40 docker systemd[1]: Unit docker.service entered failed state. Aug 17 14:55:40 docker systemd[1]: docker.service failed. Hint: Some lines were ellipsized, use -l to show in full. |
鼎峰胡佳雄
QQ.2881064155
Skype.live:2881064155
在centos6.x和centos7.x环境下停机扩容docker的pool空间
标签:
原文地址:http://www.cnblogs.com/supper-hjx/p/5786706.html