Docker實踐,Shell指令碼自動根據映象名和埠,啟動docker容器,執行springcloud專案

若依不棄發表於2019-08-13

Shell指令碼自動啟動docker容器

背景

Docker實踐,部署SpringCloud微服務中,是部署SpringCloud專案的流程,微服務構架原因要經常執行4、5個相同映象的容器來作為叢集,達到微服務高可用。

Shell指令碼編寫

感覺啟動的命令過於複雜,於是編寫了個Shell指令碼來執行映象,以下是原始碼:

#/bin/bash 根據映象名和埠,用docker啟動容器,執行springcloud專案
#映象名
IMAGE_NAME=$1
#服務埠號
SERVER_PORT=$2
#Eureka例項的ip
IP=$3

while true
do
	if [ ! -n "${IMAGE_NAME}" ];then
		echo "請輸入映象名:"
		read IMAGE_NAME
	fi
	IMAGE=`echo "${IMAGE_NAME}" | awk -F: '{print $1}'`
	TAG=`echo "${IMAGE_NAME}" | awk -F: '{print $2}'`
	if [ ! -n "${TAG}" ];then
		TAG="latest"
	fi
	IMAGE_NAME=`echo "${IMAGE}:${TAG}"`
#	echo "1: ${IMAGE_NAME}"
	EXIT_IMAGE=`docker image ls | awk '{print $1":"$2}' | grep ${IMAGE_NAME}`
#	echo "2: ${EXIT_IMAGE}"

	EXIT_IMAGE_ARR=($EXIT_IMAGE)
	flag=0;
	for s in ${EXIT_IMAGE_ARR[@]}
	do
#		echo "3: $s"
		if [ "$s" == "$IMAGE_NAME" ];then
				flag=1
		fi
	done
#	echo "4:$flag"
	if (($flag==0));then
		echo "映象名不存在,請重新輸入:"
		read IMAGE_NAME
	else
		break
	fi
done

#判斷埠號是否已被佔用
while true
do
	if [ ! -n "${SERVER_PORT}" ];then
					echo "請輸入埠號:"
					read SERVER_PORT
	fi
	
	port_num=`netstat -tunlp | grep ${SERVER_PORT} | wc -l`
	if [ $port_num -gt 0 ];then
					netstat -tunlp | grep ${SERVER_PORT}
					echo "埠${SERVER_PORT}已被佔用,請重新輸入埠:"
					read SERVER_PORT
	else
			break
	fi
done

TIMESTAMP=`date +%s`
#生成的容器名
CONTAINER_NAME="${IMAGE}-${SERVER_PORT}"

#判斷容器是否已存在,存在則刪除 docker ps | grep hzsh-eureka-service2-1562035224 | awk '{print $1}'
CID=`docker ps -a| grep ${CONTAINER_NAME} | awk '{print $1}'`
if [ ! -z ${CID} ]; then
   docker rm -f ${CID}
fi

#是否傳入ip地址,若無則取宿主機的外網ip 暫時未實現 /sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"
if [ ! -n "$3" ] ; then
    IP=`ifconfig | grep inet | grep -v inet6 | awk '{print $2}' | grep 10.152`
fi


#執行 docker run命令 建立並啟動容器
CID=`docker run -d --expose=${SERVER_PORT} -p ${SERVER_PORT}:${SERVER_PORT} -e "SERVER_PORT=${SERVER_PORT}" -e "EUREKA_INSTANCE_IP_ADDRESS=${IP}" --name ${CONTAINER_NAME} ${IMAGE_NAME}`
#輸出容器名
echo "${CONTAINER_NAME}" 

待完善

以上還有許多不足,後續有時間會繼續完善。

相關學習

JAVA資深架構師成長路線->分散式擴充套件到微服務架構>Docker

相關文章