要在Docker里安装 Redis集群,作为新手还需要先做两个功课,理解 volume 数据卷 和 docker-compose 这两个概念及基本使用。
一、volume数据卷的使用
为什么要使用 Volumes 数据卷?
Volumes 数据卷是 Docker 提供的一种机制,可以帮助我们保存容器内的数据,即使容器被删除,数据依然会保留。它有三大作用:
数据持久化:容器停止或删除后,容器内部的数据丢失。但如果使用 Volume 持久化数据,即使容器删除,数据也不会丢失。
跨容器共享数据:多个容器可以共享同一个 Volume,方便它们之间交换数据。
提高数据安全性:Volume 数据存储在宿主机的文件系统中,比容器本地存储更加可靠。
数据卷的相关命令:
# 创建一个卷
docker volume create my_volume
# 列出所有命名卷
docker volume ls
# 查看卷详情(如存储路径)
docker volume inspect 卷名
# 删除卷
docker volume rm 卷名
# 清理未使用的卷
docker system prune --volumes
二、docker-compose的使用
在 Windows 系统下如何创建 docker-compose.yml,还能怎么创建,像创建记事本一样创建呗。
先熟悉几个操作 docker-compose.yml 命令:
# 启动服务
docker-compose up -d
# 查看运行的容器
docker-compose ps
# 停止服务
docker-compose down
-d 参数使得服务在后台运行。
docker-compose版本查看:
docker-compose -v
docker compose version
如果 docker compose 命令有效,则是 Compose V2(推荐);如果只有 docker-compose 能用,则是 Compose V1。
三、安装 Redis 集群
安装 Redis 集群涉及到启动多个 Redis 实例并进行相互连接。这里我们将使用 Docker 和 Docker Compose 来简化操作。
1、创建docker-compose.yml文件
首先,创建一个名为docker-compose.yml的文件,定义 Redis 集群节点配置。
以下是一个在 Windows 系统上基本的 Redis 集群配置:
services:
redis1:
image:redis
container_name:redis1
command:
-redis-server
---appendonly yes
---cluster-enabled yes
---cluster-config-file nodes-1.conf
---cluster-node-timeout 5000
ports:
-"7001:6379"
networks:
-redis-cluster
volumes:
- redis1-data:/data
# 可选:添加Windows文件权限配置
environment:
-TZ=Asia/Shanghai# 解决Windows-Linux时区问题
redis2:
image:redis
container_name:redis2
command:
-redis-server
---appendonly yes
---cluster-enabled yes
---cluster-config-file nodes-2.conf
---cluster-node-timeout 5000
ports:
-"7002:6379"
networks:
-redis-cluster
volumes:
- redis2-data:/data
environment:
-TZ=Asia/Shanghai
redis3:
image:redis
container_name:redis3
command:
-redis-server
---appendonly yes
---cluster-enabled yes
---cluster-config-file nodes-3.conf
---cluster-node-timeout 5000
ports:
-"7003:6379"
-"17003:16379"
networks:
-redis-cluster
volumes:
- redis3-data:/data
environment:
-TZ=Asia/Shanghai
redis4:
image:redis
container_name:redis4
command:
-redis-server
---appendonly yes
---cluster-enabled yes
---cluster-config-file nodes-4.conf
---cluster-node-timeout 5000
ports:
-"7004:6379"
networks:
-redis-cluster
volumes:
- redis4-data:/data
environment:
-TZ=Asia/Shanghai
redis5:
image:redis
container_name:redis5
command:
-redis-server
---appendonlyyes
---cluster-enabledyes
---cluster-config-filenodes-5.conf
---cluster-node-timeout5000
ports:
-"7005:6379"
networks:
-redis-cluster
volumes:
- redis5-data:/data
environment:
-TZ=Asia/Shanghai
redis6:
image:redis
container_name:redis6
command:
-redis-server
---appendonlyyes
---cluster-enabledyes
---cluster-config-filenodes-6.conf
---cluster-node-timeout5000
ports:
-"7006:6379"
networks:
-redis-cluster
volumes:
- redis6-data:/data
environment:
-TZ=Asia/Shanghai
networks:
redis-cluster:
driver:bridge
volumes:
redis1-data:
driver:local
driver_opts:
type:none
o:bind
device:D:/docker-data/redis-cluster/redis1
redis2-data:
driver:local
driver_opts:
type:none
o:bind
device:D:/docker-data/redis-cluster/redis2
redis3-data:
driver:local
driver_opts:
type:none
o:bind
device:D:/docker-data/redis-cluster/redis3
redis4-data:
driver:local
driver_opts:
type:none
o:bind
device:D:/docker-data/redis-cluster/redis4
redis5-data:
driver:local
driver_opts:
type:none
o:bind
device:D:/docker-data/redis-cluster/redis5
redis6-data:
driver:local
driver_opts:
type:none
o:bind
device:D:/docker-data/redis-cluster/redis6
version:指定 Compose 文件格式版本(推荐 3.8)
services:定义所有需要运行的容器服务
image:指定使用的 Docker 镜像(如 nginx:latest)
ports:端口映射(格式 "主机端口:容器端口")
volumes:数据卷挂载(支持本地路径或命名卷)
与Linux系统的配置有两点不同:
1)卷路径适配:
将匿名卷改为显式绑定挂载,数据会保存在项目目录下的 redis-data 文件夹中
Windows 路径本次使用绝对路径,当然也可以使用相对路径。
2)新增配置:
添加 TZ 环境变量解决 Windows-Linux 时区不一致问题
明确指定卷驱动为 local 并配置绑定选项
这个配置将启动 6 个 Redis 实例,分别在 7001 到 7006 端口上运行。我们可以根据需要调整配置。
2、启动 Redis 集群
docker-compose up -d
该命令将在后台启动 6 个 Redis 实例。
3. 创建 Redis 集群
我们需要将这些 Redis 实例连接起来组成集群。
可以使用redis-cli来创建集群。
方式一:
首先,进入一个 Redis 容器并执行集群创建命令:
docker exec -it redis1 redis-cli --cluster create redis1:6379 redis2:6379 redis3:6379 redis4:6379 redis5:6379 redis6:6379 --cluster-replicas 1
redis1:6379
等是我们的 Redis 容器的地址和端口。
--cluster-replicas 1
表示每个主节点会有一个从节点。
系统会提示确认集群创建,我们需要输入yes以继续。
方式二:
首先查看容器的实际容器 IP:
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis1 redis2 redis3 redis4 redis5 redis6
然后将命令中的ip替换为对应ip,接着执行创建集群命令:
docker exec -it redis1 redis-cli --cluster create 172.18.0.2:6379 172.18.0.3:6379 172.18.0.4:6379 172.18.0.5:6379 172.18.0.6:6379 172.18.0.7:6379 --cluster-replicas 1
系统会提示确认集群创建,我们需要输入 yes 以继续。
我采用的方式二,其实方式一更方便。
4. 验证 Redis 集群
# 连接到任意节点
docker exec -it redis1 redis-cli -c
-c 是开启 cluster 模式。Redis 会自动跳转到不同的节点,但前提是返回的 IP/端口是客户端能访问的(也就是宿主机的 IP 和端口)
然后可以通过cluster info查看集群的状态:
# 查看集群信息
cluster info
# 查看集群节点
cluster nodes
当我们看到cluster_state:ok的输出,表示集群正常运行。
5. 停止 Redis 集群服务
要停止集群中的所有 Redis 实例,可以运行以下命令:
docker-compose down
我发现执行down命令后,容器是被删除的。
down命令执行前:
down命令执行后:
但是呢,数据卷是存在的,这就是挂载的作用,只要挂载了,即使容器被删除了,数据还是在的。
再去看看我的D盘:
配置文件和数据都保存在了这里。
四、宿主机无法访问
redis集群后,宿主机无法访问,于是对配置文件做了三个调整。
第一个调整,在command命令下增加配置参数:
- --cluster-announce-ip 192.168.0.15 # 宿主机公网IP或内网IP,其他节点和客户端能直接访问的 IP 地址
- --cluster-announce-port 7001 # 对应映射端口
- --cluster-announce-bus-port 17001 # 集群通信端口,也要做端口映射
集群返回给客户端的地址(宿主机IP:700x),客户端才能访问所有节点。
第二个调整,在 ports 处增加集群bus端口映射:
- "17001:16379" # 集群 bus 端口映射
17001~17006是集群总线端口,节点间通信,客户端也需可访问,因此这个端口也需要映射。
参照表:
每个redis实例都需要调整。
第三个调整,集群时,对宿主机公网IP进行集群。
原集群命令:
docker exec -it redis1 redis-cli --cluster create 172.18.0.2:6379 172.18.0.3:6379 172.18.0.4:6379 172.18.0.5:6379 172.18.0.6:6379 172.18.0.7:6379 --cluster-replicas 1
调整后的集群命令:
docker exec -it redis1 redis-cli --cluster create 192.168.0.15:7001 192.168.0.15:7002 192.168.0.15:7003 192.168.0.15:7004 192.168.0.15:7005 192.168.0.15:7006 --cluster-replicas 1
也就说集群不能在容器内网中进行集群,必须在宿主机上根据宿主机的ip地址和端口进行集群,这样宿主机的客户端才能访问。
五、最后总结
通过 Docker 创建 Redis 集群是非常简单的。简单的前提是:熟悉 volume 数据卷和 docker-compose 的使用。熟悉了之后,我们可以通过docker run启动单个 Redis 实例,或者使用docker-compose来配置并启动一个 Redis 集群。 Redis 集群需要至少 6 个节点,分为主节点和从节点。
虽然非常简单,但是也会遇到问题,比如宿主机访问不了,还需要对配置进行调整,增加宿主机ip、端口、bus端口的映射,并在此基础上再进行集群。
一路下来还是感觉原始的安装好用。
领取专属 10元无门槛券
私享最新 技术干货