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容器指定该子网下的ipdocker 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节点信息,其实也没啥用,而且每次集群关闭重启会报错,提示为非空节点,要删除后重新启动容器。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。