docker redis集群搭建

linux转windows的吐槽:
首先redis官方就不支持windows系统。。。
想使用docker搭建一个可以从外部访问的Redis Cluster, 本来可以很方便的使用Docker network中的host driver,但host network目前只有在Linux上才支持,在Linux系统下使用docker搭建redis集群很简单很方便,网上的大部分教程也是针对linux下使用host模式的,这里不再详述。
但docker desktop for windows并不支持此种方式,因此只有使用默认的docker bridge桥接方式。
在bridge桥接下,docker会为每一个容器分配一个内部使用的ip(供容器间通信使用),创建集群时可以使用该ip。
该ip可以通过如下方式获得:
docker container inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis1
redis1 是容器名,替换为你的容器名
docker exec -it redis1 bash
进入该容器后
redis-cli --cluster create <你刚刚获得的ip>:7000 <你刚刚获得的ip>:7001 <你刚刚获得的ip>:7002 --cluster-replicas 0
此时redis集群已经搭建成功
这里为了方便,可以多加入一个容器在该容器中执行以上命令。

docker网络管理

每次查询docker容器分配的ip是一件比较麻烦的事情,你可以在创建子网后给你的docker容器指定该子网下的ip
docker network create --subnet=172.20.0.0/16 redis-net
eg:
redis1:

networks: #指定bridge分配的ip地址
  redis-net:
    ipv4_address: 172.20.0.3

这样创建时就可以使用固定ip

代码示例

目录结构:

redis-cluster
  -7000
    -conf
      redis.conf
  -7001
    -conf
      redis.conf
  -7002
    -conf
      redis.conf
  docker-compose.yml

redis.conf如下:

port 7000 #对外端口,redis默认的就是6379
protected-mode no 
daemonize no
appendonly no #数据持久化,这里不开启,我就是local起个集群
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 172.31.36.43 #本机ip,外部访问该集群的ip
cluster-announce-port 7000 #集群内部,一般和上面设置成一样
cluster-announce-bus-port 17000

docker-compose.yml如下:

version: '3'
services:
  redis-cluster: #上面提到的加入一个容器在该容器中执行创建集群命令,同样也要加入到自定义的子网络中
    image: redis:6.0.8
    networks:
      redis-net:
        ipv4_address: 172.20.0.2
    command: redis-cli --cluster create 172.20.0.3:7000 172.20.0.4:7001 172.20.0.5:7002 --cluster-replicas 0  --cluster-yes
    depends_on:
      - redis1
      - redis2
      - redis3
  redis1: # 服务名称
    image: redis:6.0.8 # 创建容器时所需的镜像
    container_name: redis1 # 容器名称
    restart: always # 容器总是重新启动
    networks: #指定bridge分配的ip地址
      redis-net:
        ipv4_address: 172.20.0.3
    ports:
      - 7000:7000
      - 17000:17000
    volumes: # 数据卷,目录挂载
      - ./7000/conf/redis.conf:/etc/redis/redis.conf
      - ./7000/data:/data
    command: redis-server /etc/redis/redis.conf # 覆盖容器启动后默认执行的命令

  redis2:
    image: redis:6.0.8
    container_name: redis2
    restart: always
    networks:
      redis-net:
        ipv4_address: 172.20.0.4
    ports:
      - 7001:7001
      - 17001:17001
    volumes:
      - ./7001/conf/redis.conf:/etc/redis/redis.conf
      - ./7001/data:/data
    command: redis-server /etc/redis/redis.conf

  redis3:
    image: redis:6.0.8
    container_name: redis3
    restart: always
    networks:
      redis-net:
        ipv4_address: 172.20.0.5
    ports:
      - 7002:7002
      - 17002:17002
    volumes:
      - ./7002/conf/redis.conf:/etc/redis/redis.conf
      - ./7002/data:/data
    command: redis-server /etc/redis/redis.conf

#引用一个已经存在的网络以及网段,可以自由分配和指定,只有使用redis-net网络的容器才会按照网段分配。
#其余容器不受影响,依然是由docker内置的bridge网段分配
networks:
  redis-net:
    external: true

volumes:
  redis1_data:
  redis2_data:
  redis3_data:

操作步骤

在上面的代码示例基础上
给redis-cluster创建子网,使用172.20.0.0网段,各个redis节点的ip指定见docker-compose.yml
如果创建子网失败,可以查询当前docker下的network状态,自行更换网段(如172.19.0.0)
docker network create --subnet=172.20.0.0/16 redis-net

查找本机ip,修改redis-cluster/700*/conf/redis.conf文件中cluster-announce-ip值为本机ip
windows下: ipconfig
linux下: ifconfig

使用docker后台运行依赖的各个组件
cd redis-cluster
docker-compose -f docker-compose-local.yml up -d

至此,可以使用127.0.0.1的7000、7001、7002端口访问集群节点

其他

host模式:
docker 指定network为host:
docker容器将不会分配ip地址,将自身端口完全绑定到宿主机ip上,可以直接通过宿主机ip外部访问,因此没有手动获取各个容器ip的过程
直接在宿主机上使用127.0.0.1:<端口号>即可create集群

docker数据卷volume管理:
local下不建议开启,没啥意义,如果想要搭建一个稳定点的可以考虑开启。
目前只用了redis的nodes.conf记录redis节点信息,其实也没啥用,而且每次集群关闭重启会报错,提示为非空节点,要删除后重新启动容器。


邓gf
1 声望2 粉丝