linux中docker動態擴充容器空間大小

來源:互聯網
上載者:User

今天同事要在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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.