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

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

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

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))

接着使用命令:

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

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

完成。

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

写了个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,如需转载请自行联系原作者

Docker修改空间大小相关推荐

  1. docker高级应用之动态扩展容器空间大小

    docker容器默认的空间是10G,如果想指定默认容器的大小(在启动容器的时候指定),可以在docker配置文件里通过dm.basesize参数指定,比如 docker -d --storage-op ...

  2. Docker 扩容 容器空间大小 - 九

    Docker 扩容: 提前规划 : 一是从宿主机 配置磁盘格式 LVM 宿主机可以动态扩展: 二是 在容器上的扩容:默认是 100G .然后创建容器时候 挂载目录 或者直接池扩展: 默认 Docker ...

  3. oracle--查看表空间大小以及修改表空间大小

    为什么80%的码农都做不了架构师?>>>      一.修改表空间大小 解决以上问题的办法:通过增大表空间即可解决,如下: Sql代码   使用dba用户登陆 sqlplus  /  ...

  4. docker安装php怎么修改配置,怎么给docker配置内存大小?

    怎么给docker配置内存大小? 解决docker配置内存大小的方法: 一.挂载docker中的配置文件通过将docker中tomcat的catalina.sh配置文件挂载到宿主机中,然后再catal ...

  5. oracle修改表空间最大,oracle_Oracle修改表空间大小的方法,本文讲述了Oracle修改表空间大 - phpStudy...

    Oracle修改表空间大小的方法 本文讲述了Oracle修改表空间大小的方法.分享给大家供大家参考,具体如下: 1)查看各表空间分配情况 SQL> select tablespace_name, ...

  6. Oracle查看表空间大小以及修改表空间大小

    问题描述: 一.修改表空间大小 二.查看表空间大小及相关的sql 1.查看表空间的名称及大小 2.查看表空间物理文件的名称及大小 3.查看回滚段名称及大小 4.查看控制文件 5.查看日志文件 6.查看 ...

  7. oracle 修改表空间大小

    1.查询表空间使用情况: select a.tablespace_name,        a.bytes / 1024 / 1024 "sum MB",        (a.by ...

  8. 查看修改swap空间大小

    查看swap 空间大小(总计):       # free -m          默认单位为k, -m 单位为M                total       used       free ...

  9. 修改oracle超空间大小,Oracle修改表空间大小详解

    在向orale数据库导入数据的时候报 ORA-01658: 无法为表空间 XXX中的段创建 INITIAL 区错误. Oracle我在创建表空间的时候初始化大小为200M,当数据库中数据量达到这个值, ...

最新文章

  1. ubuntu中如何使用中文输入法
  2. MySQL中MyISAM引擎与InnoDB引擎性能简单测试
  3. 阿里云Kubernetes服务 - Service Broker快速入门指南
  4. html 渐变透明写法,CSS3透明度+渐变
  5. java从入门到精通第11章_《Java从入门到精通》第十章学习笔记
  6. 前端获取后端传来的session_用java编写一个web程序,登陆后,把用户信息放在session中,前端怎样获取session的值?...
  7. 激光雷达和相机联合标定 之 开源代码和软件汇总 (2004-2021)
  8. TCP三次握手与四次挥手的过程及原因
  9. 关于keil5开发stc8等51单片机程序和在线调试的步骤
  10. 国家开放大学专科计算机应用实训项目,国家开放大学电大专科《微机系统与维护》网络课实训1实训3作业及答案.docx...
  11. 基于单片机的液体点滴速度监控设计
  12. 近几年Linux TCP相关的漏洞被夸大了
  13. 装完系统还要装什么_Win7安装完成之后需要优化什么?让win7更加轻快
  14. 直线一级倒立摆数学建模与控制仿真
  15. (原)Opencv中直方图均衡和图像动态范围拉伸的代码
  16. java键盘监听wasd控制_dota2rpg自定义按键绑定及WASD移动的实现
  17. 【C#】QQ消息自动发送代码
  18. 【STM32入门100步--学习笔记】USART串口接收程序(含教学视频)
  19. 数据分析面试(一)统计基础篇
  20. 用于自动驾驶的混合稀疏-稠密单目SLAM系统

热门文章

  1. android Word 显示文档结构图
  2. WebKit 布局的标准和概念
  3. android 评论输入框(PopupWindow)
  4. 正则表达式: 正向预查和负向预查
  5. Cisco配置单臂路由及静态路由
  6. Yii2 的 redis 应用
  7. Navicat Premium mysql
  8. Google Code Jam Round 1A 2015 解题报告
  9. Filtering microblogging messages for Social TV
  10. NetBeans Weekly News - Issue # 446 - Jul 20, 2010