Docker虛擬化技術系列之-自動化部署管理

隨着企業Docker容器越來越多,如果要靠手工去管理docker,肯定非常吃力,而且也不現實,這就需要我們把日常的操作變成自動化管理,通過腳本工具,將工作減輕到最小,解放運維人員,如下爲企業Docker自動化部署腳本V1版本,如果需要更多其他的功能,可以自己定製和修改。

如下自動化管理腳本功能:

1)通過YUM自動安裝Docker平臺;

2)通過該腳本,可以自動配置橋接網絡;

3)自動創建docker容器,基於centos操作系統;

4)自動收集創建好的Docker容器,集中管理;

5)通過PIPEWORK工具手動指定獨立IP地址;

概要:該腳本能夠自動安裝並配置docker虛擬化及橋接網絡,同時使用pipework這個軟件來配置我們的容器IP,能夠實現容器的一個簡單的管理:

#!/bin/bash
#auto install docker and Create VM
#by jfedu.net wugk 2015-02-05
#Define PATH Varablies
#######################
IPADDR=`ifconfig |grep "Bcast"|awk '{print $2}'|cut -d: -f2|grep "192.168"|head -1`
GATEWAY=`route -n|grep "UG"|awk '{print $2}'|grep "192.168"|head -1`
IPADDR_NET=`ifconfig |grep "Bcast"|awk '{print $2}'|cut -d: -f2|grep "192.168"|head -1|awk -F. '{print $1"."$2"."$3"."}'`
LIST="/root/docker_vmlist.csv"

if [ -f /etc/init.d/docker ];then
	sed -i -e '/^exec/d' -e '/^prog/aexec=\"/usr/bin/\$prog --storage-driver devicemapper --storage-opt dm.loopdatasize=2000G --storage-opt dm.loopmetadatasize=10G --storage-opt dm.fs=ext4 --storage-opt dm.basesize=40G\"' /etc/init.d/docker
fi

for i in `seq 1 253`;do ping -c 1 ${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\n\n$DOCKER_IPADDR"

if [ ! -e /etc/sysconfig/network-scripts/ifcfg-eth0 ];then
	echo -e "\033[32mThe ifcfg-eth0 Interface is not exist,Please exit or change scripts.\nYou can to exec\nsed -i \'s/eth0/eth0/g\' $0\033[0m"
	exit 0
fi

NETWORK=(
    HWADDR=`ifconfig eth0 |egrep "HWaddr|Bcast" |tr "\n" " "|awk '{print $5,$7,$NF}'|sed -e 's/addr://g' -e 's/Mask://g'|awk '{print $1}'`
    IPADDR=`ifconfig eth0 |egrep "HWaddr|Bcast" |tr "\n" " "|awk '{print $5,$7,$NF}'|sed -e 's/addr://g' -e 's/Mask://g'|awk '{print $2}'`
    NETMASK=`ifconfig eth0 |egrep "HWaddr|Bcast" |tr "\n" " "|awk '{print $5,$7,$NF}'|sed -e 's/addr://g' -e 's/Mask://g'|awk '{print $3}'`
    GATEWAY=`route -n|grep "UG"|awk '{print $2}'`
)

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 4 8\033[0m" 
	exit 0
fi


#CPU=`expr $2 - 1`
#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 [ ! -f $LIST ];then
	CPU_COUNT=$1	
	CPU_1="0"
	CPU1=`expr $CPU_1 + 0`
	CPU2=`expr $CPU1 + $CPU_COUNT - 1`
	if [ $CPU2 -gt $CPU_ALL ];then
		echo -e "\033[32mThe System CPU count is $CPU_ALL,not more than it.\033[0m"
		exit
	fi
else
	CPU_COUNT=$1	
	CPU_1=`cat $LIST|tail -1|awk -F"," '{print $4}'|awk -F"-" '{print $2}'`
	CPU1=`expr $CPU_1 + 1`
	CPU2=`expr $CPU1 + $CPU_COUNT - 1`
	if [ $CPU2 -gt $CPU_ALL ];then
		echo -e "\033[32mThe System CPU count is $CPU_ALL,not more than it.\033[0m"
		exit
	fi
fi

MEM_F=`echo $2 \* 1024|bc`
MEM=`printf "%.0f\n" $MEM_F`
DISK=40
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

if [ ! -e /etc/init.d/docker ];then
	rpm -e epel-release --nodeps
	rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
	yum install docker-io -y
	yum install device-mapper*  -y
	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
	/etc/init.d/docker start
	sed -i -e '/^exec/d' -e '/^prog/aexec=\"/usr/bin/\$prog --storage-driver devicemapper --storage-opt dm.loopdatasize=2000G --storage-opt dm.loopmetadatasize=10G --storage-opt dm.fs=ext4 --storage-opt dm.basesize=40G\"' /etc/init.d/docker
	if [ $? -ne 0 ];then
		echo "Docker install error ,please check."
		exit 
	fi
fi	


cd  /etc/sysconfig/network-scripts/
    mkdir -p /data/backup/`date +%Y%m%d-%H%M`
    yes|cp ifcfg-eth* /data/backup/`date +%Y%m%d-%H%M`/
if
    [ -e /etc/sysconfig/network-scripts/ifcfg-br0 ];then
	echo
else
    cat >ifcfg-eth0 <<EOF
    DEVICE=eth0
    BOOTPROTO=none
    ${NETWORK[0]}
    NM_CONTROLLED=no
    ONBOOT=yes
    TYPE=Ethernet
    BRIDGE="br0"
    ${NETWORK[1]}
    ${NETWORK[2]}
    ${NETWORK[3]}
    USERCTL=no
EOF
    cat >ifcfg-br0 <<EOF
    DEVICE="br0"
    BOOTPROTO=none
    ${NETWORK[0]}
    IPV6INIT=no
    NM_CONTROLLED=no
    ONBOOT=yes
    TYPE="Bridge"
    ${NETWORK[1]}
    ${NETWORK[2]}
    ${NETWORK[3]}
    USERCTL=no
EOF

    /etc/init.d/network restart

fi


echo 'Your can restart Ethernet Service: /etc/init.d/network restart !'
echo '---------------------------------------------------------'

cd -
#######create docker container
service docker status >>/dev/null
if [ $? -ne 0 ];then 
	/etc/init.d/docker restart
fi

NAME="Docker_`echo $DOCKER_IPADDR|awk -F"." '{print $(NF-1)"_"$NF}'`"
#IMAGES=`docker p_w_picpaths|grep -v "REPOSITORY"|grep -v "none"|head -1|awk '{print $1}'`
IMAGES=`docker p_w_picpaths|grep -v "REPOSITORY"|grep -v "none"|grep "nginx"|head -1|awk '{print $1}'`
CID=$(docker run -itd --privileged --cpuset-cpus=${CPU1}-${CPU2} -m ${MEM}m --net=none --name=$NAME $IMAGES /bin/bash)

if [ -z $IMAGES ];then
	echo "Plesae Download Docker Centos Images,you can to be use docker search centos,and docker pull centos6.5-ssh,exit 0"
	if [ ! -f /export/jfedu_new_base_img_6.5_v83_nginx.tar ];then
		echo "Please exec -it scp jfedu_new_base_img_6.5_v83_nginx.tar for docker server."
		exit
	fi

	docker load --input /export/jfedu_new_base_img_6.5_v83_nginx.tar
fi

if [ ! -f /usr/local/bin/pipework ];then
	yum install wget unzip zip -y
	wget https://github.com/jpetazzo/pipework/archive/master.zip
        unzip master
        cp pipework-master/pipework  /usr/local/bin/
        chmod +x /usr/local/bin/pipework
        rm -rf master
fi

ip netns >>/dev/null
if [ $? -ne 0 ];then
	rpm -e iproute --nodeps
        wget -c https://repos.fedorapeople.org/openstack/EOL/openstack-grizzly/epel-6/iproute-2.6.32-130.el6ost.netns.2.x86_64.rpm
	rpm -ivh --nodeps --force iproute-2.6.32-130.el6ost.netns.2.x86_64.rpm
fi
pipework br0 $NAME  $DOCKER_IPADDR/24@$IPADDR

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 -eq "" ]];then
        NUM="1"
else
        NUM=`expr $NUM + 1`
fi
##################	
echo -e "\033[32mCreate virtual client Successfully.\n$NUM `echo $CID|cut -b 1-12`,$NAME,$CPU1-$CPU2,${MEM}M,${DISK}G,$DOCKER_IPADDR,$IPADDR,$USER,$REMARK\033[0m"
if [ -z $USER ];then
	USER="NULL"
	REMARK="NULL"
fi
echo $NUM,`echo $CID|cut -b 1-12`,$NAME,$CPU1-$CPU2,${MEM}M,${DISK}G,$DOCKER_IPADDR,$IPADDR,$USER,$REMARK >>$LIST
rm -rf /root/docker_vmlist_*
iconv -c -f utf-8 -t gb2312 $LIST  -o /root/docker_vmlist_`date +%H%M`.csv

腳本演示效果如下:

wKioL1ir93rhM-UoAABDH7Oy5Z8303.png

如上提示結果,有ERROR錯誤提示,是因爲當前系統已經有重名的Docker,但是IP地址不同,可以通過修改腳本避免該問題!沒有任何報錯,則創建Docker成功!

你若覺得作者的文章寫得不錯,請獎勵作者幾錠銀子,讓作者感受到來自你滿滿的鼓勵和繼續創作的動力!我們支持原創!鼓勵原創!

打賞之後,文章底部顯示參與打賞者的記錄,可以直接通過微信掃描打賞喲,直接按打賞根據提示操作。

自定義打賞金額,友情提示打賞金額不要超過50元哦,土豪可以隨意哦,51CTO謝謝您對作者的支持!謝謝你的慷慨大方!

wKioL1lDsc3i7hEqAAAfoPude7I249.png


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章