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
[email protected]:/tmp
15:24:01 # docker inspect test|grep -i add
        "IPAddress": "172.17.0.18",
[email protected]:/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.
[email protected]‘s password:
Last login: Mon Nov 17 14:10:39 2014 from 172.17.42.1
[email protected]:~
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!
[email protected]:/tmp
15:24:46 # ssh 172.17.0.18
[email protected]‘s password:
Last login: Tue Jan 20 15:24:13 2015 from 172.17.42.1
[email protected]:~
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!
[email protected]:/tmp
15:25:24 # ssh 172.17.0.18
[email protected]‘s password:
Last login: Tue Jan 20 15:24:52 2015 from 172.17.42.1
[email protected]:~
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

时间: 2024-08-06 09:44:24

docker高级应用之动态扩展容器空间大小的相关文章

Docker 容器空间大小设置 - 十

一.容器启动 默认存储大小: 1.一种在启动项 docker.service 中配置. 2.在启动项配置调用的 docker-storage 配置文件中配置: 二.Docker 容器默认启动文件: /usr/lib/systemd/system/docker.service # cat /usr/lib/systemd/system/docker.service [Unit] Description=Docker Application Container Engine Documentatio

【Docker常见问题2】如何设置容器日志大小和保留个数

举例:当tomcat容器的运行,容器占用空间越来越大,约1个月就会超过2G,如何解决? 步骤1:查看容器日志大小:假设容器目录为/var/lib/docker/containers,那么执行如下命令 cd /var/lib/docker/containers  #进入默认容器空间目录 du -sh *            #统计文件大小2.4G  de92a5643f7ffb106f8abba21fc0f93996842917a52879153adc95a73312934a-json.log

docker高级应用之动态绑定卷组

之前介绍过docker高级应用之动态扩展容器空间大小(地址:http://dl528888.blog.51cto.com/2382721/1606170),本次介绍如何动态的绑定卷组. 为什么使用卷组呢,比如想把物理机里的目录给予容器共享,或者把物理机的一个目录作为共享目录,做日志搜集等等功能. 默认docker添加卷组是在启动容器的使用使用-v参数 -v, --volume=[]            Bind mount a volume (e.g., from the host: -v /

[Linux] -Docker修改空间大小

Docker默认空间大小分为两个,一个是池空间大小,另一个是容器空间大小. 池空间大小默认为:100G 容器空间大小默认为是:10G 所以修改空间大小也分为两个: 这里使用centos下的yum进行安装的Docker. 首先,修改空间大小,必需使Docker运行在daemon环境下,即先停止正在运行的docker服务: service docker stop 然后使用命令使用daemon环境下运行docker: docker -d 一.修改池空间大小方法: dd if=/dev/zero of=

给VirtualBox上的Ubuntu虚拟机扩展硬盘空间

当初在virtualBox上安装ubantu虚拟机时,分区建议8g然后我就豪爽的给了25G,心想一定够用!万万没想到,我还是要开始折腾给虚拟机扩展硬盘空间了! 步骤总的分两步! (一) 添加虚拟硬盘 VitualBox 4.0以后,添加虚拟硬盘非常简单,可以直接用VBoxManage命令来完成,在windows的cmd下,输入下面的命令行: VBoxManage modifyhd "C:\Users\yuxin\VirtualBox VMs\Dalvik\Dalvik.vdi" –re

ORA-03206,当表空间不够时,如何以添加数据文件的方式扩展表空间

准备导入一个数据库,大约为33G,开始创建的空库表空间为自增到20G,结果自然不够,然后就开始自动扩展表空间大小 使用的如下语句 --自动扩展表空间大小 ALTER DATABASE DATAFILE 'E:\app\oracle\oradata\ORCL\WORKFLOW01.ora' AUTOEXTEND ON NEXT 200M MAXSIZE 60000M; 然后就提示 ORA-03206,块大小超出范围云云 查了一下说是单个文件最大为32G,这里自增的有将近60G,所以就报错了 看了很

Oracle如何查询表空间使用情况?Oracle扩展表空间的方法

一.查询表空间使用情况 select a.tablespace_name as "表空间名",        a.bytes / 1024 / 1024 as "表空间大小(M)",        (a.bytes - b.bytes) / 1024 / 1024 as "已使用空间(M)",        b.bytes / 1024 / 1024 "空闲空间(M)",        round(((a.bytes - b.

用 consul + consul-template + registrator + nginx 打造真正可动态扩展的服务架构

在互联网应用领域,服务的动态性需求十分常见,这就对服务的自动发现和可动态扩展提出了很高的要求. Docker 的出现,以及微服务架构的兴起,让众多开源项目开始关注在松耦合的架构前提下,如何基于 Docker 实现一套真正可动态扩展的服务架构. 基本需求 基本的需求包括: 服务启动后要能自动被发现(vs 传统需要手动进行注册): 负载要能动态在可用的服务实例上进行均衡(vs 传统需要静态写入配置): 服务规模要方便进行快速调整(vs 传统需要较长时间的手动调整). 相关项目 服务发现 服务发现的项

docker高级应用之智能添加与修改防火墙规则

如果你有以下痛苦: 1.使用默认docker0桥接方式: 2.修改防火墙规则的话,使用手动修改配置: 3.并且修改时候还得计算来源端口,防止重复端口使用户登陆错误容器: 4.并当容器意外重启,内网ip变化后还得修改规则 那么你可以看看本文了,对你这些痛处都有解决方法. 目前docker容器设置访问规则的话,就2个方法 1.在docker容器创建的时候,使用-p来设置 2.在容器运行中,获取容器的ip,然后在宿主机的iptables力通过nat链做dnat设置 我之前一直使用第2个方法,但随着我d