容器管理脚本
```
Docker 虚拟化容器管理脚本实战。
检测Linux系统是否配置Docker;
脚本要提供自动部署Docker引擎服务并且启动;
可以自动下载CentOS操作系统镜像(仓库源);
判断局域网可用的IP地址,给容器设置静态IP;
启动Docker容器设定容器的CPU、内存、默认硬盘空间;
启动Docker容器设定容器的Name名称,以IP编号命名;
收集Docker容器基础信息(容器ID、宿主机IP、容器IP、容器名称、容器资源配置);
将容器的所有信息持久化存储到数据库表、Excel表格中;
能够实现CPU、内存、硬盘容量在线扩容功能(高级功能)
使用ssh登录启动的容器
```
实现效果

```shell
#!/bin/bash
IPADDR_NET="172.18.12" #docker容器使用的网段
GATEWAY=`route -n|awk 'NR==3{print $2}'`
IPADDR=`ifconfig|grep $(route -n|awk 'NR==3{print $2}'|awk -F. '{print $1"."$2"."$3"."}')|awk '{print $2}'|head -1`
LIST="docker_vmlist.csv"
if [ ! -f /usr/sbin/ifconfig ];then
yum install -y net-tool* -y >/dev/null 2>&1
fi
function inst_docker(){
if [ ! -e /usr/bin/docker ];then
echo "install docker..."
yum install docker* device-mapper* lxc -y >/dev/null 2>&1
mkdir -p /export/docker/
cd /var/lib/ ;rm -rf docker; ln -s /export/docker/ .
mkdir -p /var/lib/docker/devicemapper/devicemapper
dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1G count=0 seek=2000 >/dev/null 2>&1
service docker start >/dev/null 2>&1
if [ $? -ne 0 ];then
echo "Docker inatall error ,please check."
exit
fi
fi
}
if [ ! -e /usr/bin/docker ];then
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce
mkdir -p /etc/docker/
systemctl start docker
systemctl enable docker
cat >> /etc/docker/daemon.json <<EOF
{
"registry-mirrors" : [ "https://8xpk5wnt.mirror.aliyuncs.com" ]
}
EOF
sleep 1
systemctl restart docker
if [ -f "/usr/bin/docker" ];
then
echo "docker $(docker version|grep Version)安装成功"
else
echo "安装失败"
exit 1
fi
fi
#-o 和 || (or 逻辑或) 两个条件满足任意一个,整个大条件为真
if [ -z "$1" -o -z "$2" ];then
echo -e "\033[32m-------------------------------------\033[0m"
echo -e "\033[32mPlease exec $0 CPU(C) MEM(G),EXAMPLE: $0 2 4\033[0m"
exit 0
fi
if [[ $(docker network ls|grep mynet|wc -l) == "0" ]];then
docker network create --driver bridge --subnet=${IPADDR_NET}.0/24 --gateway=${IPADDR_NET}.254 mynet
docker network inspect mynet >/dev/null
fi
#for i in {1..253};
for i in `seq 1 253`;
do
ping -c1 ${IPADDR_NET}.${i} ;[ $? -ne 0 ] && DOCKER_IPADDR="${IPADDR_NET}.${i}" && break;
done >> /dev/null 2>&1
echo "###################"
#echo -e "Dynamic get docker IP,The Docker IP address:$DOCKER_IPADDR"
echo -e "动态获取Docker IP,Docker的IP地址为:$DOCKER_IPADDR"
if [ ! -e /usr/bin/bc ];then
yum install bc -y >>/dev/null 2>&1
fi
CPU_ALL=`cat /proc/cpuinfo |grep processor|wc -l`
if [[ $(ls |grep $LIST|wc -l) == 0 ]];then
CPU_CONT=$1 #执行脚本传入第一个参数指定设置容器的CPU核数
CPU1="0"
CPU2=`expr $CPU1 + $CPU_CONT - 1`
if [[ `expr $CPU2 + 1` -gt $CPU_ALL ]];then
echo -e "\033[32mThe System CPU count is $CPU_ALL,not more then it.\033[0m"
exit
fi
else
CPU_CONT=$1
CPU_1=`cat $LIST |tail -1|awk -F"," '{print $4}'|awk -F"_" '{print $2}'`
CPU1=`expr $CPU_1 + 1`
CPU2=`expr $CPU1 + $CPU_CONT - 1`
if [[ `expr $CPU2 + 1` -gt $CPU_ALL ]];then
echo -e "\033[32mThe System CPU count is $CPU_ALL,not more then it.\033[0m"
exit
fi
fi
MEM_F=`echo $2 \* 1024 |bc`
MEM=`printf "%.0f\n" $MEM_F`
DISK=20
USER=$3
REMARK=$4
ping $DOCKER_IPADDR -c 1 >>/dev/null 2>&1
if [ $? -eq 0 ];then
echo -e "\033[32m-------------------------------------\033[0m"
echo -e "\033[32mThe IP address to be used,Please change other IP,exit.\033[0m"
exit 0
fi
########create docker container
systemctl status docker >/dev/null 2>&1
if [ $? -ne 0 ];then
service docker restart >/dev/null 2>&1
fi
NAME="virtual_$DOCKER_IPADDR"
IMAGES=`docker images|grep docker.io/lemonbar/centos6-ssh|awk '{print $1}'`
if [ -z $IMAGES ];then
docker pull docker.io/lemonbar/centos6-ssh >/dev/null 2>&1 ##jdeathe/centos-ssh
#echo "Please Download Docker Centos IMAGES,you can to be use docker search centos,and docker pull"
fi
IMAGES=`docker images|grep lemonbar/centos6-ssh|awk '{print $1}'`
#-e TZ="Asia/Shanghai" (时区) -h hadoop01.com (主机名)
docker run -itd -e TZ="Asia/Shanghai" \
-h $NAME --network=mynet --ip $DOCKER_IPADDR \
--privileged --cpuset-cpus=${CPU1}-${CPU2} -m ${MEM}m --name=$NAME $IMAGES >/dev/null 2>&1
function DEBUG(){
echo "docker run -itd \
-h $NAME --network=mynet --ip $DOCKER_IPADDR \
--privileged --cpuset-cpus=${CPU1}-${CPU2} -m ${MEM}m --name=$NAME $IMAGES"
}
CID=`docker ps|grep $NAME|awk '{print $1}'`
docker ps -a|grep $NAME
if [ ! -e $LIST ];then
echo "编号,容器ID,容器名称,CPU,内存,硬盘,容器IP,宿主机IP,使用人,备注" > $LIST
fi
##################
NUM=`cat $LIST |grep -v CPU|tail -1|awk -F, '{print $1}'`
if [[ $NUM == "" ]];then
NUM="1"
else
NUM=`expr $NUM + 1 `
fi
##################
if [ -z $USER ];then
USER="NULL"
REMARK="NULL"
fi
echo -e "\033[32mCreate virtual client Successfully.\033[0m"
echo -e "\033[32mID: $NUM ,容器ID: $CID ,容器名称: $NAME ,CPU: $CPU1-$CPU2,内存: ${MEM}M ,硬盘: ${DISK}G ,容器IP: $DOCKER_IPADDR ,宿主机IP: $IPADDR ,使用者: $USER ,备注: $REMARK\033[0m"
echo $NUM,$CID,$NAME,${CPU1}_${CPU2},${MEM}M,${DISK}G,$DOCKER_IPADDR,$IPADDR,$USER,$REMARK >> $LIST
rm -rf docker_vmlist_*
iconv -c -f utf-8 -t gb2312 $LIST -o docker_vmlist_`date +%H%M`.csv
```