Docker实践,Shell脚本自动根据镜像名和端口,启动docker容器,运行springcloud项目

文章目录

  • Shell脚本自动启动docker容器
    • 背景
    • Shell脚本编写
    • 待完善
    • 相关学习
      • JAVA资深架构师成长路线->分布式扩展到微服务架构>Docker

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

你可能感兴趣的:(Linux,Shell,Docker,SpringBoot)