博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Docker修改空间大小
阅读量:6489 次
发布时间:2019-06-24

本文共 8834 字,大约阅读时间需要 29 分钟。

Docker默认空间大小分为两个,一个是池空间大小,另一个是容器空间大小。


池空间大小默认为:100G


容器空间大小默认为是:10G


所以修改空间大小也分为两个:


这里使用centos下的yum进行安装的Docker。
 


首先,修改空间大小,必需使Docker运行在daemon环境下,即先停止正在运行的docker服务


service docker stop

然后使用命令使用daemon环境下运行docker:

docker -d


一、修改池空间大小方法:



dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1G count=0 seek=1000

dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/metadata bs=1G count=0 seek=10


上面的1000为1TB大小,即为数据池空间大小为1TB,而10则为Metadata的空间大小,10GB


从运行完后,使用命令查看docker池空间大小:


docker info

6088-20150914134649570-433746920.png


可以看到池空间已经被设置为data=1TB和metadata=10GB


二、修改容器空间大小:


1、首先先进入目录(使用yum安装docker的默认目录):


cd /dev/mapper/

 

2、使用命令查看容器是否正在运行。


docker ps -a

6088-20150914135228539-1355556805.png

这里可以看到容器test正在运行。


 
3、使用命令查看容器卷:


dmsetup table

6088-20150914140021414-2074738876.png

可以看到20971520,这个是卷空间值,我们需要修改的就是这里。


其它的值要记下:253:7 11

 

4、使用ls或ll命令查看在/dev/mapper/目录下的文件是否存在。(这步很重要,因为非正在运行的Container是不会有这个文件的)

6088-20150914135414726-1511560152.png

5、使用命令修改容器空间大小:



echo 0 
88080384
 thin 253:7 11 | dmsetup load docker-253:1-184549824-95f242e4fe2fef132ab1a706ebf8eecbb1c6db19547c3f12b34b76a5dee96c7e


这里的88080384会替换原20971520值,
意思为:42GB。


计数公式为:42*1024*1024*1024/512


可以使用命令打印:


echo $((42*1024*1024*1024/512))

6088-20150914142524320-2002221055.png

接着使用命令:



dmsetup resume docker-253
:1-184549824-95f242e4fe2fef132ab1a706ebf8eecbb1c6db19547c3f12b34b76a5dee96c7e


resize2fs /dev/mapper/docker-253
:1-184549824-95f242e4fe2fef132ab1a706ebf8eecbb1c6db19547c3f12b34b76a5dee96c7e

6088-20150914142640179-103405636.png

完成。



然后进入容器的终端,使用命令df -h即可看到修改后的容器空间:

6088-20150914142806711-2040683371.png


写了个shell脚本,用于修改池、容器空间使用:


1、
resize_docker.sh


#!/bin/bash


DATA_SIZE=$1

METADATA_SIZE=$2



if [ "$DATA_SIZE" = "" ]; then

    DATA_SIZE=1000

fi



if [ "$METADATA_SIZE" = "" ]; then

    METADATA_SIZE=10

fi



# Stop docker service



systemctl stop docker



# Resize docker data space



dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1G count=0 seek=$DATA_SIZE



# Resize docker metadata space



dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/metadata bs=1G count=0 seek=$METADATA_SIZE



# Start docker service

systemctl start docker


运行脚本方法:


sh resize_docker.sh 1000 10


将会把docker的池修改为data=1TB,metadata=10GB




2、
resize_container.sh


#!/bin/bash


CID=$1

SIZE=$2



if [ "$CID" != "" ] && [ "$SIZE" != "" ]; then

    DEV=$(basename $(echo /dev/mapper/docker-*-$CID));

    dmsetup table $DEV | sed "s/0 [0-9]* thin/0 $(($SIZE*1024*1024*1024/512)) thin/" | dmsetup load $DEV;

    dmsetup resume $DEV;

    resize2fs /dev/mapper/$DEV;

  echo "Resize $CID completed."

else

    echo "Usage: sh resize_container 459fd505311ad364309940ac24dcdb2bdfc68e3c3b0f291c9153fb54fbd46771 100";

fi


运行脚本方法:


sh resize_container.sh 459fd505311ad364309940ac24dcdb2bdfc68e3c3b0f291c9153fb54fbd46771 100 


将容器459fd505311ad364309940ac24dcdb2bdfc68e3c3b0f291c9153fb54fbd46771的空间修改为100GB



注:
修改空间,必需是在docker的daemon模式下进行





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













通过命令可以观察到
/var/lib/Docker目录很大
,我的主机只有20G,这个目录占了18G;原因是devicemapper的空间设的太大,通过docker info打印的Data Space Total参数可以看到,默认是107.4G。 


思路如下:

备份当前容器、镜像;

删除/var/lib/docker目录;

使用dd命令重设大小;

恢复容器、镜像;

工具:

需要额外空间保存备份文件,可以挂载一个u盘或者云盘。


docker save 可以导出镜像 tar文件;

docker export 可以导出容器 tar文件;


备份好之后停止docker



# /etc/init.d/docker stop  


删除/var/lib/docker目录;



mkdir -p /var/lib/docker/devicemapper/devicemapper/data  


dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1M count=0 seek=8192  


建立的文件最大为 1M * 8192 = 8G


启动docker



# /etc/init.d/docker start  


使用docker info看看Data Space Total,检查是否设置成功


docker load 可以导入镜像tar文件为 镜像


注意load用法为:docker load image1:new<image1.tar


docker import 可以导入容器tar文件为 镜像


注意import用法为: cat container1.tar |docker import - container1:new

本文转自 chengxuyonghu 51CTO博客,原文链接:http://blog.51cto.com/6226001001/1952804,如需转载请自行联系原作者
你可能感兴趣的文章
讨喜的隔离可变性(十)使用Transactor
查看>>
手把手玩转win8开发系列课程(28)
查看>>
重温SQL——行转列,列转行
查看>>
【SQL 学习】排序问题之order by与索引排序
查看>>
设置mysql最大连接数的方法
查看>>
Android UI组件----自定义ListView实现动态刷新
查看>>
Redis 数据库结构
查看>>
【C/C++学院】0813-C与CPP不同以及命名空间简介/函数重载与函数默认参数/泛型auto/Newdelete...
查看>>
Apache MINA (2) Hello World!
查看>>
阿里云服务器CentOS5.8安装WAS6.1
查看>>
【黑马Android】(03)学生管理系统/动态刷新界面
查看>>
DP的学习
查看>>
单链表
查看>>
Codeforces Round #311 (Div. 2) A. Ilya and Diplomas
查看>>
【springmvc+mybatis项目实战】杰信商贸-20.合同货物数和附件数
查看>>
PostgreSQL ssl ciphers performance compare
查看>>
最新版SDWebImage的使用
查看>>
Java IO: 字符流的Buffered和Filter
查看>>
【SSH项目实战】国税协同平台-25.查询条件回显
查看>>
JAVA导出EXCEL并下载
查看>>