3807 字
8 分钟
Docker 一键部署单服务器Redis集群
实战指南: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集群/ 部分信息可能已经过时









