阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

137次阅读
没有评论

共计 5833 个字符,预计需要花费 15 分钟才能阅读完成。

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

CentOS 6/ 7 系列安装 Docker http://www.linuxidc.com/Linux/2014-07/104768.htm

Docker 的搭建 Gitlab CI 全过程详解 http://www.linuxidc.com/Linux/2013-12/93537.htm

Docker 安装应用(CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm

在 Docker 中使用 MySQL http://www.linuxidc.com/Linux/2014-01/95354.htm

在 Ubuntu Trusty 14.04 (LTS) (64-bit)安装 Docker http://www.linuxidc.com/Linux/2014-10/108184.htm

Docker 安装应用(CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm

Ubuntu 14.04 安装 Docker  http://www.linuxidc.com/linux/2014-08/105656.htm

阿里云 CentOS 6.5 模板上安装 Docker http://www.linuxidc.com/Linux/2014-11/109107.htm

Docker 的详细介绍:请点这里
Docker 的下载地址:请点这里

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计5833字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中