使用脚本在docker一键安装应用mysql,redis超多应用

转载自 桥柠小站 后续会持续更新脚本增加更多功能

脚本内容

  1. Mysql
  2. Redis
  3. Nacos
  4. Ngxin
  5. Rocketmq
  6. ElasticSearch
  7. Kibana
  8. LogStash
  9. Docker安装
  10. JDK下载

以下为脚本代码

#!/bin/bash

application="" #应用名称,如nacos
image="" #镜像名称,如nacos/nacos-server
applicationPath="/opt/${application}" # 本地映射地址
port="" # 端口号
passwd="1234" # 密码
version="latest" # 镜像版本号,默认为最新版本
dockerRunCmd="" # 最后执行的docker run命令 


# 判断是否删除已有容器
function delExisting(){
	id=`docker ps -a | grep $1 | awk '{print $1}'`
	if [ "$id" != "" ];then
		echo -e "\n建议删除已有容器,如果保留旧容器极大可能会冲突,导致创建失败!"
		echo -e "或者您可以修改脚本默认配置,来处理可能出现的冲突问题\n"
		read -p "发现docker中已存在$1容器,id:$id,请确认是否删除并重新安装!(y|n):" input
			
		case $input in 
			[yY][eE][sS]|[yY])
				echo -e "\n开始删除id=$id 的容器……\n"
				docker stop $id &> /dev/null
				docker rm $id &> /dev/null
				echo -e "删除成功!\n\n"
				;;
			[nN][oO]|[nN])
				echo -e "您选择保留旧容器,请注意创建新容器时的名称及端口号,防止出现冲突!\n"
				;;
			*)
			echo "请输入(Y/y|N/n)"
			exit
		esac
	fi
}

# 输入版本号并拉取镜像
function docker_pull(){
	read -p "请输入$application镜像的版本(默认为${version}):" inputVersion
	if [ "$inputVersion" != "" ];then
		version=$inputVersion
	fi

	echo -e "\n开始拉取$image:$version镜像,请等待……\n"
	sleep 1
	docker pull $image:$version
	if [ $? -eq 0 ];then
		echo -e "\n镜像拉取成功!"
	else
		echo -e "\n镜像拉取失败,请重试或确认 $image:$version 镜像是否存在!"
		exit
	fi
}

# 创建本地文件映射目录
function create_file_path(){
	sleep 1
	rm -rf ${applicationPath}/*
	if [ "$1" ];then
		
		echo -e "\n==========开始创建映射到本机的目录$@=========="

		for i in "$@"
		do
			mkdir -p ${applicationPath}/$i &> /dev/null
			ls $applicationPath | grep $i &> /dev/null 
			if [ $? -eq 0 ];then
				echo -e "本地文件映射目录$i创建成功!"
				chmod -R 777 ${applicationPath}
			else
				echo -e "本地文件映射目录$i创建失败!"
				exit
			fi
		done
	else
		mkdir -p ${applicationPath} &> /dev/null
	fi
}

# 判断容器是否启动成功
function successOrNot(){
	sleep 2
	echo -e "docker run命令:\n $dockerRunCmd \n"
	if [[ -n $(docker ps -q -f "name=^$application$") ]];then
		echo -e "$application 容器启动成功"
		echo -e "\t端口号:$port"
		echo -e "\t容器名称:$application"
		echo -e "\t本地映射路径:$applicationPath"
		echo -e "进入容器使用命令:docker exec -it $application /bin/bash"
	else
		echo "$application 容器启动失败,请检查docker run命令是否有误"
	fi
}


# 安装MySql
docker_mysql(){

	application="mysql"
	image="mysql"
	applicationPath="/opt/$application"
	port="3306"
	passwd="1234"

	echo -e "\n=========================开始安装MySql========================="
	# 删除已有容器
	delExisting ${application} 
	# 输入版本号并拉取镜像
	docker_pull
	# 创建映射目录
	create_file_path conf logs data mysql-files
	
	# 将配置写进配置文件
	sleep 1
	echo -e "\n开始写入配置文件……"
	sleep 1
	
	cat >${applicationPath}/conf/my.cnf<<-EOF 
				[client]
				default-character-set = utf8mb4

				[mysqld]
				pid-file= /var/run/mysqld/mysqld.pid
				socket= /var/run/mysqld/mysqld.sock
				datadir= /var/lib/mysql
				secure-file-priv= NULL

				# Custom config should go here
				# 字符集
				character_set_server=utf8mb4
				collation-server=utf8mb4_unicode_ci
				# 创建新表时将使用的默认存储引擎
				default-storage-engine=INNODB

				# 是否对sql语句大小写敏感,0:大小写敏感,1:忽略大小写区别。,只能在初始化服务器时配置。禁止在服务器初始化后更改
				# 设置为2时,表名和数据库名按声明存储,但以小写形式进行比较
				lower_case_table_names = 1

				# 最大连接数
				max_connections = 1000

				# Innodb缓存池大小
				innodb_buffer_pool_size = 4G

				# 表文件描述符的缓存大小
				table_open_cache_instances=1
				table_open_cache=2000
				table_definition_cache=2000

				!includedir /etc/mysql/conf.d/	
				EOF
				
	echo -e "配置文件写入完成!\n\n"

	# 创建并启动docker容器
	sleep 1
	read -p "请输入需要映射的端口(默认为 ${port}):" inputPort
	read -p "请输入容器的名称(默认为 ${application}):" inputName
	read -p "请输入 ${application} 数据库密码(默认为 ${passwd}):" inputPasswd

	if [ "$inputPort" != "" ];then
		port=$inputPort
	fi
	if [ "$inputName" != "" ];then
		application=$inputName
	fi
	if [ "$inputPasswd" != "" ];then
		passwd=$inputPasswd
	fi
	 
	 echo -e "\n开始创建并启动${application}容器……\n"

	dockerRunCmd="docker run --restart=always --privileged=true \
	-v ${applicationPath}/data/:/var/lib/mysql \
	-v ${applicationPath}/logs/:/var/log/mysql \
	-v ${applicationPath}/conf/:/etc/mysql/conf.d \
	-v ${applicationPath}/mysql-files:/var/lib/mysql-files \
	-p $port:3306 --name $application \
	-e MYSQL_ROOT_PASSWORD=$passwd -d $image:$version &> /dev/null"
	
	eval $dockerRunCmd
	# 判断容器是否启动成功
	successOrNot
	
	echo -e "=========================安装MySql结束========================="
}

# 安装Redis
docker_redis(){

	application="redis"
	image="redis"
	applicationPath="/opt/${application}"
	port="6379"
	passwd="123456"

	echo -e "=========================开始安装Redis========================="
	# 删除已有容器
	delExisting ${application} 
	# 输入版本号并拉取镜像
	docker_pull
	# 创建映射目录
	create_file_path data
	
	
	# 将配置写进配置文件
	sleep 1
	echo -e "开始写入配置文件……\n"
	cat >${applicationPath}/redis.conf<<-EOF
					bind 0.0.0.0
					port 6379
					protected-mode no
					daemonize no
					databases 16
					masterauth 123456
					dir ./
					appendonly yes
				EOF
	
	echo -e "配置文件写入完成!\n\n"
	
	# 启动 redis 容器,注意映射的端口以及名字
	sleep 1
	read -p "请输入需要映射的端口(默认为 ${port}):" inputPort
	read -p "请输入容器的名称(默认为 ${application}):" inputName
	read -p "请输入 ${application} 数据库密码(默认为 ${passwd}):" inputPasswd
	sleep 1

	if [ "$inputPort" != "" ];then
		port=$inputPort
	fi
	if [ "$inputName" != "" ];then
		application=$inputName
	fi
	if [ "$inputPasswd" != "" ];then
		passwd=$inputPasswd
		sed -i "s/123456/${passwd}/g"  ${applicationPath}/redis.conf
	fi
	
	echo -e "\n开始创建并启动${application}容器……\n"
	 
	dockerRunCmd="docker run --restart=always -p $port:6379 --name $application \
	-v ${applicationPath}/redis.conf:/etc/redis/redis.conf \
	-v ${applicationPath}/data:/data \
	-d $image:$version /etc/redis/redis.conf  --appendonly yes &> /dev/null"
	eval $dockerRunCmd
	
	# 判断容器是否启动成功
	successOrNot
	
	echo -e "=========================安装Redis结束========================="
}

# 安装Nacos
docker_nacos(){
	application="nacos"
	image="nacos/nacos-server"
	applicationPath="/opt/$application"
	port="8848"

	echo -e "=========================开始安装Nacos========================="
	echo -e "注:本脚本安装的是nacos单机版,安装集群请自行修改配置文件"
	# 删除已有容器
	delExisting ${application} 
	# 输入版本号并拉取镜像
	docker_pull
	# 创建映射目录
	create_file_path conf logs
		
	# 创建配置文件
	echo -e "开始创建配置文件……\n"

	docker run -p 8848:8848 --name $application -d $image:$version &> /dev/null
	sleep 2
	docker cp $application:/home/nacos/logs/ ${applicationPath}/ &> /dev/null
	docker cp $application:/home/nacos/conf/ ${applicationPath}/ &> /dev/null
	sleep 1
	docker rm -f $application

	ls ${applicationPath}/conf | grep application.properties &> /dev/null
	if [ $? -eq 0 ];then
		echo -e "配置文件写入完成!\n\n"
	else
		echo "关配置文件创建失败!"
		exit
	fi

	# 启动容器,注意映射的端口以及名字
	read -p "请输入映射的端口(默认为 ${port}):" inputPort
	read -p "容器的名称(默认为 ${application}):" inputName

	if [ "$inputPort" != "" ];then
		port=$inputPort
	fi
	if [ "$inputName" != "" ];then
		application=$inputName
	fi
		
	echo -e "\n开始创建并启动${application}容器……\n"
	
	dockerRunCmd="docker run --restart=always --privileged=true \
	-v $applicationPath/logs/:/home/nacos/logs \
	-v $applicationPath/conf/:/home/nacos/conf \
	-e JVM_XMS=256m \
	-e JVM_XMX=256m \
	-e MODE=standalone \
	-p $port:8848 -p 9848:9848 -p 9849:9849 \
	--name $application -d $image:$version "
	
	eval $dockerRunCmd
	# 判断容器是否启动成功
	successOrNot
	
	echo -e "=========================安装Nacos结束========================="
}

# 安装Nginx
docker_nginx(){
	application="nginx"
	image="nginx"
	applicationPath="/opt/$application"
	port="80"

	echo -e "=========================开始安装Nginx========================="
	# 删除已有容器
	delExisting ${application} 
	# 输入版本号并拉取镜像
	docker_pull
	# 创建映射目录
	create_file_path conf logs html
		
	# 创建配置文件
	echo -e "开始创建配置文件……\n"
	echo -e "创建临时容器从容器中复制配置文件\n"
	docker run -p 80:80 --name $application -d $image:$version &> /dev/null
	sleep 2
	docker cp $application:/etc/nginx/nginx.conf ${applicationPath}/conf/nginx.conf &> /dev/null
	docker cp $application:/etc/nginx/conf.d ${applicationPath}/conf/conf.d &> /dev/null
	docker cp $application:/usr/share/nginx/html ${applicationPath}/ &> /dev/null
	sleep 1
	echo -e "删除$application临时容器"
	docker stop $application
	sleep 1
	docker rm -f $application

	ls ${applicationPath}/conf | grep nginx.conf &> /dev/null
	if [ $? -eq 0 ];then
		echo -e "相关配置文件创建成功!\n\n"
	else
		echo "相关配置文件创建失败!"
		exit
	fi

	# 启动容器,注意映射的端口以及名字
	read -p "请输入需要映射的端口(默认为 ${port}):" inputPort
	read -p "请输入容器的名称(默认为 ${application}):" inputName

	if [ "$inputPort" != "" ];then
		port=$inputPort
	fi
	if [ "$inputName" != "" ];then
		application=$inputName
	fi
		
	echo -e "开始创建并启动容器……\n"
	
	
	dockerRunCmd="docker run --restart=always --privileged=true \
	-p $port:80 \
	--name $application \
	-v $applicationPath/conf/nginx.conf:/etc/nginx/nginx.conf \
	-v $applicationPath/conf/conf.d:/etc/nginx/conf.d \
	-v $applicationPath/logs:/var/log/nginx \
	-v $applicationPath/html:/usr/share/nginx/html \
	-d $image:$version &> /dev/null"
	eval $dockerRunCmd

	# 判断容器是否启动成功
	successOrNot
	
	echo -e "\n=========================安装Nginx结束========================="

}

# 安装Dockr
docker_install(){
echo -e "\n=========================开始安装Docker=========================\n"
echo -e "\n============使用的官方脚本安装,可能因网络问题安装缓慢,请耐心等待============\n"

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

echo -e "\n=========================安装Docker结束=========================\n"
}

# 下载Jdk
download_jdk(){
	echo -e "\n=========================openJdk下载=========================\n"
	local path=""
	read -p "请输入JDK保存的位置:" inputPath
	if [ "$inputPath" != "" ];then
		path="-P "$inputPath
	fi
	
	echo -e "1: jdk1.7    2: jdk1.8    3: jdk11  4: jdk15   5: jdk17" 
	read -p "选择要下载的jdk版本:" input
	case $input in 
			1)
				wget https://repo.huaweicloud.com/openjdk/java-jse-ri/jdk7u75/openjdk-7u75-b13-linux-x64-18_dec_2014.tar.gz $path
				;;
			2)
				wget https://repo.huaweicloud.com/openjdk/java-jse-ri/jdk8u40/openjdk-8u40-b25-linux-x64-10_feb_2015.tar.gz $path
				;;
			3)
				wget https://repo.huaweicloud.com/openjdk/java-jse-ri/jdk11/openjdk-11+28_linux-x64_bin.tar.gz $path
				;;
			4)
				wget https://repo.huaweicloud.com/openjdk/15.0.2/openjdk-15.0.2_linux-x64_bin.tar.gz $path
				;;
			5)
				wget https://repo.huaweicloud.com/openjdk/17.0.2/openjdk-17.0.2_linux-x64_bin.tar.gz $path
				;;
			*)
			echo "编号输入错误,请重新输入!"
	esac

	echo -e "\n=========================openJdk下载结束=========================\n"

}

# 安装 Rocketmq_rmqnamesrv
docker_rocketmq_rmqnamesrv(){
	application="rmqnamesrv"
	image="rocketmqinc/rocketmq"
	applicationPath="/opt/rocketmq/$application"
	port="9876"

	echo -e "=========================开始安装rocketmq-namesrv========================="
	# 删除已有容器
	delExisting ${application} 
	# 输入版本号并拉取镜像
	docker_pull
	# 创建映射目录
	create_file_path store logs
		
		
	# 启动容器,注意映射的端口以及名字
	read -p "请输入需要映射的端口(默认为 ${port}):" inputPort
	read -p "请输入容器的名称(默认为 ${application}):" inputName

	if [ "$inputPort" != "" ];then
		port=$inputPort
	fi
	if [ "$inputName" != "" ];then
		application=$inputName
	fi
		
	echo -e "开始创建并启动容器……\n"
	dockerRunCmd="docker run --restart=always --privileged=true \
	--name $application \
	-p $port:9876 \
	-v $applicationPath/logs:/root/logs \
	-v $applicationPath/store:/root/store \
	-e \"MAX_POSSIBLE_HEAP=100000000\" \
	-d $image:$version sh mqnamesrv	&> /dev/null"

	eval $dockerRunCmd

	# 判断容器是否启动成功
	successOrNot
	
	echo -e "\n=========================安装rocketmq-namesrv结束========================="
}

# 安装Rocketmq_broker
docker_rocketmq_broker(){
	application="rmqbroker"
	image="rocketmqinc/rocketmq"
	applicationPath="/opt/rocketmq/$application"
	local port="10911"
	local port1="10909"
	local namesrvProt="9876"

	echo -e "===========安装rocketmq-broker开始==========="
	# 删除已有容器
	delExisting ${application} 
	# 输入版本号并拉取镜像 如果有传入参数就不用再拉取镜像了 已经拉取过了
	if [ "$1" = "" ];then
		docker_pull
	fi
	# 创建映射目录
	create_file_path store logs conf
		
	# 启动容器,注意映射的端口以及名字
	if [ "$1" = "" ];then
		read -p "\请输入namesrv端口号(默认为 9876):" inputNamesrv
		if [ "$inputNamesrv" != "" ];then
			namesrvProt=$inputNamesrv
		fi
	fi
	read -p "需要映射到非vip通道的端口(默认为 ${port}):" inputPort
	read -p "需要映射到vip通道的端口(默认为 ${port1}):" inputPort1
	read -p "容器的名称(默认为 ${application}):" inputName
	echo "本机IP地址如下(如有多网卡ip可能会不准确,请自行确认)"
	hostname -I | awk '{print $1}'
	read -p "请输入broker节点所在服务器的ip地址:" inputIp

	if [ "$inputPort" != "" ];then
		port=$inputPort
	fi
	if [ "$inputPort1" != "" ];then
		port1=$inputPort1
	fi
	if [ "$inputName" != "" ];then
		application=$inputName
	fi	
	if [ "$inputIp" != "" ];then
		ip=$inputIp
	fi
	
	# 将配置写进配置文件
	sleep 1
	echo -e "开始写入配置……\n"
	sleep 1
	echo "#所属集群名称,如果节点较多可以配置多个" >> ${applicationPath}/conf/broker.conf
	echo brokerClusterName = DefaultCluster >> ${applicationPath}/conf/broker.conf
	echo "#broker名称,master和slave使用相同的名称,表明他们的主从关系" >> ${applicationPath}/conf/broker.conf
	echo brokerName = broker-a >> ${applicationPath}/conf/broker.conf
	echo "#0表示Master,大于0表示不同的slave" >> ${applicationPath}/conf/broker.conf
	echo brokerId = 0 >> ${applicationPath}/conf/broker.conf
	echo "#表示几点做消息删除动作,默认是凌晨4点" >> ${applicationPath}/conf/broker.conf
	echo deleteWhen = 04 >> ${applicationPath}/conf/broker.conf
	echo "#在磁盘上保留消息的时长,单位是小时" >> ${applicationPath}/conf/broker.conf
	echo fileReservedTime = 48 >> ${applicationPath}/conf/broker.conf
	echo "#有三个值:SYNC_MASTER,ASYNC_MASTER,SLAVE;同步和异步表示Master和Slave之间同步数据的机制;" >> ${applicationPath}/conf/broker.conf
	echo brokerRole = ASYNC_MASTER >> ${applicationPath}/conf/broker.conf
	echo "#刷盘策略,取值为:ASYNC_FLUSH,SYNC_FLUSH表示同步刷盘和异步刷盘;SYNC_FLUSH消息写入磁盘后才返回成功状态,ASYNC_FLUSH不需要;" >> ${applicationPath}/conf/broker.conf
	echo flushDiskType = ASYNC_FLUSH >> ${applicationPath}/conf/broker.conf
	echo "#设置broker节点所在服务器的ip地址" >> ${applicationPath}/conf/broker.conf
	echo brokerIP1 = $ip >> ${applicationPath}/conf/broker.conf	
	echo "#磁盘使用达到95%之后,生产者再写入消息会报错 CODE: 14 DESC: service not available now, maybe disk f" >> ${applicationPath}/conf/broker.conf
	echo diskMaxUsedSpaceRatio=95 >> ${applicationPath}/conf/broker.conf
	echo -e "配置文件写入完成!\n\n"
	
	sleep 1
	
	echo -e "开始创建并启动容器……\n"
	
	dockerRunCmd="docker run -d  \
		--restart=always \
		--name $application \
		--link rmqnamesrv:namesrv \
		-p $port:10911 \
		-p $port1:10909 \
		-v  ${applicationPath}/logs:/root/logs \
		-v  ${applicationPath}/store:/root/store \
		-v ${applicationPath}/conf/broker.conf:/opt/rocketmq-4.4.0/conf/broker.conf \
		-e "NAMESRV_ADDR=namesrv:$namesrvProt" \
		-e "MAX_POSSIBLE_HEAP=200000000" \
		$image \
		sh mqbroker -c /opt/rocketmq-4.4.0/conf/broker.conf &> /dev/null"

	eval $dockerRunCmd

	# 判断容器是否启动成功
	successOrNot
	
	echo -e "\n===========安装rocketmq-broker结束==========="
}

# 安装 Rocketmq_console
docker_rocketmq_console(){
	application="rmqConsole"
	image="pangliang/rocketmq-console-ng"
	applicationPath="/opt/rocketmq/$application"
	port="8080"
	local namesrv=""

	echo -e "===========安装rocketmq-console开始==========="
	# 删除已有容器
	delExisting ${application} 
	# 输入版本号并拉取镜像
	docker_pull
	# 创建映射目录
	create_file_path store logs
		
		
	# 启动容器,注意映射的端口以及名字
	read -p "需要映射到的端口(默认为 ${port}):" inputPort
	read -p "容器的名称(默认为 ${application}):" inputName
	read -p "请输入namesrv服务的ip地址及端口号):" inputNamesrv

	if [ "$inputPort" != "" ];then
		port=$inputPort
	fi
	if [ "$inputName" != "" ];then
		application=$inputName
	fi	
	if [ "$inputNamesrv" != "" ];then
		namesrv=$inputNamesrv
	fi
		
	echo -e "开始创建并启动容器……\n"
		dockerRunCmd="docker run -d \
		--restart=always \
		--name ${application} \
		-e \"JAVA_OPTS=-Drocketmq.namesrv.addr=$namesrv -Dcom.rocketmq.sendMessageWithVIPChannel=false\" \
		-p $port:8080 \
		pangliang/rocketmq-console-ng &> /dev/null"

	eval $dockerRunCmd

	# 判断容器是否启动成功
	successOrNot
	
	echo -e "\n===========安装rocketmq-console结束==========="
}

docker_rocketmq(){
	echo -e "\n============RockerMq一键部署============\n"
	echo -e "(1) 安装全部服务 namesrv broker rocketmq-console \n"
	echo -e "(2) 安装 namesrv \n"
	echo -e "(3) 安装 broker \n"
	echo -e "(4) 安装 rocketmq-console \n"
	echo -e "(99) 返回上一层"
	echo -e "\n============RockerMq一键部署============\n"
	read -p "请输入要安装服务的编号:" input

	case $input in 
		1)
			docker_rocketmq_rmqnamesrv
			docker_rocketmq_broker $port
			docker_rocketmq_console
			;;
		2)
			docker_rocketmq_rmqnamesrv
			;;
		3)
			docker_rocketmq_broker
			;;
		4)
			docker_rocketmq_console
			;;
		99)
			echo -e "返回上一层"
			;;
		*)
		echo "编号输入错误,请重新输入!"
	esac	
}

# 安装elasticsearch
docker_elasticsearch(){

	application="elasticsearch"
	image="elasticsearch"
	applicationPath="/opt/$application"
	version="7.17.10"
	javaOpts="512"
	local esPort="9200"
	local esPort1="9300"

	echo -e "=========================开始安装ElasticSearch========================="
	# 删除已有容器
	delExisting ${application} 
	# 输入版本号并拉取镜像
	echo -e "不要安装8以上的版本,启动不了"
	echo -e "不要安装8以上的版本,启动不了会报错:Exception in thread \"main\" java.nio.file.FileSystemException: /usr/share/elasticsearch/config/elasticsearch.yml.tcnfYs_IT-mzimsGqTj7fg.tmp -> 			  /usr/share/elasticsearch/config/elasticsearch.yml: Device or resource busy"
	docker_pull
	# 创建映射目录
	create_file_path config data plugins
	
	# 将配置写进配置文件
	sleep 1
	echo -e "开始写入配置文件……\n"
	echo "http.host: 0.0.0.0">> $applicationPath/config/elasticsearch.yml
	echo "http.port: 9200">> $applicationPath/config/elasticsearch.yml
	echo -e "配置文件写入完成!\n\n"
	
	# 启动容器,注意映射的端口以及名字
	sleep 1
	read -p "9200端口需要映射到的端口(默认为 ${esPort}):" inputPort
	read -p "9300端口需要映射到的端口(默认为 ${esPort1}):" inputPort1
	read -p "$application容器的名称(默认为 $application):" inputName
	read -p "$application容器内存(默认为 $javaOpts):" inputJavaOpts
	echo -e "\n开始启动容器……\n"
	sleep 1

	if [ "$inputPort" != "" ];then
		esPort=$inputPort
	fi
	if [ "$inputPort1" != "" ];then
		esPort1=$inputPort1
	fi
	if [ "$inputName" != "" ];then
		application=$inputName
	fi
	if [ "$inputJavaOpts" != "" ];then
		javaOpts=$inputJavaOpts
	fi

 
	dockerRunCmd="docker run --restart=always --privileged=true \
				 --name $application -p $esPort:9200 \
				 -p $esPort1:9300 \
				 -e \"discovery.type=single-node\" \
				 -e ES_JAVA_OPTS=\"-Xms${javaOpts}m -Xmx${javaOpts}m\" \
				 -v $applicationPath/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
				 -v $applicationPath/data:/usr/share/elasticsearch/data \
				 -v $applicationPath/plugins:/usr/share/elasticsearch/plugins \
				 -d $image:$version &> /dev/null"
	eval $dockerRunCmd
	
	# 判断容器是否启动成功
	successOrNot
	
	echo -e "=========================安装ElasticSearch结束========================="
}

# 安装kibana
docker_kibana(){

	application="kibana"
	image="kibana"
	applicationPath="/opt/$application"
	port="5601"
	version="7.17.10"
	local esHost="127.0.0.1:9200"
	
	echo -e "\n=========================开始安装Kibana========================="
	# 删除已有容器
	delExisting ${application} 
	# 输入版本号并拉取镜像
	echo -e "\n版本号要与ElasticSearch的版本一致"
	docker_pull
	# 创建映射目录
	create_file_path config
	
	echo "本机和docker容器IP地址如下(如有多网卡ip可能会不准确,请自行确认)"
	hostname -I | awk '{print $1}'
	docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -q)
	read -p "请输入elasticsearch的地址和端口号:" inputEsHost
	if [ "$inputEsHost" != "" ];then
		esHost=$inputEsHost
	fi
	
	# 将配置写进配置文件
	sleep 1
	echo -e "开始写入配置……\n"
	echo server.name: kibana >> ${applicationPath}/config/kibana.yml
	echo server.host: "0.0.0.0" >> ${applicationPath}/config/kibana.yml
	echo elasticsearch.hosts: ["http://${esHost}"] >> ${applicationPath}/config/kibana.yml
	echo xpack.monitoring.ui.container.elasticsearch.enabled: true >> ${applicationPath}/config/kibana.yml
	echo i18n.locale: "zh-CN" >> ${applicationPath}/config/kibana.yml
	echo -e "配置文件写入完成!\n\n"
	
	# 创建并启动docker容器
	sleep 1
	read -p "需要映射到的端口(默认为 ${port}):" inputPort
	read -p "容器的名称(默认为 ${application}):" inputName
	echo -e "\n开始启动容器……\n"

	if [ "$inputPort" != "" ];then
		port=$inputPort
	fi
	if [ "$inputName" != "" ];then
		application=$inputName
	fi
	 
	 
	dockerRunCmd="docker run  --restart=always  --privileged=true \
	--name ${application} \
	-p $port:5601 \
	-v $applicationPath/config/kibana.yml:/usr/share/kibana/config/kibana.yml \
	-d $image:$version &> /dev/null"
	
	eval $dockerRunCmd
	# 判断容器是否启动成功
	successOrNot
	
	echo -e "=========================安装Kibana结束========================= "
}

# 安装LogStash
docker_LogStash(){

	application="logstash"
	image="logstash"
	applicationPath="/opt/$application"
	port="5044"
	version="7.17.10"
	local esHost="127.0.0.1:9200"
	
	echo -e "\n=========================开始安装Logstash========================="
	# 删除已有容器
	delExisting ${application} 
	# 输入版本号并拉取镜像
	echo -e "\n版本号要与ElasticSearch的版本一致"
	docker_pull
	# 创建映射目录
	create_file_path config data pipeline
	
	echo "本机和docker容器IP地址如下(如有多网卡ip可能会不准确,请自行确认)"
	hostname -I | awk '{print $1}'
	docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -q)
	read -p "请输入elasticsearch的地址和端口号:" inputEsHost
	if [ "$inputEsHost" != "" ];then
		esHost=$inputEsHost
	fi
	# 创建配置文件
	echo -e "开始创建配置文件……\n"
	echo -e "创建临时容器从容器中复制配置文件\n"
	docker run -p 5044:5044 --name $application -d $image:$version &> /dev/null
	sleep 2
	docker cp $application:/usr/share/logstash/config ${applicationPath}/ &> /dev/null
	docker cp $application:/usr/share/logstash/data ${applicationPath}/ &> /dev/null
	docker cp $application:/usr/share/logstash/pipeline ${applicationPath}/ &> /dev/null
	sleep 1
	echo -e "删除$application临时容器"
	docker stop $application &> /dev/null
	sleep 1
	docker rm -f $application &> /dev/null
	chmod -R 777 ${applicationPath}

	
	echo -e "开始写入配置……\n"
	> ${applicationPath}/config/logstash.yml
	echo http.host: "0.0.0.0" >> ${applicationPath}/config/logstash.yml
	echo xpack.monitoring.elasticsearch.hosts: [ "${esHost}" ] >> ${applicationPath}/config/logstash.yml
	
	cat >${applicationPath}/pipeline/logstash.conf<<-EOF
					input {
					  tcp {
						mode => "server"
						host => "0.0.0.0"  # 允许任意主机发送日志
						port => $port
						codec => json_lines    # 数据格式
					  }
					}

					output {
					  elasticsearch {
						  hosts  => ["${esHost}"]   # ElasticSearch 的地址和端口
						  index  => "elk"         # 指定索引名
						  codec  => "json"
					  }
					  stdout {
						codec => rubydebug
					  }
					}
				EOF
	
	# 创建并启动docker容器
	sleep 1
	read -p "请输入需要映射的端口(默认为 ${port}):" inputPort
	read -p "请输入容器的名称(默认为 ${application}):" inputName

	if [ "$inputPort" != "" ];then
		port=$inputPort
	fi
	if [ "$inputName" != "" ];then
		application=$inputName
	fi
	echo -e "\n开始创建并启动容器……\n"

	dockerRunCmd="docker run --name $application  \
				--privileged=true  --restart=always \
				-p $port:5044 -p 9600:9600 \
				-v ${applicationPath}/data/:/usr/share/logstash/data \
				-v ${applicationPath}/config/:/usr/share/logstash/config \
				-v ${applicationPath}/pipeline/:/usr/share/logstash/pipeline \
				-d $image:$version &> /dev/null"

	eval $dockerRunCmd
	# 判断容器是否启动成功
	successOrNot
	
	echo -e "=========================安装Logstash结束========================="
}




while true;do
		echo -e "\n============Docker一键部署============\n"
		echo -e "(1) Mysql             (2) Redis\n"
		echo -e "(3) Nacos             (4) Nginx\n"
		echo -e "(5) Rocketmq          (6) ElasticSearch \n"
		echo -e "(7) Kibana            (8) LogStash"
		echo -e "\n"
		echo -e "\n"
		echo -e "(97) 下载Jdk   (98) 安装docker"
		echo -e "(99) 退出"
		echo -e "\n============Docker一键部署============\n"

		read -p "请输入要安装服务的编号:" input
		case $input in 
				1)
					docker_mysql
					;;
				2)
					docker_redis
					;;
				3)
					docker_nacos
					;;
				4)
					docker_nginx
					;;
				5)
					docker_rocketmq
					;;
				6)
					docker_elasticsearch
					;;
				7)
					docker_kibana
					;;
				8)
					docker_LogStash
					;;
				97)
					download_jdk
					;;
				98)
					docker_install
					;;
				99)
					echo -e "退出docker部署脚本"
					exit
					;;
				*)
				echo "编号输入错误,请重新输入!"
		esac
done
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值