docker在线扩容及相关问题

hcwei 2020年06月10日 67次浏览

问题描述

由于nexus私服容器空间占满导致私服无法正常访问,需要对容器进行在线扩容,于是用度娘找了个自动扩容的脚本,完成了此次扩容。脚本如下:

#!/bin/bash

# 此处xxx换成root密码,操作docker需要sudo权限
password="xxx"

#  操作示例
if [ -z $1 ] || [ -z $2 ]; then
echo "Usage: container_name increase_capacity"
echo "Example: I want increase 20G to test"
echo "The command is: sh `basename $0` test 20"
exit 1
fi

#  判断容器是否存在
if [ `echo $password | sudo -S docker inspect $1 &>>/dev/null && echo 0 || echo 1` -eq 1 ];then
echo "The container $1 is no exist!"
exit 1
fi

# 获取容器id
container_id=`echo $password | sudo -S docker inspect -f '{{ .Id }}' $1`   
# 获取扩容前的容器大小
now_disk=`echo $password | sudo -S 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

#  更改当前卷的信息表
echo $password | sudo -S dmsetup table /dev/mapper/docker-*-$container_id|sed "s/0 [0-9]* thin/0 $disk thin/"|dmsetup load /dev/mapper/docker-*-$container_id
#  激活新的信息表
echo $password | sudo -S dmsetup resume /dev/mapper/docker-*-$container_id
#  修改文件系统大小
echo $password | sudo -S 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

此脚本需要两个参数,一个是容器名称、一个是扩容后的大小(单位G),假如扩容的容器名为nexus,需要扩容到20G,脚本名称为docker_add_storge.sh,可以用sh docker_add_storge.sh nexus 20指令完成扩容。

注意事项:
此方式扩容后会导致容器停止后无法启动。解决办法:首先启动容器docker start nexus,让其生成dm文件,此时会报错,不要理会,再重新运行下此脚本即可。

参考文章:https://www.cnblogs.com/liuyansheng/p/6114444.html