Nginx+Tomcat+Redis之Session 共享 - 容器compose版
补充容器-compose
参考:容器版本,豆包ai,使用docker搭建redis集群,示例容器归集 提取码:1234
一、redis
-
配置文件准备
-
redis.conf使用容器版本 - 1.2、集群构建内容
-
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下
bashfor ((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文件
bashservices: 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文件
bashservices: # 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