沉默的小泷包 發表於 2026-1-10 09:55:40

Docker-compose部署redis-cluster集群的完整步骤

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、核心配置解析(先理解关键参数)</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">1. Redis 配置文件(redis1.conf/redis2.conf...)核心参数</a></li><li><a href="#_lab2_0_1">2. docker-compose.yml 核心配置</a></li></ul><li><a href="#_label1">二、完整部署步骤(适配通用 Linux 环境,如 CentOS/Ubuntu)</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_2">步骤 1:环境准备</a></li><li><a href="#_lab2_1_3">步骤 2:创建目录和配置文件</a></li><li><a href="#_lab2_1_4">步骤 3:启动容器</a></li><li><a href="#_lab2_1_5">步骤 4:初始化 Redis Cluster 集群</a></li><li><a href="#_lab2_1_6">步骤 5:验证集群是否正常</a></li></ul><li><a href="#_label2">三、常用运维命令</a></li><ul class="second_class_ul"></ul><li><a href="#_label3">四、常见问题及解决方法</a></li><ul class="second_class_ul"></ul><li><a href="#_label4">总结</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>一、核心配置解析(先理解关键参数)</h2>
<p class="maodian"><a name="_lab2_0_0"></a></p><h3>1. Redis 配置文件(redis1.conf/redis2.conf...)核心参数</h3>
<table><thead><tr><th>参数</th><th>作用</th></tr></thead><tbody><tr><td><code>port 7001</code></td><td>Redis 节点的服务端口(6 个节点对应 7001-7006)</td></tr><tr><td><code>protected-mode no</code></td><td>关闭保护模式(允许跨机器访问,集群部署必须关闭)</td></tr><tr><td><code>cluster-enabled yes</code></td><td>开启集群模式(Redis Cluster 核心开关)</td></tr><tr><td><code>cluster-config-file nodes.conf</code></td><td>集群节点信息文件(自动生成,无需手动修改)</td></tr><tr><td><code>cluster-node-timeout 5000</code></td><td>集群节点超时时间(5 秒,超时则判定节点不可用)</td></tr><tr><td><code>cluster-announce-ip 172.13.3.160</code></td><td>集群对外公告的 IP(必须是宿主机可访问的 IP,容器内 IP 不行)</td></tr><tr><td><code>cluster-announce-port 7001</code></td><td>集群对外公告的服务端口(和 port 一致)</td></tr><tr><td><code>cluster-announce-bus-port 17001</code></td><td>集群节点间通信的总线端口(服务端口 + 10000)</td></tr><tr><td><code>appendonly yes</code></td><td>开启 AOF 持久化(防止集群重启数据丢失)</td></tr></tbody></table>
<p class="maodian"><a name="_lab2_0_1"></a></p><h3>2. docker-compose.yml 核心配置</h3>
<ul><li><code>&amp;redis-image</code>:YAML 锚点语法,复用 <code>redis:5.0.7</code> 镜像,避免重复写;</li><li><code>volumes</code>:挂载本地配置文件到容器内(<code>./redis1.conf:/home/redis/cluster/redis.conf</code>)、挂载数据目录(<code>./7001/data:/data</code>),保证配置生效和数据持久化;</li><li><code>ports</code>:映射端口(服务端口 + 总线端口),<strong>必须全部开放</strong>,否则集群节点无法通信。</li></ul>
<p class="maodian"><a name="_label1"></a></p><h2>二、完整部署步骤(适配通用 Linux 环境,如 CentOS/Ubuntu)</h2>
<p class="maodian"><a name="_lab2_1_2"></a></p><h3>步骤 1:环境准备</h3>
<p>检查 Docker 和 Docker Compose 是否安装:</p>
<div class="jb51code"><pre class="brush:bash;"># 检查Docker
docker -v
# 检查Docker Compose
docker-compose -v
# 若未安装,先安装(以CentOS为例)
yum install -y docker docker-compose
systemctl start docker &amp;&amp; systemctl enable docker</pre></div>
<p>替换配置中的宿主机 IP:将所有 <code>redis*.conf</code> 和集群创建命令中的 <code>172.13.3.160</code> 替换为<strong>你的宿主机实际 IP</strong>(可通过 <code>ifconfig/ip addr</code> 查看)。</p>
<p>关闭防火墙 / 开放端口(二选一,推荐开放端口更安全):</p>
<div class="jb51code"><pre class="brush:bash;"># 方式1:临时关闭防火墙(CentOS)
systemctl stop firewalld &amp;&amp; systemctl disable firewalld
# 方式2:开放所需端口(推荐,CentOS)
firewall-cmd --add-port=7001-7006/tcp --permanent
firewall-cmd --add-port=17001-17006/tcp --permanent
firewall-cmd --reload
# Ubuntu 防火墙开放端口
ufw allow 7001-7006/tcp
ufw allow 17001-17006/tcp
ufw reload</pre></div>
<p class="maodian"><a name="_lab2_1_3"></a></p><h3>步骤 2:创建目录和配置文件</h3>
<p>创建项目目录(统一管理文件):</p>
<div class="jb51code"><pre class="brush:bash;">mkdir -p redis-cluster/{7001,7002,7003,7004,7005,7006}/data
cd redis-cluster</pre></div>
<p>生成 6 个 Redis 配置文件(以 redis1.conf 为例,其他仅改端口):</p>
<div class="jb51code"><pre class="brush:bash;"># 创建redis1.conf
cat &gt; redis1.conf &lt;&lt; EOF
port 7001
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 你的宿主机IP
cluster-announce-port 7001
cluster-announce-bus-port 17001
appendonly yes
pidfile /var/run/redis_7001.pid
EOF
# 快速生成redis2-redis6.conf(替换端口)
for port in {2..6}; do
cp redis1.conf redis${port}.conf
sed -i "s/7001/700${port}/g" redis${port}.conf
sed -i "s/17001/1700${port}/g" redis${port}.conf
sed -i "s/redis_7001/redis_700${port}/g" redis${port}.conf
done</pre></div>
<p>创建 docker-compose.yml 文件:</p>
<div class="jb51code"><pre class="brush:yaml;"># 注意:新版本Docker Compose可删除version字段(避免过时警告)
x-image:
&amp;redis-image
    redis:5.0.7
services:
redis1:
    image: *redis-image
    container_name: redis1
    command: ["redis-server", "/home/redis/cluster/redis.conf"]
    volumes:
      - ./redis1.conf:/home/redis/cluster/redis.conf
      - ./7001/data:/data
    ports:
      - 7001:7001
      - 17001:17001
    # 可选:添加网络模式,避免IP问题
    network_mode: "host"
redis2:
    image: *redis-image
    container_name: redis2
    command: ["redis-server", "/home/redis/cluster/redis.conf"]
    volumes:
      - ./redis2.conf:/home/redis/cluster/redis.conf
      - ./7002/data:/data
    ports:
      - 7002:7002
      - 17002:17002
    network_mode: "host"
redis3:
    image: *redis-image
    container_name: redis3
    command: ["redis-server", "/home/redis/cluster/redis.conf"]
    volumes:
      - ./redis3.conf:/home/redis/cluster/redis.conf
      - ./7003/data:/data
    ports:
      - 7003:7003
      - 17003:17003
    network_mode: "host"
redis4:
    image: *redis-image
    container_name: redis4
    command: ["redis-server", "/home/redis/cluster/redis.conf"]
    volumes:
      - ./redis4.conf:/home/redis/cluster/redis.conf
      - ./7004/data:/data
    ports:
      - 7004:7004
      - 17004:17004
    network_mode: "host"
redis5:
    image: *redis-image
    container_name: redis5
    command: ["redis-server", "/home/redis/cluster/redis.conf"]
    volumes:
      - ./redis5.conf:/home/redis/cluster/redis.conf
      - ./7005/data:/data
    ports:
      - 7005:7005
      - 17005:17005
    network_mode: "host"
redis6:
    image: *redis-image
    container_name: redis6
    command: ["redis-server", "/home/redis/cluster/redis.conf"]
    volumes:
      - ./redis6.conf:/home/redis/cluster/redis.conf
      - ./7006/data:/data
    ports:
      - 7006:7006
      - 17006:17006
    network_mode: "host"</pre></div>
<p>✨ 关键优化:添加 <code>network_mode: &quot;host&quot;</code>,让容器使用宿主机网络,避免容器内 IP 和宿主机 IP 不一致导致集群通信失败。</p>
<p class="maodian"><a name="_lab2_1_4"></a></p><h3>步骤 3:启动容器</h3>
<div class="jb51code"><pre class="brush:bash;"># 启动并后台运行容器
docker-compose up -d
# 检查容器状态(6个容器都应是Up状态)
docker-compose ps
# 或
docker ps | grep redis</pre></div>
<p class="maodian"><a name="_lab2_1_5"></a></p><h3>步骤 4:初始化 Redis Cluster 集群</h3>
<p>进入任意一个 Redis 容器(比如 redis1):</p>
<div class="jb51code"><pre class="brush:bash;">docker exec -it redis1 /bin/bash</pre></div>
<p>执行集群创建命令(替换为你的宿主机 IP):</p>
<div class="jb51code"><pre class="brush:bash;">redis-cli --cluster create 你的宿主机IP:7001 你的宿主机IP:7002 你的宿主机IP:7003 你的宿主机IP:7004 你的宿主机IP:7005 你的宿主机IP:7006 --cluster-replicas 1</pre></div>
<p><code>--cluster-replicas 1</code>:表示每个主节点对应 1 个从节点,最终形成 3 主 3 从的集群;</p>
<p>执行后会提示集群规划,输入 <code>yes</code> 确认即可。</p>
<p class="maodian"><a name="_lab2_1_6"></a></p><h3>步骤 5:验证集群是否正常</h3>
<p>连接集群(-c 表示开启集群模式,自动重定向):</p>
<div class="jb51code"><pre class="brush:bash;">redis-cli -c -p 7001</pre></div>
<p>查看集群节点信息:</p>
<p>redis</p>
<div class="jb51code"><pre class="brush:plain;">127.0.0.1:7001&gt; cluster nodes
# 输出会显示6个节点,标注主(master)/从(slave)、槽位分配等信息</pre></div>
<p>测试数据读写(验证集群分片):</p>
<div class="jb51code"><pre class="brush:plain;">127.0.0.1:7001&gt; set name test
OK
127.0.0.1:7001&gt; get name
"test"
# 切换节点测试(比如7002)
127.0.0.1:7001&gt; exit
redis-cli -c -p 7002
127.0.0.1:7002&gt; get name
# 会自动重定向到存储该key的节点并返回结果</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>三、常用运维命令</h2>
<div class="jb51code"><pre class="brush:bash;"># 停止集群容器
docker-compose stop
# 启动集群容器
docker-compose start
# 彻底删除集群(含数据,谨慎使用)
docker-compose down
rm -rf 700*/data/*# 删除持久化数据
# 查看集群状态
docker exec -it redis1 redis-cli -c -p 7001 cluster info</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>四、常见问题及解决方法</h2>
<ul><li><strong>集群创建失败:Could not connect to xxx:7001</strong>
<ul><li>原因:端口未开放、宿主机 IP 配置错误、容器网络模式问题;</li><li>解决:检查防火墙 / 端口、确认 <code>cluster-announce-ip</code> 是宿主机 IP、添加 <code>network_mode: &quot;host&quot;</code>。</li></ul></li><li><strong>容器启动后日志报错:Cluster state changed: fail</strong><ul><li>原因:节点间总线端口(17001-17006)未开放;</li><li>解决:开放 17001-17006 端口,重启容器。</li></ul></li><li><strong>数据写入后重启容器丢失</strong><ul><li>原因:数据目录未挂载或权限问题;</li><li>解决:检查 <code>volumes</code> 挂载路径是否正确,给本地数据目录赋权:</li></ul></li><li>运行</li></ul>
<div class="jb51code"><pre class="brush:bash;">chmod 777 -R 700*/data</pre></div>
<p class="maodian"><a name="_label4"></a></p><h2>总结</h2>
<ol><li>部署核心:<strong>替换宿主机 IP + 开放所有端口(7001-7006、17001-17006) + 初始化集群命令</strong>;</li><li>关键配置:<code>cluster-announce-ip</code> 必须是宿主机 IP,<code>protected-mode no</code> 关闭保护模式;</li><li>避坑点:添加 <code>network_mode: host</code> 避免容器网络隔离导致的通信失败,开启 AOF 持久化防止数据丢失。</li></ol>
<p>到此这篇关于Docker-compose部署redis-cluster集群的文章就介绍到这了,更多相关Docker compose redis-cluster集群内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
頁: [1]
查看完整版本: Docker-compose部署redis-cluster集群的完整步骤