Files
geg-gas-doc/宝策/docker_nacos.sh

309 lines
8.1 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# 脚本功能不依赖docker-compose使用docker命令管理nacos服务
# 定义变量
IMAGE="docker.tanuki.vip/nacos-server-kingbase"
IMAGE_VERSION="2.3.0"
FULL_IMAGE="${IMAGE}:${IMAGE_VERSION}" # 合并镜像地址和版本
CONTAINER_NAME="nacos-server"
CONFIG_DIR="/docker-data/nacos/conf" # 配置文件目录
HOST_PORT="8848"
CONTAINER_PORT="8848"
# 环境变量(处理特殊字符,使用单引号包裹)
ENV_VARS=(
'MODE=standalone'
)
# 显示使用帮助
usage() {
echo "用法: $0 [命令]"
echo "命令列表:"
echo " deploy - 部署并启动服务(如果镜像不存在会拉取)"
echo " start - 启动服务(容器必须已存在)"
echo " stop - 停止服务"
echo " restart - 重启服务"
echo " status - 查看服务状态"
echo " logs - 查看服务日志"
echo " remove - 删除容器(停止状态下)"
echo " pull - 拉取最新镜像"
echo " help - 显示帮助信息"
exit 1
}
# 检查docker是否安装
check_docker() {
if ! command -v docker &> /dev/null; then
echo "错误: 未安装docker请先安装"
exit 1
fi
}
# 检查容器是否存在
container_exists() {
docker inspect "$CONTAINER_NAME" &> /dev/null
return $?
}
# 检查容器是否运行
container_running() {
docker inspect -f '{{.State.Running}}' "$CONTAINER_NAME" 2>/dev/null | grep -q "true"
return $?
}
# 拉取镜像
pull_image() {
check_docker
echo "拉取镜像 $FULL_IMAGE ..."
if docker pull "$FULL_IMAGE"; then
echo "镜像拉取成功"
else
echo "错误: 镜像拉取失败"
exit 1
fi
}
# 部署并启动服务(如果容器不存在则创建,已存在则启动)
deploy_service() {
check_docker
# 检查数据目录和配置目录是否存在,不存在则创建
if [ ! -d "$CONFIG_DIR" ]; then
echo "创建配置目录: $CONFIG_DIR"
mkdir -p "$CONFIG_DIR"
chmod 777 "$CONFIG_DIR"
fi
# 生成单机模式配置文件(若不存在)
if [ ! -f "$CONFIG_DIR/application.properties" ]; then
echo "生成配置文件: $CONFIG_DIR/application.properties"
cat > "$CONFIG_DIR/application.properties" << EOF
#server.port=8848
spring.datasource.platform=kingbase8
db.type=kingbase8
db.driverClassName=com.kingbase8.Driver
db.pool.config.driverClassName=com.kingbase8.Driver
db.num=1
db.url.0=jdbc:kingbase8://10.10.2.102:54321/itc?currentSchema=nacos_sit&socketTimeout=600000&queryTimeout=600
db.user=itc_dne
db.password=itc_dne
# 已配置的驱动(保留)
spring.datasource.hikari.auto-commit=false
# 增加事务超时(全局设置)
spring.transaction.default-timeout=6000
# 连接池最大连接数
spring.datasource.hikari.maximum-pool-size=20
# 连接池最小空闲连接数
spring.datasource.hikari.minimum-idle=10
# 连接最大存活时间
spring.datasource.hikari.max-lifetime=1800000
# 验证连接是否有效
spring.datasource.hikari.connection-test-query=SELECT 1
# 等待连接池分配连接的最大时长
spring.datasource.hikari.connection-timeout=60000
# 设置事务隔离级别为READ_COMMITTED
spring.datasource.hikari.transaction-isolation=TRANSACTION_READ_COMMITTED
# 传递 JDBC 驱动属性(设置 queryTimeout
spring.datasource.hikari.connection-properties=queryTimeout=6000;socketTimeout=600000
# 验证连接的查询超时(单独设置,单位:秒)
spring.datasource.hikari.validation-query-timeout=3000
# 开启认证功能
nacos.core.auth.enabled=true
nacos.core.auth.username=nacos
nacos.core.auth.password=Lng@123
# 配置 JWT 密钥必须自定义长度至少32位
nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789
# 关闭用户代理白名单(增强安全性)
nacos.core.auth.enable.userAgentAuthWhite=false
# 配置服务端身份识别(可选,用于集群环境)
nacos.core.auth.server.identity.key=serverIdentity
nacos.core.auth.server.identity.value=security
nacos.security.ignore.urls=/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-ui/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**
### worked when nacos.core.auth.system.type=nacos
### The token expiration in seconds:
nacos.core.auth.plugin.nacos.token.cache.enable=false
nacos.core.auth.plugin.nacos.token.expire.seconds=18000
nacos.config.push.maxRetryTime=50
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
EOF
fi
if container_exists; then
echo "容器 $CONTAINER_NAME 已存在,尝试启动..."
start_service
return
fi
# 检查镜像是否存在,不存在则拉取
if ! docker images --format "{{.Repository}}:{{.Tag}}" | grep -q "$FULL_IMAGE"; then
echo "本地不存在镜像 $FULL_IMAGE,开始拉取..."
pull_image || exit 1
fi
echo "开始部署 $CONTAINER_NAME 服务..."
docker run -d --restart always --name nacos-server \
-p 8848:8848 -p 9848:9848 -p 9849:9849 \
-e MODE=standalone \
-v $CONFIG_DIR/application.properties:/home/nacos/conf/application.properties \
$FULL_IMAGE
if [ $? -eq 0 ]; then
echo "nacos容器部署成功"
echo "容器名称: $CONTAINER_NAME"
echo "映射端口: 8848 9848 9849"
docker network connect --ip 172.20.0.5 scm-net $CONTAINER_NAME
else
echo "Redis容器部署失败"
fi
}
# 启动服务
start_service() {
check_docker
if ! container_exists; then
echo "错误: 容器 $CONTAINER_NAME 不存在,请先执行 deploy 命令"
exit 1
fi
if container_running; then
echo "服务 $CONTAINER_NAME 已在运行中"
status_service
return
fi
echo "启动 $CONTAINER_NAME 服务..."
docker start "$CONTAINER_NAME"
status_service
}
# 停止服务
stop_service() {
check_docker
if ! container_exists; then
echo "错误: 容器 $CONTAINER_NAME 不存在"
exit 1
fi
if ! container_running; then
echo "服务 $CONTAINER_NAME 已停止"
status_service
return
fi
echo "停止 $CONTAINER_NAME 服务..."
docker stop "$CONTAINER_NAME"
status_service
}
# 重启服务
restart_service() {
check_docker
if ! container_exists; then
echo "错误: 容器 $CONTAINER_NAME 不存在,请先执行 deploy 命令"
exit 1
fi
echo "重启 $CONTAINER_NAME 服务..."
docker restart "$CONTAINER_NAME"
status_service
}
# 查看服务状态
status_service() {
check_docker
if ! container_exists; then
echo "容器 $CONTAINER_NAME 不存在"
return
fi
echo "$CONTAINER_NAME 服务状态:"
docker ps -f "name=$CONTAINER_NAME" --format "ID: {{.ID}}\n名称: {{.Names}}\n镜像: {{.Image}}\n状态: {{.Status}}\n端口: {{.Ports}}"
}
# 查看服务日志
logs_service() {
check_docker
if ! container_exists; then
echo "错误: 容器 $CONTAINER_NAME 不存在"
exit 1
fi
echo "查看 $CONTAINER_NAME 服务日志 (按Ctrl+C退出)..."
docker logs -f --tail 100 "$CONTAINER_NAME"
}
# 删除容器(需先停止)
remove_service() {
check_docker
if ! container_exists; then
echo "错误: 容器 $CONTAINER_NAME 不存在"
exit 1
fi
if container_running; then
echo "错误: 容器 $CONTAINER_NAME 正在运行,请先停止"
exit 1
fi
echo "删除 $CONTAINER_NAME 容器..."
docker rm "$CONTAINER_NAME"
if [ $? -eq 0 ]; then
echo "容器 $CONTAINER_NAME 已删除"
else
echo "删除容器失败"
fi
}
# 主逻辑
if [ $# -eq 0 ]; then
usage
fi
case "$1" in
deploy)
deploy_service
;;
start)
start_service
;;
stop)
stop_service
;;
restart)
restart_service
;;
status)
status_service
;;
logs)
logs_service
;;
remove)
remove_service
;;
pull)
pull_image
;;
help)
usage
;;
*)
echo "错误: 未知命令 '$1'"
usage
;;
esac