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
相关推荐
trayvontang1 小时前
Nginx之location配置
运维·nginx
hkhkhkhkh1231 小时前
Linux设备节点基础知识
linux·服务器·驱动开发
HZero.chen3 小时前
Linux字符串处理
linux·string
张童瑶3 小时前
Linux SSH隧道代理转发及多层转发
linux·运维·ssh
汪汪队立大功1233 小时前
什么是SELinux
linux
石小千3 小时前
Linux安装OpenProject
linux·运维
柏木乃一3 小时前
进程(2)进程概念与基本操作
linux·服务器·开发语言·性能优化·shell·进程
Lime-30903 小时前
制作Ubuntu 24.04-GPU服务器测试系统盘
linux·运维·ubuntu
代码or搬砖3 小时前
Nginx详讲
运维·nginx·dubbo
百年渔翁_肯肯3 小时前
Linux 与 Unix 的核心区别(清晰对比版)
linux·运维·unix