#!/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