linux中docker动态扩展容器空间大小

今天同事要在docker的jenkins容器里安装sdk,当他把他之前安装好的sdk传我时,我才发现居然有16g,docker的容器整个都才只有10个g,还好让我找到个可以动态扩展docker容器的文章,先分享给大家.
  系统:centos 6(64位)
  docker版本:1.7.1
  docker存储引擎:devicemapper
  宿主机分区格式必须是:ext2、ext3、ext4

脚本内容:

#!/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

我这里把jenkins容器的空间调大了30g.

ps:这个脚本只能增大容器的空间,不能缩小,所以请考虑清楚再使用.有兴趣的可以看看下面这篇文章,他讲得更加详细些.

下面是动态扩展的例子

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

时间: 2024-11-08 19:04:35

linux中docker动态扩展容器空间大小的相关文章

docker调整rootfs分区大小及动态扩展容器空间

调整docker中rootfs的分区大小 这里主要介绍的调整Container内rootfs的大小,rootfs默认的是10G,我们可以通过下面的方法增大该大小.     bash-4.1# df -lhT    Filesystem Type Size Used Avail Use% Mounted on    rootfs rootfs 9.8G 1.4G 7.9G 15% /    tmpfs tmpfs 921M 0 921M 0% /dev    shm tmpfs 64M 0 64M

Linux中统计路径下目录的大小脚本

Linux中统计路径下目录的大小脚本如下: 保存成total.sh,然后用total.sh 绝对路径,就能统计路径下目录的大小了 代码: #!/bin/shdu $1 --max-depth=1 | sort -n|awk '{printf "%7.2fM ----> %s\n",$1/http://www.aliyun.com/zixun/aggregation/12560.html">1024,$2}'|sed 's:/.*/\([^/]\{1,\}\)$:\

linux中Docker把应用放到容器里详解

在现实生活中,容器就是用来装东西的东西.把你的应用放到容器里,容器里的环境你可以自由定制,你可以在里面安装配置应用需要的任何东西,然后你可以把这个装载着应用的容器拿到任何地方去运行,这些地方不需要知道容器里面到底有什么,它只需要知道怎么样去运行这个容器就行了.Docker 提供了一系列的工具,让我们把应用放到容器里变得更简单. 镜像与容器 镜像与容器,image and container.基于镜像可以去创建容器,镜像有点像是容器的模板,比如你用 centos 镜像创建一个容器,这个容器里的环境

Linux:centos释放缓存,查看磁盘空间大小,xxx文件夹, 查看文件夹大小,查看剩余内存,查看xxx软件位置,统计某文件夹,统计某文件夹下目录数量,查看文件夹大小,给文件夹下所有的文件赋值权限

一台老的PHP后台服务器,今天用 free -m 查看,发现内存跑满了. 再 top,然后按下shift+m,也就是按内存占用百分比排序,发现排在第一的进程,才占用0.9%,那是什么占用的呢?谷歌了一下,据说是centos为了提高效率,把部分使用过的文件缓存到了内存里.如果是这样的话,我又不需要这样的文件性能,那就可以释放.如下两个命令就可以: #sync #echo 3 > /proc/sys/vm/drop_caches 内存释放后,就占用很低了,如下: Centos上的最终命令是: [ro

如何在Linux中使用gThumb批量调整图片大小

如果你的工作涉及到图片编辑和处理,就一定会有同时对多张图片进行批量大小调整的经历.虽然大多数图片编辑应用都能够非常容易地批量调整多张图片,但对于新手用户来说,总是不太容易轻松找到并使用相关功能,因此本文将向大家介绍如何在 Linux 桌面系统中使用 gThumb 软件来批量调整图片大小. 注意:以下内容都基于 Ubuntu 16.04 操作系统中的 gThumb 3.4.3 版本. 由于主要步骤都以 gThumb 为中心,所以请先确保你在系统中已经安装了该应用.如果没有,可以自行在 Ubuntu

linux中Docker指定网桥和指定网桥IP详解

$ docker network ls NETWORK ID          NAME                DRIVER 7fca4eb8c647        bridge              bridge 9f904ee27bf5        none                null cf03ee007fb4        host                host Bridge 默认bridge网络,我们可以使用docker network inspect

linux中增加Xen虚拟硬盘的大小2种方法

方法一 stacklet提供的镜像太小了,只有10G,所以还要手动增加啊. 给镜像增加40G    代码如下 复制代码 dd if=/dev/zero of=imcat.centos.img bs=1G conv=notrunc count=1 seek=40 1+0 records in 1+0 records out 1073741824 bytes (1.1 GB) copied, 51.9901 s, 20.7 MB/s 扫描检查镜像文件:    代码如下 复制代码 losetup -d

linux中shell脚本自动腾出空间脚本

 系统:centos 5.x 脚本内容:  代码如下 复制代码 cat make_room.sh #!/bin/bash #size=`df -hP|grep /dev/mapper/VolGroup00-LogVol00|awk '{print $4}'|cut -f 1 -d "G"` size=`df -mP|grep /dev/mapper/VolGroup00-LogVol00|awk '{print $4}'` file="/root/sqlbak" i

linux中装载动态库出错的解决办法

运行安装程序时经常看到如下错误: error while loading shared libraries:... error while loading shared libraries: libiustl.so.1: cannot open shared object file: No such file or directory How to do :      if libiustl.so.1 is located in /usr/local/lib,add /usr/local/lib