1. 查看虚拟机 IP(重要)
ip addr show | grep "inet " | grep -v 127.0.0.1
假设输出的 IP 是 192.168.1.100,后面所有命令中都要替换成你的实际 IP。
2. 关闭防火墙(测试阶段)
sudo ufw disable
3. 创建工作目录并进入
mkdir -p /opt/redis-cluster
cd /opt/redis-cluster
4. 生成 docker-compose.yml(所有节点使用外部宣告地址)
cat > docker-compose.yml <<EOF
version: '3.8'
services:
redis-node-1:
image: redis:7-alpine
container_name: redis-node-1
restart: always
command: redis-server --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes --bind 0.0.0.0 --protected-mode no --cluster-announce-ip 192.168.1.100 --cluster-announce-port 7001 --cluster-announce-bus-port 17001
ports:
- "7001:6379"
- "17001:16379"
networks:
- redis-net
volumes:
- node1-data:/data
redis-node-2:
image: redis:7-alpine
container_name: redis-node-2
restart: always
command: redis-server --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes --bind 0.0.0.0 --protected-mode no --cluster-announce-ip 192.168.1.100 --cluster-announce-port 7002 --cluster-announce-bus-port 17002
ports:
- "7002:6379"
- "17002:16379"
networks:
- redis-net
volumes:
- node2-data:/data
redis-node-3:
image: redis:7-alpine
container_name: redis-node-3
restart: always
command: redis-server --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes --bind 0.0.0.0 --protected-mode no --cluster-announce-ip 192.168.1.100 --cluster-announce-port 7003 --cluster-announce-bus-port 17003
ports:
- "7003:6379"
- "17003:16379"
networks:
- redis-net
volumes:
- node3-data:/data
redis-node-4:
image: redis:7-alpine
container_name: redis-node-4
restart: always
command: redis-server --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes --bind 0.0.0.0 --protected-mode no --cluster-announce-ip 192.168.1.100 --cluster-announce-port 7004 --cluster-announce-bus-port 17004
ports:
- "7004:6379"
- "17004:16379"
networks:
- redis-net
volumes:
- node4-data:/data
redis-node-5:
image: redis:7-alpine
container_name: redis-node-5
restart: always
command: redis-server --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes --bind 0.0.0.0 --protected-mode no --cluster-announce-ip 192.168.1.100 --cluster-announce-port 7005 --cluster-announce-bus-port 17005
ports:
- "7005:6379"
- "17005:16379"
networks:
- redis-net
volumes:
- node5-data:/data
redis-node-6:
image: redis:7-alpine
container_name: redis-node-6
restart: always
command: redis-server --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes --bind 0.0.0.0 --protected-mode no --cluster-announce-ip 192.168.1.100 --cluster-announce-port 7006 --cluster-announce-bus-port 17006
ports:
- "7006:6379"
- "17006:16379"
networks:
- redis-net
volumes:
- node6-data:/data
networks:
redis-net:
driver: bridge
volumes:
node1-data:
node2-data:
node3-data:
node4-data:
node5-data:
node6-data:
EOF
5. 启动所有节点
docker compose up -d
6. 检查容器状态(6 个都要 Up)
docker compose ps
7. 创建集群(IP 必须改成你自己的)
docker exec -it redis-node-1 redis-cli --cluster create 192.168.1.100:7001 192.168.1.100:7002 192.168.1.100:7003 192.168.1.100:7004 192.168.1.100:7005 192.168.1.100:7006 --cluster-replicas 1 --cluster-yes
看到 [OK] All 16384 slots covered. 表示集群创建成功。
8. 验证集群拓扑(确认 IP 都是外部地址)
docker exec -it redis-node-1 redis-cli -c -h 192.168.1.100 -p 7001 cluster nodes
9. 修改你的 Nacos 配置(在 Windows 上)
spring:
ccreate-redis:
cluster:
nodes:
- 192.168.1.100:7001
- 192.168.1.100:7002
- 192.168.1.100:7003
- 192.168.1.100:7004
- 192.168.1.100:7005
- 192.168.1.100:7006
max-redirects: 5
同时必须确保 Java 代码中 RedissonNatMapper 禁用或移除,避免它自动把地址转为 localhost。
10. 在 Windows 上测试连通性
Test-NetConnection -ComputerName 192.168.1.100 -Port 7001
返回 TcpTestSucceeded : True 即可。
可能出现的问题:
1.阿里云镜像加速地址 https://registry.cn-hangzhou.aliyuncs.com 已无法从公网访问。根据公开信息,自2024年7月起,阿里云等国内云厂商的容器镜像加速器普遍调整为仅限本云内网使用。因此,从Ubuntu虚拟机发起请求会失败,Docker便自动回退到默认的官方仓库 registry-1.docker.io,并最终因服务器位于海外且网络环境不稳定而报错。
解决方案:更换可用的公开加速镜像
你可以将之前配置的镜像地址替换为以下由社区或企业维护的、当前仍可公网访问的加速器。
1. 修改 Docker 配置文件
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://proxy.1panel.live",
"https://docker.1panel.top",
"https://docker.m.daocloud.io",
"https://docker.1ms.run",
"https://docker.ketches.cn"
]
}
EOF
这个新配置会提供一个国内的镜像加速地址列表,Docker将按顺序尝试。
2. 重启Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
3. 验证配置是否生效
docker info | grep -A 10 "Registry Mirrors"
这个命令可以查看Docker当前加载的镜像加速配置是否已更新。我们在已经打开的搜索结果中找到了相关的验证方法,你可以用它来确认配置是否成功。
4. 现在,重新拉取 Redis 镜像
确认配置生效后,可以手动拉取一下镜像来验证网络是否通畅:
docker pull redis:7-alpine
如果看到镜像开始下载,就说明网络问题已经解决了。
验证成功后
5. 返回项目目录
cd /opt/redis-cluster
6. 用docker compose启动所有Redis节点
docker compose up -d
7. 等待启动完毕,创建集群,把 IP 换成你的真实虚拟机IP
docker exec -it redis-node-1 redis-cli --cluster create 192.168.1.100:7001 192.168.1.100:7002 192.168.1.100:7003 192.168.1.100:7004 192.168.1.100:7005 192.168.1.100:7006 --cluster-replicas 1 --cluster-yes