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

讯享网
可以看到池空间已经被设置为data=1TB和metadata=10GB
二、修改容器空间大小:
1、首先先进入目录(使用yum安装docker的默认目录):
cd /dev/mapper/
2、使用命令查看容器是否正在运行。
docker ps -a

这里可以看到容器test正在运行。
3、使用命令查看容器卷:
dmsetup table

可以看到,这个是卷空间值,我们需要修改的就是这里。
其它的值要记下:253:7 11
4、使用ls或ll命令查看在/dev/mapper/目录下的文件是否存在。(这步很重要,因为非正在运行的Container是不会有这个文件的)

5、使用命令修改容器空间大小:
echo 0 thin 253:7 11 | dmsetup load docker-253:1--95f242e4fe2fef132ab1a706ebf8eecbb1c6db19547c3f12b34b76a5dee96c7e
=这里的会替换原值,意思为:42GB=
计数公式为:4210241024*1024/512
可以使用命令打印:
echo $((42*1024*1024*1024/512))

接着使用命令:
dmsetup resume docker-253:1--95f242e4fe2fef132ab1a706ebf8eecbb1c6db19547c3f12b34b76a5dee96c7e
resize2fs /dev/mapper/docker-253:1--95f242e4fe2fef132ab1a706ebf8eecbb1c6db19547c3f12b34b76a5dee96c7e

完成。
然后进入容器的终端,使用命令df -h即可看到修改后的容器空间:
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 459fdadac24dcdb2bdfc68e3c3b0f291c9153fb54fbd46771 100"; fi
运行脚本方法:
讯享网sh resize_container.sh 459fdadac24dcdb2bdfc68e3c3b0f291c9153fb54fbd46771 100
将容器459fdadac24dcdb2bdfc68e3c3b0f291c9153fb54fbd46771的空间修改为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--pool
Data file: /data1/docker/devicemapper/devicemapper/data
Metadata file: /data1/docker/devicemapper/devicemapper/metadata
Data Space Used: 21498.9 Mb
Data Space Total: .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容器
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@1716fe:~
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--1716fedbd0b247b85d73e83ba5005edc3c6182b59a6ac0939a7
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、使用我的脚本动态扩展容器空间
脚本内容
# 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空间
# 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@1716fe:~
15:24:52 # df -hT
Filesystem Type Size Used Avail Use% Mounted on
rootfs rootfs 20G 475M 19G 3% /
/dev/mapper/docker-8:17--1716fedbd0b247b85d73e83ba5005edc3c6182b59a6ac0939a7
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
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@1716fe:~
15:25:27 # df -hT
Filesystem Type Size Used Avail Use% Mounted on
rootfs rootfs 50G 480M 47G 1% /
/dev/mapper/docker-8:17--1716fedbd0b247b85d73e83ba5005edc3c6182b59a6ac0939a7
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
是无法进行缩减的,仅能进行增加操作。
至于动态增加的原理请参考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--d2d2cef71cc1afdeb79c1a008552f3f9ef9507bb1e04d77f2ad5eac4
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
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/11154.html