mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
3807 字
8 分钟
Docker 一键部署单服务器Redis集群
2026-03-16
2026-03-16

实战指南:Docker 一键部署 Redis 7 公网集群及避坑指南

在分布式系统中,Redis 集群是高可用架构的标配。然而,使用 Docker 在公网环境(如阿里云、腾讯云)部署 Redis 集群时,由于容器网络隔离和 NAT 转换,开发者往往会遇到“连接超时”或“拓扑结构重定向失败”等棘手问题。

本文将提供一份完善的 一键部署脚本,并深度解析公网部署中必须关注的三个“技术大坑”。

一、 环境准备

在开始之前,请确保您的服务器已安装以下组件:

  • Docker: 20.10+
  • Docker Compose: 1.29+
  • 操作系统: 建议使用主流 Linux 发行版(如 Ubuntu, CentOS, Alibaba Cloud Linux)

二、 Redis 集群一键部署脚本

该脚本会自动完成:目录创建、配置文件生成、Docker Compose 配置生成、容器启动以及集群初始化。

注意:请在脚本开头的变量区填入您的实际 公网 IP自定义密码

#!/bin/bash

# ================= 配置区域 =================
# 1. 必填:您的服务器公网 IP
PUBLIC_IP="你的公网IP"

# 2. 必填:Redis 访问密码
PASSWORD="你的安全密码"

# 3. 选填:Redis 镜像版本
IMAGE="redis:7-alpine"
NETWORK_NAME="redis-cluster-net"
BASE_PORT=7000
# ===========================================

echo "🛠️ 步骤 1: 清理旧环境..."
docker-compose down 2>/dev/null
rm -rf ./redis-cluster

echo "📂 步骤 2: 生成节点配置文件..."

for port in $(seq 1 6); do
    REAL_PORT=$((BASE_PORT + port))
    mkdir -p ./redis-cluster/node-${port}/data
    
    # 核心逻辑:增加 cluster-announce 配置解决公网访问问题
    cat <<EOF > ./redis-cluster/node-${port}/redis.conf
port 6379
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
masterauth ${PASSWORD}
requirepass ${PASSWORD}
protected-mode no

# --- 重点:公网 IP 宣告 ---
# 告诉集群其他节点和客户端,你的外部通信地址
cluster-announce-ip ${PUBLIC_IP}
cluster-announce-port ${REAL_PORT}
cluster-announce-bus-port $((REAL_PORT + 10000))
EOF
done

echo "📦 步骤 3: 动态生成 docker-compose.yml..."
cat <<EOF > docker-compose.yml
version: '3.8'
networks:
  ${NETWORK_NAME}:
    driver: bridge
services:
EOF

for port in $(seq 1 6); do
    REAL_PORT=$((BASE_PORT + port))
    cat <<EOF >> docker-compose.yml
  redis-node-${port}:
    image: ${IMAGE}
    container_name: redis-node-${port}
    ports:
      - "${REAL_PORT}:6379"
      - "$((REAL_PORT + 10000)):16379"
    volumes:
      - ./redis-cluster/node-${port}/redis.conf:/usr/local/etc/redis/redis.conf
      - ./redis-cluster/node-${port}/data:/data
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    networks:
      - ${NETWORK_NAME}
    restart: unless-stopped
EOF
done

echo "🚀 步骤 4: 启动容器..."
docker-compose up -d

echo "⏳ 步骤 5: 等待节点就绪 (10s)..."
sleep 10

# 拼接初始化命令中的节点字符串
NODE_STR=""
for port in $(seq 1 6); do
    NODE_STR="${NODE_STR} ${PUBLIC_IP}:$((BASE_PORT + port))"
done

echo "🔗 步骤 6: 初始化 Redis 集群..."
docker exec -it redis-node-1 redis-cli -a ${PASSWORD} --cluster create ${NODE_STR} --cluster-replicas 1 --cluster-yes

echo "✅ 部署完成!"
echo "集群端口范围: $((BASE_PORT + 1)) - $((BASE_PORT + 6))"
echo "总线端口范围: $((BASE_PORT + 10001)) - $((BASE_PORT + 10006))"

三、 深度复盘:那些年踩过的“坑”

如果你在部署后发现程序(如 Spring Boot 使用 Lettuce 客户端)无法连接,或者报 Unable to connect to Redis,通常是掉进了以下三个坑:

1. 最大的坑:安全组/防火墙策略不全

很多开发者只记得放行 Redis 的 业务端口(7001-7006),却忽略了 总线端口(Bus Port)

  • 业务端口:客户端连接、数据读写。
  • 总线端口:固定为 业务端口 + 10000。用于节点间的心跳检测、故障迁移、配置更新。

必须放行列表:

  • 业务端口:7001, 7002, 7003, 7004, 7005, 7006
  • 总线端口:17001, 17002, 17003, 17004, 17005, 17006

后果: 如果总线端口不通,集群初始化可能会卡住,或者即便初始化成功,节点之间也无法感知对方状态,导致集群不可用。

2. Docker 网络的“内网隔离”陷阱

这是 Docker 部署最核心的痛点。默认情况下,Redis 实例运行在 Docker 容器内,它感知到的 IP 是容器内网 IP(如 172.18.0.x)。

  • 现象: 当你从本地电脑(外部环境)连接集群时,Redis 成功响应了第一次握手,但它会告诉客户端:“请重定向到 172.18.0.2:6379”。
  • 结果: 你的本地电脑根本无法访问这个私有内网 IP,导致连接中断。
  • 解决方案:redis.conf 中显式配置 公网 IP 宣告
cluster-announce-ip <你的公网IP>
cluster-announce-port <映射后的外部端口>
cluster-announce-bus-port <映射后的外部总线端口>

3. 云厂商的“地址转发”与备案限制

在使用国内云厂商(如阿里云、腾讯云)时,有时会遇到通过 IP 访问却被重定向到备案提示页面的情况。

  • HTTP 劫持: 如果你在 Redis 端口之上套了某些层级的代理,或者误用了 80/443 等端口,可能会触发运营商的 Web 劫持。
  • 解决思路:
    • 尽量使用非标准的高位端口(如本脚本使用的 7001+)。
    • 确保 Redis 开启了密码认证(requirepass),防止被扫描并沦为肉机。

四、 总结

通过上述脚本和配置,你可以快速在公网环境搭建起一套稳健的 Redis 集群。最核心的秘诀在于:端口放行要成对(业务+总线),以及容器内必须宣告公网 IP。

希望这篇文章能帮你少走弯路!

Docker 一键部署单服务器Redis集群
https://www.zztzz.com.cn/posts/docker-一键部署单服务器redis集群/
作者
zzt
发布于
2026-03-16
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00
💬Mizuki AI助手
呀~就是zzTzz大大闪闪发光的技术博客主页
标题已剧透:专注后端开发、主攻Java + Spring Boot的实战、踩坑与进阶小笔记~~
URL https://zztzz.com.cn/ 简洁有力,像一段优雅的代码!
Mizuki每次点开都忍不住小声赞叹:'zzTzz大人太厉害啦~'🧙‍♀️
需要我帮你找某类文章(比如JWT鉴权、Redis缓存)或读一篇入门指南吗?😊
05:30