记录一次Ubuntu24.02中使用docker部署redis集群以及踩坑

前置工作:
配置好docker(我用的是28.1.1) 以及docker compose(我用的2.35.1版本,命令与之前不一样)
正式开始:
1、准备redis镜像:

docker pull redis

(根据实际需要下载版本,默认是latest)
2、找一个文件夹,创建不同节点docker对应的配置文件和数据文件夹,方便后面docker映射出去

mkdir -p ~/redis-cluster/{7000,7001,7002,7003,7004,7005}
for port in 7000 7001 7002 7003 7004 7005; do
  mkdir -p ~/redis-cluster/${port}/data
  touch ~/redis-cluster/${port}/redis.conf
done

之后修改对应文件夹中的配置文件,以7000文件夹为例:

port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
dir /data
protected-mode no
bind 0.0.0.0

其他文件夹类似,这里把port后面改成和文件夹对应的数字,还有nodes.conf改成nodes-700x.conf(这里7000保持叫nodes.conf)
3、编写docker-compose.xml

# 新版本docker compose 不用写 version: "3.8"
services:
  redis-7000:
    image: redis:latest # 这里根据自己的实际版本进行修改
    container_name: redis-7000
    ports:
      - "7000:7000"
      - "17000:17000"  # cluster bus port = port + 10000
    volumes:
      - ./7000/redis.conf:/usr/local/etc/redis/redis.conf
      - ./7000/data:/data
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    networks:
      redis-cluster-net:
        ipv4_address: 172.18.0.10 # 子网不要和既有的子网冲突了

  redis-7001:
    image: redis:latest
    container_name: redis-7001
    ports:
      - "7001:7001"
      - "17001:17001"
    volumes:
      - ./7001/redis.conf:/usr/local/etc/redis/redis.conf
      - ./7001/data:/data
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    networks:
      redis-cluster-net:
        ipv4_address: 172.18.0.11

  redis-7002:
    image: redis:latest
    container_name: redis-7002
    ports:
      - "7002:7002"
      - "17002:17002"
    volumes:
      - ./7002/redis.conf:/usr/local/etc/redis/redis.conf
      - ./7002/data:/data
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    networks:
      redis-cluster-net:
        ipv4_address: 172.18.0.12

  redis-7003:
    image: redis:latest
    container_name: redis-7003
    ports:
      - "7003:7003"
      - "17003:17003"
    volumes:
      - ./7003/redis.conf:/usr/local/etc/redis/redis.conf
      - ./7003/data:/data
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    networks:
      redis-cluster-net:
        ipv4_address: 172.18.0.13

  redis-7004:
    image: redis:latest
    container_name: redis-7004
    ports:
      - "7004:7004"
      - "17004:17004"
    volumes:
      - ./7004/redis.conf:/usr/local/etc/redis/redis.conf
      - ./7004/data:/data
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    networks:
      redis-cluster-net:
        ipv4_address: 172.18.0.14

  redis-7005:
    image: redis:latest
    container_name: redis-7005
    ports:
      - "7005:7005"
      - "17005:17005"
    volumes:
      - ./7005/redis.conf:/usr/local/etc/redis/redis.conf
      - ./7005/data:/data
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    networks:
      redis-cluster-net:
        ipv4_address: 172.18.0.15

networks:
  redis-cluster-net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.18.0.0/16 # 子网设定请不要和既有子网冲突

4.运行docker compose

docker compose up -d

5.查看运行状态&构建集群

docker ps
# 如果找不到 docker ps -a查看容器是否停止

构建集群(三主三从 cluster-replicas控制一个主机有几个从节点,redis会自动决定主机和从机):

docker exec -it redis-7000 bash
redis-cli --cluster create \
  172.18.0.10:7000 \
  172.18.0.11:7001 \
  172.18.0.12:7002 \
  172.18.0.13:7003 \
  172.18.0.14:7004 \
  172.18.0.15:7005 \
  --cluster-replicas 1

有提示的话输入yes,这里ip和上面的配置一致
5.测试集群的功能
选择一个节点写入数据

docker exec -it redis-7000 redis-cli
set hw "hello world"
get hw

再选一个节点读取数据

docker exec -it redis-7005 redis-cli
get hw

如果成功获取,就代表集群构建成功了
6、如果出现报错,请重新构建集群

docker compose down -v #清除所有状态,关闭所有容器

注意的坑点:
1、将不同容器中的数据和配置文件映射出来的时候,最好映射到不同的文件夹,否则有可能导致容器启动失败。(之前用deepseek默认生成的docker compose文件里都是6379端口,映射到同一个文件夹就会导致失败,修改成不同文件夹和不同端口后就好了)
2、注意子网冲突,如果发生子网冲突,请更换全部子网网段。如果之前配置的子网不需要了可以删除掉

posted @ 2025-06-18 16:27  JessieLin  阅读(76)  评论(0)    收藏  举报