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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:

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

1
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查看

1
2
3
4
5
6
7
8
9
10
11
12
13
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容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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、使用我的脚本动态扩展容器空间

脚本内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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空间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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

1
2
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容器磁盘空间的时候,出现

1
2
3
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






 本文转自 reinxu 51CTO博客,原文链接:http://blog.51cto.com/dl528888/1606170,如需转载请自行联系原作者

目录
打赏
0
0
0
0
347
分享
相关文章
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
针对本地存储和 PVC 这两种容器存储使用方式,我们对 ACK 的容器存储监控功能进行了全新升级。此次更新完善了对集群中不同存储类型的监控能力,不仅对之前已有的监控大盘进行了优化,还针对不同的云存储类型,上线了全新的监控大盘,确保用户能够更好地理解和管理容器业务应用的存储资源。
361 181
docker容器为啥会开机自启动
通过配置适当的重启策略,Docker容器可以在主机系统重启后自动启动。这对于保持关键服务的高可用性和自动恢复能力非常有用。选择适合的重启策略(如 `always`或 `unless-stopped`),可以确保应用程序在各种情况下保持运行。理解并配置这些策略是确保Docker容器化应用可靠性的关键。
282 93
容器化浪潮下的AI赋能:智能化运维与创新应用
近年来,容器技术以其轻量、高效、可移植的特性成为云原生时代的基石,推动应用开发和部署方式革新。随着容器化应用规模扩大,传统运维手段逐渐力不从心。AI技术的引入为容器化生态带来新活力,实现智能监控、自动化故障诊断与修复及智能资源调度,提升运维效率和可靠性。同时,AI驱动容器化创新应用,如模型训练、边缘计算和Serverless AI服务,带来更多可能性。未来,AI与容器技术的融合将更加紧密,推动更智能、高效的运维平台和丰富的创新应用场景,助力数字化转型。
docker快速部署OS web中间件 数据库 编程应用
通过Docker,可以轻松地部署操作系统、Web中间件、数据库和编程应用。本文详细介绍了使用Docker部署这些组件的基本步骤和命令,展示了如何通过Docker Compose编排多容器应用。希望本文能帮助开发者更高效地使用Docker进行应用部署和管理。
44 19
课时5:阿里云容器服务:最原生的集成Docker和云服务
阿里云容器服务以服务化形式构建容器基础设施,大幅提升开发效率,简化应用部署流程。通过Docker容器和DevOps工具(如Jenkins),实现自动化部署与迭代,优化企业内部复杂部署问题。该服务支持GPU调度、混合云架构无缝迁移,并与阿里云产品体系无缝集成,提供安全防护、网络负载均衡等多重功能支持。凭借微服务架构,帮助企业突破业务瓶颈,提高资源利用率,轻松应对海量流量。
课时5:阿里云容器服务:最原生的集成Docker和云服务
Docker+consul容器服务的更新与发现
通过本文的介绍,我们详细探讨了如何结合Docker和Consul来实现容器服务的更新与发现。通过Consul的服务注册和发现功能,可以高效地管理和监控容器化服务,确保系统的高可用性和可扩展性。希望本文能帮助您在实际项目中更好地应用Docker和Consul,提高系统的可靠性和管理效率。
64 23
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
docker运维查看指定应用log文件位置和名称
通过本文的方法,您可以更高效地管理和查看Docker容器中的日志文件,确保应用运行状态可控和可监测。
131 28
ubuntu22 编译安装docker,和docker容器方式安装 deepseek
本脚本适用于Ubuntu 22.04,主要功能包括编译安装Docker和安装DeepSeek模型。首先通过Apt源配置安装Docker,确保网络稳定(建议使用VPN)。接着下载并配置Docker二进制文件,创建Docker用户组并设置守护进程。随后拉取Debian 12镜像,安装系统必备工具,配置Ollama模型管理器,并最终部署和运行DeepSeek模型,提供API接口进行交互测试。
326 15
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等