为了账号安全,请及时绑定邮箱和手机立即绑定

docker停机扩容pool空间

标签:
Docker


我这里使用docker的容器做测试机给开发使用,使用都没问题,但随着项目增加,有的项目需要更大的硬盘,我通过(http://dl528888.blog.51cto.com/2382721/1606170)来动态扩展容器的空间,满足使用需求,但我当前设置的docker pool却不足了(默认pool是100g,每个容器给予10g空间),如果pool满了就无法新创建容器,并且无法删除数据来清理(我使用dd来测试),所以为了解决此问题,我准备:

1、备份当前容器与p_w_picpaths;

2、停止docker服务;

3、扩展pool的大小(从100g扩大到自定义大小);

4、启动docker并恢复容器与p_w_picpaths。

下面是备份前docker的信息

09:54:52 # docker version

Client version: 1.1.2

Client API version: 1.13

Go version (client): go1.2.2

Git commit (client): d84a070/1.1.2

Server version: 1.1.2

Server API version: 1.13

Go version (server): go1.2.2

Git commit (server): d84a070/1.1.2

root@ip-10-10-29-224:~

09:54:56 # docker info

Containers: 15

Images: 10

Storage Driver: devicemapper

 Pool Name: docker-8:3-22676231-pool

 Data file: /var/lib/docker/devicemapper/devicemapper/data

 Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata

 Data Space Used: 95999.2 Mb

 Data Space Total: 102400.0 Mb

 Metadata Space Used: 51.4 Mb

 Metadata Space Total: 2048.0 Mb

Execution Driver: native-0.2

Kernel Version: 2.6.32-431.29.2.el6.x86_64

可以看到docker是1.1.2版本,pool是100g,目前使用了95G

下面是我具体的备份操作步骤

1、记录所有容器对应的ip及防火墙策略

我当前docker主机使用默认docker0做桥接,容器重启后ip会变更,为了方便修改防火墙策略,所以我记录所有docker主机的ip及防火墙策略

记录docker主机ip可以参考使用命令

docker ps -a|grep -v "NAMES"|awk '{print $NF}'|xargs   -I {} sh -c "docker inspect {}|grep -i add"

备份防火墙策略

cp /etc/sysconfig/iptables /tmp/iptables_backup

2、备份所有docker的container

如果扩展pool的话,默认的p_w_picpaths与容器都会被清除,所以得备份

docker ps -a|grep -v "NAMES"|awk '{print $NF}'|xargs   -I {} sh -c "docker export {} >/tmp/docker_backup/containers/docker_{}.tar"

3、打包备份所有的p_w_picpaths

docker p_w_picpaths|grep -v "REPOSITORY"|awk '{print $1":"$2}' >docker_p_w_picpaths.txt && docker save -o /tmp/docker_backup/p_w_picpaths/`cat docker_p_w_picpaths.txt|cut -d/ -f2`.tar `cat docker_p_w_picpaths.txt` && rm -rf docker_p_w_picpaths.txt

4、停止当前docker所有container

docker stop `docker ps -a -q`

5、停止docker服务

/etc/init.d/docker stop

6、备份旧的docker数据

cp -a /var/lib/docker /tmp/docker_backup/data_backup

备份数据是为了进行失败回滚

7、删除旧的docker数据库

rm -rf /var/lib/docker

8、增大pool容量

2个方法,一个是使用dd,一个是使用docker daemon命令

使用dd的,把pool增大到600G

dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1G count=0 seek=600

seek后面是大小

使用docker daemon的

--storage-opt dm.loopdatasize=600G --storage-opt dm.loopmetadatasize=8G

9、启动docker

/etc/init.d/docker start

10、恢复p_w_picpaths

cd /tmp/docker_backup/p_w_picpaths/

docker load test1:new<test1.tar

使用docker load一个一个的恢复吧

11、恢复容器

cd /tmp/docker_backup/containers/

cat test1.tar |docker import - test1:new

12、启动容器并记录ip

上一步恢复的话,是把备份的容器做成了p_w_picpaths,如果想启动就进行docker run,比如我有个p_w_picpaths是test1:new

 docker run --privileged -d   --name="test1"   test1:new /usr/sbin/sshd -D

13、调整防火墙

记住新的容器ip,并根据第一步备份的防火墙策略,进行修改

心得:

如果容器都使用默认的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

这个错误在google里查看有2个方法解决,但我测试了,都未解决

第一个方法是说物理内存不足,第二个方法是说使用docker临时目录

具体issue参考https://github.com/coreos/coreos-vagrant/issues/49

所以建议大家进行别动态扩展容器磁盘空间,尽量使用volume来挂载。

另外1.3及以上我测试是无法对容器进行动态扩展空间,给官方提出issue也没人回答,地址是https://github.com/docker/docker/issues/11153

©著作权归作者所有:来自51CTO博客作者dl528888的原创作品,如需转载,请注明出处,否则将追究法律责任

docker迁移docker备份docker扩容运维自动化专题


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消