转载自 桥柠小站 后续会持续更新脚本增加更多功能
脚本内容
- Mysql
- Redis
- Nacos
- Ngxin
- Rocketmq
- ElasticSearch
- Kibana
- LogStash
- Docker安装
- 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