linux服务-Nginx+Tomcat+Redis之Session 共享 - 容器compose

Nginx+Tomcat+Redis之Session 共享 - 容器compose版

补充容器-compose

参考:容器版本豆包ai使用docker搭建redis集群示例容器归集 提取码:1234

一、redis

  • 配置文件准备

    • redis.conf使用容器版本 - 1.2、集群构建内容

    • redis-init.sh

      bash 复制代码
      #!/bin/sh
      # 去掉 set -e(避免因非关键错误导致脚本退出)
      
      # 核心配置
      REDIS_PASSWORD="xiong"
      NODE_NAME="$REDIS_NODE_NAME"
      ALL_NODES="redis-1 redis-2 redis-3 redis-4 redis-5 redis-6"
      
      echo "===================== 节点 $NODE_NAME 启动 ====================="
      # 启动 Redis 服务(前台运行,避免容器退出)
      /data/redis/bin/redis-server /data/redis/conf/redis.conf &
      
      # 等待当前节点 Redis 就绪(最多 30 秒)
      echo "等待当前节点 Redis 就绪..."
      wait_count=0
      while [ $wait_count -lt 15 ]; do
        # 忽略错误,只检查是否能连接
        /data/redis/bin/redis-cli -h "$NODE_NAME" -p 6379 -a "$REDIS_PASSWORD" ping 2>/dev/null | grep "PONG" >/dev/null 2>&1
        if [ $? -eq 0 ]; then
          echo "✅ 节点 $NODE_NAME 已就绪"
          break
        fi
        wait_count=$((wait_count + 1))
        sleep 2
      done
      
      # 只有 redis-1 执行集群初始化
      if [ "$NODE_NAME" = "redis-1" ]; then
        echo "=== 等待所有节点就绪后初始化集群(最多等待 5 分钟) ==="
        ready_nodes=0
        wait_all_count=0
        # 最多等待 300 秒(150 次重试)
        while [ $wait_all_count -lt 150 ] && [ $ready_nodes -lt 6 ]; do
          ready_nodes=0
          for node in $ALL_NODES; do
            /data/redis/bin/redis-cli -h "$node" -p 6379 -a "$REDIS_PASSWORD" ping 2>/dev/null | grep "PONG" >/dev/null 2>&1
            if [ $? -eq 0 ]; then
              ready_nodes=$((ready_nodes + 1))
            fi
          done
          echo "当前就绪节点:$ready_nodes/6(已等待 $((wait_all_count*2)) 秒)"
          if [ $ready_nodes -eq 6 ]; then
            echo "✅ 所有节点均已就绪,开始初始化集群..."
            break
          fi
          wait_all_count=$((wait_all_count + 1))
          sleep 2
        done
      
        # 执行集群初始化(仅一次,避免重试冲突)
        if [ $ready_nodes -eq 6 ]; then
          echo yes | /data/redis/bin/redis-cli -a "$REDIS_PASSWORD" --cluster create redis-1:6379 redis-2:6379 redis-3:6379 redis-4:6379 redis-5:6379 redis-6:6379 --cluster-replicas 1
          if [ $? -eq 0 ]; then
            echo "🎉 集群初始化成功!"
          else
            echo "❌ 集群初始化失败,但容器继续运行(可手动执行初始化命令)"
          fi
        else
          echo "❌ 等待超时,未集齐 6 个节点,放弃初始化(容器继续运行)"
        fi
      else
        echo "=== 节点 $NODE_NAME 不执行初始化,等待集群就绪 ==="
        while true; do
          /data/redis/bin/redis-cli -h redis-1 -p 6379 -a "$REDIS_PASSWORD" cluster info 2>/dev/null | grep "cluster_state:ok" >/dev/null 2>&1
          if [ $? -eq 0 ]; then
            echo "✅ 集群已就绪!节点 $NODE_NAME 正常运行"
            break
          fi
          sleep 10
        done
      fi
      
      # 增强保活:永远不退出(多种方式确保容器前台运行)
      echo "节点 $NODE_NAME 进入保活状态,持续运行中..."
      while true; do
        # 检查 Redis 进程是否存活,若退出则重启
        if ! ps aux | grep redis-server | grep -v grep >/dev/null; then
          echo "⚠️ Redis 进程退出,重启中..."
          /data/redis/bin/redis-server /data/redis/conf/redis.conf &
        fi
        sleep 30
      done
    • 将两个文件都放到/data下

      bash 复制代码
      for ((i=1;i<=6;i++));do 
          mkdir /data/redisdata/redis$i/{conf,data} -p;
          cp /data/redis.conf /data/redisdata/redis$i/conf;
      done
      mkdir /data/redisdata/init -p
      cp /data/redis-init.sh /data/redisdata/init/redis-init.sh
      chmod 777 redisdata/ -R
  • 容器编排

    • 查最后的compose文件

      bash 复制代码
      services:
        redis-1:
        redis-2:
        redis-3:
        redis-4:
        redis-5:
        redis-6:
      networks:
        app-net:
          driver: bridge
          name: app-net
          ipam:
            driver: default
            config:
              - subnet: 10.0.2.0/24
                gateway: 10.0.2.1
    • 编排过程

      bash 复制代码
      [root@localhost opt]# docker-compose up
      WARN[0000] Found orphan containers ([tomcat-2 tomcat-1 nginx-1]) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up. 
      Attaching to redis-1, redis-2, redis-3, redis-4, redis-5, redis-6
      redis-2  | ===================== 节点 redis-2 启动 =====================
      redis-2  | 等待当前节点 Redis 就绪...
      redis-2  | .....
      redis-1  | 当前就绪节点:6/6(已等待 0 秒)
      redis-1  | ✅ 所有节点均已就绪,开始初始化集群...
      redis-1  | Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
      redis-1  | >>> Performing hash slots allocation on 6 nodes...
      redis-1  | Master[0] -> Slots 0 - 5460
      redis-1  | Master[1] -> Slots 5461 - 10922
      redis-1  | Master[2] -> Slots 10923 - 16383
      redis-1  | Adding replica redis-5:6379 to redis-1:6379
      redis-1  | Adding replica redis-6:6379 to redis-2:6379
      redis-1  | Adding replica redis-4:6379 to redis-3:6379
      redis-1  | M: b54...974 redis-1:6379
      redis-1  | M: 915...ced redis-2:6379
      redis-1  | M: 06e...5cd redis-3:6379
      redis-1  | S: 951...22e redis-4:6379
      redis-1  | S: 98b...482 redis-5:6379
      redis-1  | S: 1fe...645 redis-6:6379
      redis-1  | 
      redis-1  | >>> Performing Cluster Check (using node redis-1:6379)
      redis-1  | M: b54...974 redis-1:6379
      redis-1  | S: 951...22e 10.0.2.6:6379
      redis-1  | S: 1fe...645 10.0.2.5:6379
      redis-1  | S: 98b...482 10.0.2.7:6379
      redis-1  | M: 915...ced 10.0.2.2:6379
      redis-1  | M: 06e...5cd 10.0.2.4:6379
      redis-1  | [OK] All nodes agree about slots configuration.
      redis-1  | >>> Check for open slots...
      redis-1  | >>> Check slots coverage...
      redis-1  | [OK] All 16384 slots covered.
      redis-1  | 🎉 集群初始化成功!
      redis-1  | 节点 redis-1 进入保活状态,持续运行中...
      redis-6  | ✅ 集群已就绪!节点 redis-6 .......

二、tomcat

  • context.xml <-- 不知道怎么回事 动态生成没有生效,直接写死绑定了

    bash 复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <Context>
        <WatchedResource>WEB-INF/web.xml</WatchedResource>
        <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
        <Resources cachingAllowed="true" cacheMaxSize="102400" />
    
        <Valve className="com.naritech.nicole.gump.RedisSessionHandlerValve" />
        <Manager className="com.naritech.nicole.gump.RedisSessionManager"
                 nodes="redis-1:6379,redis-2:6379,redis-3:6379,redis-4:6379,redis-5:6379,redis-6:6379"
                 password="xiong"
                 database="0"
                 maxInactiveInterval="1800"
                 timeout="3000"
                 maxRedirections="5"
                 cluster="true" />
    </Context>

三、docker-compose.yml

  • Yml文件

    bash 复制代码
    services:
      # Redis 集群 6 节点(保持不变)
      redis-1:
        image: redis:7.2.12
        container_name: redis-1
        environment:
          - REDIS_NODE_NAME=redis-1
        ports:
          - "6379:6379"
        networks:
          app-net:
            aliases:
              - redis-1
        volumes:
          - /data/redisdata/init:/data/redis/init
          - /data/redisdata/redis1/conf:/data/redis/conf
          - /data/redisdata/redis1/data:/data/redis/data
        entrypoint: ["/bin/sh", "-c", "/data/redis/init/redis-init.sh"]
        restart: always
        # 健康检查:确保 Redis 启动且集群状态正常
        healthcheck:
          test: ["CMD", "/data/redis/bin/redis-cli", "-a", "xiong", "CLUSTER", "info", "|", "grep", "-q", "cluster_state:ok"]
          interval: 5s       # 每 5 秒检查一次
          timeout: 3s        # 检查超时时间 3 秒
          retries: 10        # 重试 10 次仍失败则标记为不健康
          start_period: 30s  # 启动后 30 秒再开始检查(给集群构建时间)
    
      redis-2:
        image: redis:7.2.12
        container_name: redis-2
        environment:
          - REDIS_NODE_NAME=redis-2
        ports:
          - "6380:6379"
        networks:
          app-net:
            aliases:
              - redis-2
        volumes:
          - /data/redisdata/init:/data/redis/init
          - /data/redisdata/redis2/conf:/data/redis/conf
          - /data/redisdata/redis2/data:/data/redis/data
        entrypoint: ["/bin/sh", "-c", "/data/redis/init/redis-init.sh"]
        restart: always
        healthcheck:
          test: ["CMD", "/data/redis/bin/redis-cli", "-a", "xiong", "CLUSTER", "info", "|", "grep", "-q", "cluster_state:ok"]
          interval: 5s       # 每 5 秒检查一次
          timeout: 3s        # 检查超时时间 3 秒
          retries: 10        # 重试 10 次仍失败则标记为不健康
          start_period: 30s  # 启动后 30 秒再开始检查(给集群构建时间)
    
      redis-3:
        image: redis:7.2.12
        container_name: redis-3
        environment:
          - REDIS_NODE_NAME=redis-3
        ports:
          - "6381:6379"
        networks:
          app-net:
            aliases:
              - redis-3
        volumes:
          - /data/redisdata/init:/data/redis/init
          - /data/redisdata/redis3/conf:/data/redis/conf
          - /data/redisdata/redis3/data:/data/redis/data
        entrypoint: ["/bin/sh", "-c", "/data/redis/init/redis-init.sh"]
        restart: always
        healthcheck:
          test: ["CMD", "/data/redis/bin/redis-cli", "-a", "xiong", "CLUSTER", "info", "|", "grep", "-q", "cluster_state:ok"]
          interval: 5s       # 每 5 秒检查一次
          timeout: 3s        # 检查超时时间 3 秒
          retries: 10        # 重试 10 次仍失败则标记为不健康
          start_period: 30s  # 启动后 30 秒再开始检查(给集群构建时间)
    
      redis-4:
        image: redis:7.2.12
        container_name: redis-4
        environment:
          - REDIS_NODE_NAME=redis-4
        ports:
          - "6382:6379"
        networks:
          app-net:
            aliases:
              - redis-4
        volumes:
          - /data/redisdata/init:/data/redis/init
          - /data/redisdata/redis4/conf:/data/redis/conf
          - /data/redisdata/redis4/data:/data/redis/data
        entrypoint: ["/bin/sh", "-c", "/data/redis/init/redis-init.sh"]
        restart: always
        healthcheck:
          test: ["CMD", "/data/redis/bin/redis-cli", "-a", "xiong", "CLUSTER", "info", "|", "grep", "-q", "cluster_state:ok"]
          interval: 5s       # 每 5 秒检查一次
          timeout: 3s        # 检查超时时间 3 秒
          retries: 10        # 重试 10 次仍失败则标记为不健康
          start_period: 30s  # 启动后 30 秒再开始检查(给集群构建时间)
    
      redis-5:
        image: redis:7.2.12
        container_name: redis-5
        environment:
          - REDIS_NODE_NAME=redis-5
        ports:
          - "6383:6379"
        networks:
          app-net:
            aliases:
              - redis-5
        volumes:
          - /data/redisdata/init:/data/redis/init
          - /data/redisdata/redis5/conf:/data/redis/conf
          - /data/redisdata/redis5/data:/data/redis/data
        entrypoint: ["/bin/sh", "-c", "/data/redis/init/redis-init.sh"]
        restart: always
        healthcheck:
          test: ["CMD", "/data/redis/bin/redis-cli", "-a", "xiong", "CLUSTER", "info", "|", "grep", "-q", "cluster_state:ok"]
          interval: 5s       # 每 5 秒检查一次
          timeout: 3s        # 检查超时时间 3 秒
          retries: 10        # 重试 10 次仍失败则标记为不健康
          start_period: 30s  # 启动后 30 秒再开始检查(给集群构建时间)
    
      redis-6:
        image: redis:7.2.12
        container_name: redis-6
        environment:
          - REDIS_NODE_NAME=redis-6
        ports:
          - "6384:6379"
        networks:
          app-net:
            aliases:
              - redis-6
        volumes:
          - /data/redisdata/init:/data/redis/init
          - /data/redisdata/redis6/conf:/data/redis/conf
          - /data/redisdata/redis6/data:/data/redis/data
        entrypoint: ["/bin/sh", "-c", "/data/redis/init/redis-init.sh"]
        restart: always
        healthcheck:
          test: ["CMD", "/data/redis/bin/redis-cli", "-a", "xiong", "CLUSTER", "info", "|", "grep", "-q", "cluster_state:ok"]
          interval: 5s       # 每 5 秒检查一次
          timeout: 3s        # 检查超时时间 3 秒
          retries: 10        # 重试 10 次仍失败则标记为不健康
          start_period: 30s  # 启动后 30 秒再开始检查(给集群构建时间)
    
      # Tomcat-1(语法正确,缩进统一)
      tomcat-1:
        image: tomcat:8.5.100
        container_name: tomcat-1
        ports:
          - "18080:8080"
        networks:
          app-net:
            aliases:
              - tomcat-1
        depends_on:
          redis-1:
            condition: service_healthy
          redis-2:
            condition: service_healthy
          redis-3:
            condition: service_healthy
          redis-4:
            condition: service_healthy
          redis-5:
            condition: service_healthy
          redis-6:
            condition: service_healthy
    
        volumes:
          - /data/tomcatdata/conf/context.xml:/data/tomcat/conf/context.xml
          - /data/tomcatdata/webapps/:/data/tomcat/webapps/
          - /data/tomcatdata/logs/:/data/tomcat/logs/
        entrypoint: ["/data/tomcat/bin/catalina.sh","run"]
    
        restart: always  # 新增:自动重启
    
      # Tomcat-2(修复核心语法错误:entrypoint 缩进)
      tomcat-2:
        image: tomcat:8.5.100
        container_name: tomcat-2
        ports:
          - "18081:8080"
        networks:
          app-net:
            aliases:
              - tomcat-2
        depends_on:
          redis-1:
            condition: service_healthy
          redis-2:
            condition: service_healthy
          redis-3:
            condition: service_healthy
          redis-4:
            condition: service_healthy
          redis-5:
            condition: service_healthy
          redis-6:
            condition: service_healthy
        volumes:
          - /data/tomcatdata/conf/context.xml:/data/tomcat/conf/context.xml
          - /data/tomcatdata/webapps/:/data/tomcat/webapps/
          - /data/tomcatdata/logs2/:/data/tomcat/logs/
        entrypoint: ["/data/tomcat/bin/catalina.sh","run"]
        restart: always
    
      # Nginx(修复配置目录,匹配官方镜像)
      nginx-1:
        image: nginx:1.29.3
        container_name: nginx-1
        ports:
          - "8888:8080"
        networks:
          app-net:
            aliases:
              - nginx-1
        depends_on:
          - tomcat-1
          - tomcat-2
        volumes:
          - /data/nginxdata/conf/conf.d:/data/nginx/conf/conf.d
    
    
    networks:
      app-net:
        driver: bridge
        name: app-net
        ipam:
          driver: default
          config:
            - subnet: 10.0.2.0/24
              gateway: 10.0.2.1
相关推荐
fengyehongWorld2 小时前
Linux rsync命令
linux
干啥都是小小白2 小时前
Linux C编程
linux·运维·服务器
赖small强3 小时前
【Linux 网络基础】WebSockets 技术指南
linux·网络·https·websockets·ping/pong
司铭鸿3 小时前
化学式解析的算法之美:从原子计数到栈的巧妙运用
linux·运维·服务器·算法·动态规划·代理模式·哈希算法
代码AC不AC3 小时前
【Linux】调试器 gdb / cgdb
linux·gdb·调试器·cgdb
last demo3 小时前
MariaDB 数据库管理
linux·运维·服务器·数据库·php·mariadb
生信大表哥3 小时前
Python单细胞分析-基于leiden算法的降维聚类
linux·python·算法·生信·数信院生信服务器·生信云服务器
码上上班5 小时前
ubuntu 安装ragflow
linux·运维·ubuntu
HIT_Weston5 小时前
38、【Ubuntu】【远程开发】拉出内网 Web 服务:构建静态网页(一)
linux·前端·ubuntu