Docker容器学习梳理 - 容器硬盘热扩容

时间:2021-11-11 07:54:49

前面已介绍了docker很多知识点的操作记录,今天这里梳理下docker容器空间扩展的操作。默认情况下,物理机下创建的docker容器的空间是10G(虚拟机下创建的docker容器空间就是虚拟机的空间)。在实际生产环境下,对docker容器进行热扩容(动态扩容)是非常重要的一个需求。

Docker容器动态扩展的优点:
1)不需要修改docker配置,不需要重启docker服务;
2)可以直接对运行中的容器进行动态扩展(只能增,无法缩);

Docker容器动态扩展的条件:
1)docker所在宿主机分区的格式必须是ext2、ext3、ext4;
2)docker存储引擎必须是devicemapper

下面的操作均是在centos6下操作的:

宿主机分区的格式是ext4
[root@localhost ~]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda3 ext4 193G 103G 80G 57% /
tmpfs tmpfs 32G 0 32G 0% /dev/shm
/dev/sda1 ext4 194M 79M 106M 43% /boot
/dev/sda2 ext4 721G 136G 549G 20% /home 1)下载私有仓库里的镜像(centos6和centos7下的docker命令和配置还是有所不同的)
[root@localhost ~]# vim /etc/sysconfig/docker
......
other_args='--insecure-registry=192.168.1.23:5000'
..... [root@localhost ~]# service docker restart
Stopping docker: [ OK ]
Starting docker: [ OK ] [root@localhost ~]# docker pull 192.168.1.23:5000/tomcat7
latest: Pulling from 192.168.1.23:5000/tomcat7
3690474eb5b4: Pull complete
0a444b299d5a: Pull complete
a04895de1996: Pull complete
08e1d80f2b80: Pull complete
fa7cc393f68b: Pull complete
Digest: sha256:b28f263bb8d5de3c93d64e85a5e9ee5cd6a1042f45ecbb951888d897d99e14e2
Status: Downloaded newer image for 192.168.1.23:5000/tomcat7:latest [root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
192.168.1.23:5000/tomcat7 latest fa7cc393f68b 2 weeks ago 562.3 MB 2)创建容器
[root@localhost ~]# docker run -ti -d --name my-test -p 8998:8080 192.168.1.23:5000/tomcat7 /bin/bash
813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3 [root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
813389572d7f 192.168.1.23:5000/tomcat7 "/bin/bash" 29 seconds ago Up 28 seconds 0.0.0.0:8998->8080/tcp my-test [root@localhost ~]# docker exec -ti my-test /bin/bash
[root@813389572d7f /]# df -HT
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3 ext4 9.9G 703M 8.7G 8% /
tmpfs tmpfs 34G 0 34G 0% /dev
shm tmpfs 68M 0 68M 0% /dev/shm
/dev/sda3 ext4 207G 111G 86G 57% /etc/hosts 注意
容器my-test的大小为默认的10G。
上面命令结果中的/dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3文件就是my-test容器存储的文件名。 3)--------------下面开始进行容器空间的动态扩容------------------ 使用dmsetup查看该文件扇区信息.下面命令结果中的第二个数字(即20971520)是设备的大小,表示有多少个 512-bytes 的扇区. 这个值略高于 10GB 的大小。
[root@localhost ~]# dmsetup table /dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3
0 20971520 thin 253:0 13 计算20G所需扇区数目
[root@localhost ~]# echo $((20*1024*1024*1024/512))
41943040 精简快照目标的一个神奇的特点是它不会限制卷的大小。当创建它的时候,一个精简的卷使用0个块,当开始往块里面写入的时候,它们会从共用的块池中进行分配。
可以写0个块,或者是10亿个块,这个和精简快照目标没关系。文件系统的大小只和Device Mapper表有关系。
只需要装载一个新的表,这个完全和之前的是一样的,但是有更多的扇区。仅此而已。 将新的扇区大小写入,注意只是改变旧表中的第二个数字20971520的数字,其他数字不变!
[root@localhost ~]# echo 0 41943040 thin 253:0 13 | dmsetup load /dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3 将修改后的容器存储文件激活
[root@localhost ~]# dmsetup resume /dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3 重新查看文件信息
[root@localhost ~]# dmsetup table /dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3
0 41943040 thin 253:0 13 更改文件系统大小,使变更生。
[root@localhost ~]# resize2fs /dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3 is mounted on /var/lib/docker/devicemapper/mnt/813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 2
Performing an on-line resize of /dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3 to 5242880 (4k) blocks.
The filesystem on /dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3 is now 5242880 blocks long. ------------------------------------------------------------------------------------------------------------------
如果这一步出现下面报错:
resize2fs 1.42.9 (28-Dec-2013)
resize2fs: 设备或资源忙 当尝试打开 /dev/mapper/docker-253:0-268868570-2163383f446357876b301fb3942b706436b5eea111c06a3acba0006ec5272372 时找不到有效的文件系统超级块. 原因是resize2fs仅能支持ext2、ext3、ext4,不支持xfs。将docker服务器的文件系统格式调整为ext4即可。
本文操作机是centos6系统,分区都是ext4格式,故不会出现这个报错
------------------------------------------------------------------------------------------------------------ 再次登录my-test容器,发现容器大小已经更新为20G!
[root@localhost ~]# docker exec -ti my-test /bin/bash
[root@813389572d7f /]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3 ext4 20G 708M 18G 4% /
tmpfs tmpfs 32G 0 32G 0% /dev
shm tmpfs 64M 0 64M 0% /dev/shm
/dev/sda3 ext4 193G 103G 80G 57% /etc/hosts --------------------------------------------------------------------------------------------
扩容后可能出现的问题:停止该容器后,无法重新启动-
当容器扩容之后,由于dm认为设备块大小仍然为之前设置的初始大小,所以会发生无法起启动的情况,这时只要重新操作即可。
必须要先启动一下,让其生成dm文件才能修改
[root@localhost ~]# docker start my-test
#此时会报错,不要理会,执行以下操作即可
[root@localhost ~]# echo 0 41943040 thin 253:3 725 | dmsetup load /dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3
[root@localhost ~]# dmsetup resume /dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3
--------------------------------------------------------------------------------------------

为了方便后续容器动态扩容,可以采用下面的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

比如给my-test容器动态扩容到30G

[root@localhost ~]# chmod 755 Dynamic_Modify_Docker_Disk.sh
[root@localhost ~]# sh Dynamic_Modify_Docker_Disk.sh my-test 30
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3 is mounted on /var/lib/docker/devicemapper/mnt/813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3; on-line resizing required
old desc_blocks = 2, new_desc_blocks = 2
Performing an on-line resize of /dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3 to 7864320 (4k) blocks.
The filesystem on /dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3 is now 7864320 blocks long. dynamic container my-test disk to 30G is success! 登陆容器查看,已扩容至30G!
[root@localhost ~]# docker exec -ti my-test /bin/bash
[root@813389572d7f /]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3 ext4 30G 708M 28G 3% /
tmpfs tmpfs 32G 0 32G 0% /dev
shm tmpfs 64M 0 64M 0% /dev/shm
/dev/sda3

动态扩容后,对容器进行重启,会发生报错,此时再运行一次该脚本进行重新扩容(空间大小要等于或大于之前的设置,出现报错不用管),再启动容器即可注意:docker容器目前是无法进行动态缩减的,仅能进行增加操作)。

================================================================================
这里需要注意一下:
上面的操作在centos6下进行docker容器的硬盘扩容可以顺利完成,但在centos7下进行这些操作可能有点问题。
虽然centos 7里使用docker的时候默认存储引擎是devicemapper,但是在docker容器硬盘扩容的resize2fs这一步会出现类似下面报错:
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,而xfs是CentOS7的默认文件系统类型
所以建议docker服务器的文件系统格式调整为ext4(在centos7系统安装时可以手动指定所在分区为ext4格式)。

======================下面说下Docker镜像和容器存放目录修改方法======================

这里为了测试效果,将xfs格式的home分区盘卸载,格式化为ext4后重新挂载(当然也可以再用之前的xfs格式)。然后将Docker的镜像、容器存放目录由之前默认的/var/lib/docker修改为home分区下的路径。
(当然,也可以另外新建一个分区,格式化,然后直接挂载到/var/lib/docker目录下)
[root@localhost ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root xfs 150G 5.7G 145G 4% /
devtmpfs devtmpfs 32G 0 32G 0% /dev
tmpfs tmpfs 32G 0 32G 0% /dev/shm
tmpfs tmpfs 32G 474M 31G 2% /run
tmpfs tmpfs 32G 0 32G 0% /sys/fs/cgroup
/dev/mapper/centos-home xfs 774G 33M 774G 1% /home
/dev/sda2 xfs 397M 120M 278M 31% /boot
tmpfs tmpfs 6.3G 0 6.3G 0% /run/user/0 [root@localhost ~]# umount /home/ //卸载home分区盘
[root@localhost ~]# mkfs.ext4 /dev/mapper/centos-home //格式化home盘为ext4文件格式
[root@localhost ~]# mount /dev/mapper/centos-home /home //重新挂载
[root@localhost ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root xfs 150G 5.7G 145G 4% /
devtmpfs devtmpfs 32G 0 32G 0% /dev
tmpfs tmpfs 32G 0 32G 0% /dev/shm
tmpfs tmpfs 32G 474M 31G 2% /run
tmpfs tmpfs 32G 0 32G 0% /sys/fs/cgroup
/dev/sda2 xfs 397M 120M 278M 31% /boot
tmpfs tmpfs 6.3G 0 6.3G 0% /run/user/0
/dev/mapper/centos-home ext4 762G 73M 723G 1% /home 接着就可以移动Docker的数据到ext4格式的home磁盘上了:
先停止docker服务,保证移动的时候数据完整
[root@localhost ~]# service docker stop 移动Docker的目录到一个备份的目录(可以mv改目录名,docker重启后会自动生成这个目录;也可以将目录下内容全部拷贝到别处,届时要想恢复docker数据,只需要将备份内容拷贝回来,然后重启docker服务即可)
[root@localhost ~]# mv /var/lib/docker /var/lib/docker_bak //这样,再次启动docker服务后,镜像及容器数据都不在了。只有将拷贝内容移回来,数据才会恢复。 修改开启自挂载配置,将home分区由之前的xfs改为ext4.
[root@localhost ~]# cat /etc/fstab #
# /etc/fstab
# Created by anaconda on Wed Oct 19 15:16:20 2016
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=349c9816-43e9-4c46-991a-e34e2370ab3f /boot xfs defaults 0 0
/dev/mapper/centos-home /home ext4 defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0 [root@localhost ~]# mount -a //这条命令是重新加载/etc/fstab文件,没有文件里定义的分区挂载没有挂,这条命令就会自动挂载上。
[root@localhost ~]# mount |grep home
/dev/mapper/centos-home on /home type ext4 (rw,relatime,seclabel,data=ordered) 最后修改docker的镜像和容器存放路径,比如修改为/home/var/docker。
[root@localhost ~]# mkdir -p /home/var/docker
[root@localhost ~]# vim /etc/sysconfig/docker
......
OPTIONS='--selinux-enabled --log-driver=journald --graph=/home/var/docker' //添加--graph=/home/var/docker参数 然后启动docker服务,发现在新指定的目录/home/var/docker下产生了新数据
[root@localhost ~]# service docker start
[root@localhost ~]# ls /home/var/docker/
containers devicemapper image network tmp trust volumes 接着恢复之前的镜像数据
[root@localhost ~]# service docker stop
[root@localhost ~]# rm -rf /home/var/docker/*
[root@localhost ~]# mv /var/lib/docker_bak/* /home/var/docker/
[root@localhost ~]# service docker start
[root@localhost ~]# docker images //发现镜像数据已恢复到新目录/home/var/docker下了
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.1.23:5000/tomcat7 latest 47c5123914a1 8 days ago 562.3 MB
docker.io/redis latest 83d6014ac5c8 13 days ago 183.6 MB
docker.io/ubuntu latest 0ef2e08ed3fa 5 weeks ago 130 MB
docker.io/centos latest 67591570dd29 3 months ago 191.8 MB
docker.io/tomcat latest ebb17717bed4 5 months ago 355.4 MB

================================温馨提示================================

1)无法卸载分区
[root@localhost ~]# umount /home/
umount: /home: device is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1)) 如上,卸载分区时提示无法卸载,则是有进程占用/home。
可以使用下面命令来终止占用进程:
[root@localhost ~]# fuser -m -k /home
/home: 1409 1519ce 1531e 1532e 1533e 1534e 1535e 1536e 1537e 1538e 1539e 1541e 1543e 1544e 1545e 1546e 1547e 1548e 1549e 1550e 1601m 再次卸载home分区就成功了。
[root@localhost ~]# umount /home/ -k 表示自动把霸占home分区的进程kill掉!
如果你不是很明确是否要杀死所有霸占设备的程序,还可以加一个-i 参数,这样每杀死一个程序前,都会询问!(即fuser -m -v -i -k /home) 2)如按照上面步骤,将docker的存放目录更换到/home/var/docker下。
如果后续再对home分区进行强制卸载,然后再重新挂载或格式化的时候,会发现有报错:
[root@localhost ~]# fuser -m -k /home
[root@localhost ~]# mkfs.ext4 /dev/mapper/centos-home
mkfs.ext4: /dev/mapper/centos-home contains a mounted filesystem
[root@localhost ~]# mount/dev/mapper/centos-home
mount: /dev/mapper/centos-home is already mounted or /home busy 这是因为docker数据还占用着home分区,需要将docker服务停了才可以。

Docker容器学习梳理 - 容器硬盘热扩容的更多相关文章

  1. Docker容器学习梳理 - 容器间网络通信设置(Pipework和Open vSwitch)

    自从Docker容器出现以来,容器的网络通信就一直是被关注的焦点,也是生产环境的迫切需求.容器的网络通信又可以分为两大方面:单主机容器上的相互通信,和跨主机的容器相互通信.下面将分别针对这两方面,对容 ...

  2. Docker容器学习梳理 - 容器时间跟宿主机时间同步

    在Docker容器创建好之后,可能会发现容器时间跟宿主机时间不一致,这就需要同步它们的时间,让容器时间跟宿主机时间保持一致.如下: 宿主机时间 [root@slave-1 ~]# date Fri M ...

  3. Docker容器学习梳理 - 容器登陆方法梳理(attach、exec、nsenter)

    对于运行在后台的Docker容器,我们运维人员时常是有登陆进去的需求.登陆Docker容器的方式:1)使用ssh登陆容器.这种方法需要在容器中启动sshd,存在开销和攻击面增大的问题.同时也违反了Do ...

  4. Docker容器学习梳理 - 日常操作总结

    使用Docker已有一段时间了,今天正好有空梳理下自己平时操作Docker时的一些命令和注意细节: Docker 命令帮助 $ sudo docker Commands: attach Attach ...

  5. Docker容器学习梳理 - 应用程序容器环境部署

    关于国内Docker镜像,可以参考:Docker容器学习梳理--基础知识(2) 的Docker镜像使用. 如果我们需要在Docker环境下部署tomcat.redis.mysql.nginx.php等 ...

  6. Docker容器学习梳理 - 基础知识(2)

    之前已经总结了Docker容器学习梳理--基础知识(1),但是不够详细,下面再完整补充下Docker学习的一些基础. Docker是个什么东西 Docker是一个程序运行.测试.交付的开放平台,Doc ...

  7. Docker容器学习梳理 - 基础知识(1)

    Docker是PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源.Docker是通过内核虚拟化技 ...

  8. Docker容器学习梳理 - Dockerfile构建镜像

    在Docker的运用中,从下载镜像,启动容器,在容器中输入命令来运行程序,这些命令都是手工一条条往里输入的,无法重复利用,而且效率很低.所以就需要一 种文件或脚本,我们把想执行的操作以命令的方式写入其 ...

  9. Docker容器学习梳理 - Volume数据卷使用

    之前部署了Docker容器学习梳理--基础环境安装,接下来看看Docker Volume的使用. Docker volume使用 Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker ...

随机推荐

  1. C#如何实现下载文件保存到本地上面去

    public void btnTemplate_Click(object sender, EventArgs e) { string strResult = string.Empty; string ...

  2. 邮件协议(SMTP)性能测试总结(Foxmail邮箱)

    先介绍一下邮件协议SMTP的工作机制(连接和发送过程),用wireshark工具抓包进行分析,如下: SMTP协议的工作机制(连接和发送过程): 1.建立TCP连接,并将邮件服务器地址给客户端: 2. ...

  3. php 大流量网站访问

    1:确认服务器硬件能否支持当前流量 2:数据库优化,用到什么字段查什么字段,减轻查询负担. 3:静态化,缓存,减少连库操作. 4:禁止外部盗链,减轻负载压力. 5:控制文件下载大小,尽量不超过2M,有 ...

  4. SQL Server 2008 还原数据库

    1.得到数据库备份文件,怎么得到的,[能够看这里]~ 2.把备份文件加个.bak 的后缀,比如: 3.打开SQL , 你能够新建一个空数据库 , 或者利用原有的数据库 , 点击右键>>任务 ...

  5. ECharts 环形饼图 动态获取json数据

    ECharts  环形饼图 动态获取json数据 效果图如下: 一.html部分 <div id="secondPieChart" style="width:100 ...

  6. PMP知识点(五)&mdash&semi;&mdash&semi;配置管理

    配置控制重点关注可交付成果及各个过程的技术规范,而变更控制则着眼于识别.记录.批准或否决对项目文件,可交付成果或基准的变更. 包括在实施整体变更控制过程中的部分配置管理活动有: 1.配置识别. 识别与 ...

  7. JAVA学习笔记(4)—— 排序算法

    排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. 排序算法大体可分为两种: 一种是比较排序,时间复杂度O(nlogn) ...

  8. 【转】VMware 全屏显示

    首先解决一个问题:配置虚拟机,发现屏幕大小太小 需要安装vmware tools ,屏幕就会自适应 但是安装vmware tools 的按钮是灰的,所以我首先就是安装它     [来源]

  9. 用jquery添加新元素很容易,面对jquery append 动态添加的元素事件on 不起作用我们该如何解决呢?

    用jquery添加新元素很容易,面对jquery append 动态添加的元素事件on 不起作用我们该如何解决呢?on方法中要先找到原选择器(如例.info),再找到动态添加的选择器(如列.delet ...

  10. Docker Macvlan网络部署

    Macvlan Bridge模式 节点1创建 docker network create -d macvlan --subnet=172.100.1.0/24 --gateway=172.100.1. ...