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

docker高级应用之动态扩展容器空间大小

标签:
Docker


docker容器默认的空间是10G,如果想指定默认容器的大小(在启动容器的时候指定),可以在docker配置文件里通过dm.basesize参数指定,比如

docker -d --storage-opt dm.basesize=20G

是指定默认的大小为20G,具体参数可以参考https://github.com/docker/docker/tree/master/daemon/graphdriver/devmapper

上面方法只是真的生成容器的时候进行的,并且修改后需要重启docker,无法做到动态给运行容器指定大小,下面我介绍一下如何动态的扩展容器空间大小。

动态扩展的优点:

1、不需要修改docker配置,并且重启docker服务;

2、可以直接对运行中的容器进行动态扩展(只能增,无法缩);

缺点:

1、docker所在宿主机分区的格式必须是ext2、ext3、ext4;

2、docker存储引擎必须是devicemapper

存储引擎查看,可以使用docker info查看

15:25:49 # docker info

Containers: 5

Images: 62

Storage Driver: devicemapper

 Pool Name: docker-8:17-37748738-pool

 Data file: /data1/docker/devicemapper/devicemapper/data

 Metadata file: /data1/docker/devicemapper/devicemapper/metadata

 Data Space Used: 21498.9 Mb

 Data Space Total: 102400.0 Mb

 Metadata Space Used: 13.7 Mb

 Metadata Space Total: 2048.0 Mb

Execution Driver: lxc-1.0.6

Kernel Version: 3.10.0-123.el7.x86_64

从上面的Storage Driver可以看到我使用的引擎。

下面是动态扩展的例子:

1、新建立个test容器

15:23:48 # docker run --privileged -d  -p 22 --name='test' docker.ops-chukong.com:5000/centos6-http:new /usr/bin/supervisord

1716fe941926dbd0b247b85d73e83b9465322a5005edc3c6182b59a6ac0939a7

root@ip-10-10-27-221:/tmp

15:24:01 # docker inspect test|grep -i add

        "IPAddress": "172.17.0.18",

root@ip-10-10-27-221:/tmp

15:24:08 # ssh 172.17.0.18

The authenticity of host '172.17.0.18 (172.17.0.18)' can't be established.

RSA key fingerprint is 39:7c:13:9f:d4:b0:d7:63:fc:ff:ae:e3:46:a4:bf:6b.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '172.17.0.18' (RSA) to the list of known hosts.

root@172.17.0.18's password:

Last login: Mon Nov 17 14:10:39 2014 from 172.17.42.1

root@1716fe941926:~

15:24:13 # df -hT

Filesystem           Type    Size  Used Avail Use% Mounted on

rootfs               rootfs  9.8G  470M  8.8G   5% /

/dev/mapper/docker-8:17-37748738-1716fe941926dbd0b247b85d73e83b9465322a5005edc3c6182b59a6ac0939a7

                     ext4    9.8G  470M  8.8G   5% /

shm                  tmpfs    64M     0   64M   0% /dev/shm

/dev/sdb1            ext4    1.8T   30G  1.7T   2% /.dockerinit

/dev/sda3            ext4    518G   30G  462G   6% /etc/resolv.conf

/dev/sdb1            ext4    1.8T   30G  1.7T   2% /etc/hostname

/dev/sdb1            ext4    1.8T   30G  1.7T   2% /etc/hosts

/dev/sdb1            ext4    1.8T   30G  1.7T   2% /.dockerenv

可以看到我运行test容器的根分区是ext4分区,容器是10G

2、使用我的脚本动态扩展容器空间

脚本内容

15:22:12 # cat dynamic_modify_docker_disk.sh

#!/bin/bash

#This script is dynamic modify docker container disk

#Author Deng Lei

if [ -z $1 ] || [ -z $2 ]; then

    echo "Usage: container_name increase_capacity"

    echo "Example: I want increase 11G to test"

    echo "The command is:   sh `basename $0` test 11"

    exit 1

                                                                                                    fi

if [ `docker inspect $1 &>>/dev/null &&  echo 0 || echo 1` -eq 1 ];then

    echo "The container $1 is no exist!"

  exit 1

fi

container_id=`docker inspect -f '{{ .Id }}' $1`

now_disk=`dmsetup table /dev/mapper/docker-*-$container_id|awk '{print $2}'`

disk=$(($2*1024*1024*1024/512))

if [ $disk -lt $now_disk ];then

    echo "I can't shink container $1 from $(($now_disk*512/1024/1024/1024))G to ${2}G!I only modify contanier increase disk!"

  exit 1

fi

dmsetup table /dev/mapper/docker-*-$container_id|sed "s/0 [0-9]* thin/0 $disk thin/"|dmsetup load /dev/mapper/docker-*-$container_id

dmsetup resume /dev/mapper/docker-*-$container_id

resize2fs /dev/mapper/docker-*-$container_id

if [ $? -eq 0 ];then

    echo "dynamic container $1 disk to ${2}G is success!"

else

    echo "dynamic container $1 disk to ${2}G is fail!"

fi

目前给test容器进行动态增加20G空间

15:24:40 # sh dynamic_modify_docker_disk.sh test 20

dynamic container test disk to 20G is success!

root@ip-10-10-27-221:/tmp

15:24:46 # ssh 172.17.0.18

root@172.17.0.18's password:

Last login: Tue Jan 20 15:24:13 2015 from 172.17.42.1

root@1716fe941926:~

15:24:52 # df -hT

Filesystem           Type    Size  Used Avail Use% Mounted on

rootfs               rootfs   20G  475M   19G   3% /

/dev/mapper/docker-8:17-37748738-1716fe941926dbd0b247b85d73e83b9465322a5005edc3c6182b59a6ac0939a7

                     ext4     20G  475M   19G   3% /

shm                  tmpfs    64M     0   64M   0% /dev/shm

/dev/sdb1            ext4    1.8T   30G  1.7T   2% /.dockerinit

/dev/sda3            ext4    518G   30G  462G   6% /etc/resolv.conf

/dev/sdb1            ext4    1.8T   30G  1.7T   2% /etc/hostname

/dev/sdb1            ext4    1.8T   30G  1.7T   2% /etc/hosts

/dev/sdb1            ext4    1.8T   30G  1.7T   2% /.dockerenv

可以看到已经增加成功

下面在给test增加到50G

15:25:21 # sh dynamic_modify_docker_disk.sh test 50

dynamic container test disk to 50G is success!

root@ip-10-10-27-221:/tmp

15:25:24 # ssh 172.17.0.18

root@172.17.0.18's password:

Last login: Tue Jan 20 15:24:52 2015 from 172.17.42.1

root@1716fe941926:~

15:25:27 # df -hT

Filesystem           Type    Size  Used Avail Use% Mounted on

rootfs               rootfs   50G  480M   47G   1% /

/dev/mapper/docker-8:17-37748738-1716fe941926dbd0b247b85d73e83b9465322a5005edc3c6182b59a6ac0939a7

                     ext4     50G  480M   47G   1% /

shm                  tmpfs    64M     0   64M   0% /dev/shm

/dev/sdb1            ext4    1.8T   30G  1.7T   2% /.dockerinit

/dev/sda3            ext4    518G   30G  462G   6% /etc/resolv.conf

/dev/sdb1            ext4    1.8T   30G  1.7T   2% /etc/hostname

/dev/sdb1            ext4    1.8T   30G  1.7T   2% /etc/hosts

/dev/sdb1            ext4    1.8T   30G  1.7T   2% /.dockerenv

也可以增加成功

但我要是像缩减到30G

15:25:45 # sh dynamic_modify_docker_disk.sh test 30

I can't shink container test from 50G to 30G!I only modify contanier increase disk!

是无法进行缩减的,仅能进行增加操作。

至于动态增加的原理请参考http://jpetazzo.github.io/2014/01/29/docker-device-mapper-resize/

FAQ:

centos 7里使用docker的时候默认存储引擎是devicemapper

在进行动态调整docker容器磁盘空间的时候,出现

resize2fs 1.42.9 (28-Dec-2013)

resize2fs: Device or resource busy while trying to open /dev/mapper/docker-253:1-1270544-d2d2cef71c86910467c1afdeb79c1a008552f3f9ef9507bb1e04d77f2ad5eac4

Couldn't find valid filesystem superblock.

原因是resize2fs仅能支持ext2、ext3、ext4,不支持xfs

所以建议docker服务器的文件系统格式调整为ext4

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

添加空间docker动态增加硬盘运维自动化专题

5


点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消