容器管理脚本

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