本文分为两个部署文件,一个是redis单节点模式,一个是redis集群的主从复制模式,关于Redis集群的主从复制模式的原理或细节请自行翻阅其他博文,本文只说如何使用docker compose 部署,并且给的部署yml文件可以直接使用。
Redis单节点模式的docker compose yml文件
我将yml 文件命名为redis_compose.yml,在home 目录下创建,命令如下
vim /home/redis_compose.yml && cd /home
redis_compose.yml 文件内容:
version: '3.8'
services:
redis:
image: redis:latest
container_name: my_redis #容器名称
command: redis-server --appendonly yes #让redis数据库文件持久化
restart: always
ports:
- "16379:6379" #对外暴露的端口
volumes:
- /home/redisdata/data:/data # 持久化 Redis 数据
- /home/redisdata/redis.conf:/usr/local/etc/redis/redis.conf # 如果有自定义配置文件
environment:
- REDIS_DISABLE_COMMANDS=FLUSHDB,FLUSHALL
- TZ=Asia/Shanghai
然后运行命令
docker compose -f redis_compose.yml up -d
得到如下结果表示容器创建成功
[root@testdockerenv dkcomposeyaml]# docker compose -f redis_compose.yml up -d
[+] Running 1/1
✔ Container my_redis Started
运行命令查看容器状态
docker compose -f redis_compose.yml ps
得到如下信息时,表示容器运行正常
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
my_redis redis:latest "docker-entrypoint.sh redis-server --appendonly yes" redis About a minute ago Up About a minute 0.0.0.0:16379->6379/tcp, :::16379->6379/tcp
redis_compose.yml字段的详细解释
- image: 指定要使用的 Docker 镜像。这里使用的是最新的 Redis 官方镜像,如果你有别的需求,自行设置。
- container_name: 指定容器的名称。如果你不指定,Docker 会自动生成一个名称。
- command: 覆盖默认的容器启动命令。这里指定了 redis-server --appendonly yes,这意味着启动 Redis 服务器并开启 AOF 持久化。
- restart: 定义容器重启策略。always 表示如果容器退出,总是重启容器。
- ports: 定义容器端口映射。"16379:6379" 表示将容器的 6379 端口映射到宿主机的 16379 端口。
- volumes: 定义数据卷挂载。这里挂载了两个卷:
- /home/redisdata/data:/data: 将宿主机的 /home/redisdata/data 目录挂载到容器的 /data 目录,用于持久化 Redis 数据。宿主机的路径可以根据实际的情况进行更改
- /home/redisdata/redis.conf:/usr/local/etc/redis/redis.conf: 如果你有自定义的 Redis 配置文件,它会将宿主机的 /home/redisdata/redis.conf 文件挂载到容器的配置文件路径。宿主机的配置文件可以根据实际的情况选择是否启用,不想使用注释掉即可。
- environment: 定义环境变量。这里设置了两个变量:
- REDIS_DISABLE_COMMANDS=FLUSHDB,FLUSHALL: 禁用 Redis 的 FLUSHDB 和 FLUSHALL 命令,防止数据被意外清空。
- TZ=Asia/Shanghai: 设置容器时区为亚洲/上海时区
这个 Docker Compose 配置文件定义了一个 Redis 服务,它将 Redis 数据和配置文件持久化到宿主机的指定路径,并映射了宿主机的 16379 端口到容器的 6379 端口。同时,它还设置了时区并禁用了一些可能导致数据丢失的 Redis 命令。
Redis集群(主从复制)模式的docker compose yml文件
使用该compose文件,可以一键部署redis 主从复制集群,如果对配置有其他需求可以根据实际需求修改。
我将yml 文件命名为redis_cluster.yml,在home 目录下创建,命令如下
vim /home/redis_cluster.yml && cd /home
redis_cluster.yml文件内容:
version: '3.8'
services:
redis-master:
image: redis:latest
container_name: redis-master
command: redis-server --appendonly yes
ports:
- "16379:6379"
volumes:
- /home/redisdata/redis-master:/data
environment:
- TZ=Asia/Shanghai # 设置环境变量为上海时区
redis-slave:
image: redis:latest
container_name: redis-slave
command: redis-server --appendonly yes --slaveof redis-master 6379
depends_on:
- redis-master
ports:
- "16380:6379"
volumes:
- /home/redisdata/redis-slave:/data
environment:
- TZ=Asia/Shanghai # 设置环境变量为上海时区
然后运行如下命令
docker compose -f redis_cluster.yml up -d
得到的结果如下,则表明容器运行成功
[+] Running 3/3
✔ Network dkcomposeyaml_default Created 0.1s
✔ Container redis-master Started 0.0s
✔ Container redis-slave Started
我们使用以下命令确定容器的运行状态
docker compose -f redis_cluster.yml ps
得到的结果如下,则表明容器运行状态正常
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
redis-master redis:latest "docker-entrypoint.sh redis-server --appendonly yes" redis-master 2 minutes ago Up 2 minutes 0.0.0.0:16379->6379/tcp, :::16379->6379/tcp
redis-slave redis:latest "docker-entrypoint.sh redis-server --appendonly yes --slaveof redis-master 6379" redis-slave 2 minutes ago Up 2 minutes 0.0.0.0:16380->6379/tcp, :::16380->6379/tcp
redis_cluster.yml字段的详细解释
大部分KEY与单节点的KEY的内容是一样的,不同的地方有两处
command: redis-server --appendonly yes --slaveof redis-master 6379
这个命令的作用是:
- redis-server: 这是启动 Redis 服务的命令。
- --appendonly yes: 这个选项启用 Redis 的持久化功能,即 AOF(Append Only File)模式。在这种模式下,Redis 会将每个写操作追加到磁盘上的一个文件中,从而可以在发生故障时恢复数据。
- --slaveof redis-master 6379: 这个选项将当前 Redis 实例配置为另一个 Redis 实例的从属(slave)。redis-master 是主(master)Redis 实例的名称,6379 是主实例上 Redis 服务的端口号。这意味着当前 Redis 实例将尝试连接到名为 redis-master 的容器在端口 6379 上运行的 Redis 服务,并成为其从属节点。从属节点会从主节点复制数据,从而实现主从复制(master-slave replication)。
depends_on:表示一个服务依赖于另一个服务,及A容器依赖于B容器,在本例中的值是redis-master,表示
- 当前服务(在这个例子中是 redis-slave)依赖于名为 redis-master 的服务。在启动 redis-slave 服务之前,Docker Compose 将首先确保 redis-master 服务已经启动并且运行正常。
- 这对于确保 Redis 从属(slave)服务在尝试连接到 Redis 主(master)服务时,主服务已经准备好接受连接是非常有用的。这样可以避免因主服务尚未启动而导致从服务启动失败的问题。
- 需要注意的是,depends_on 仅确保服务的启动顺序,它不保证依赖的服务已经完全准备好接受连接。如果你需要确保一个服务完全启动并准备就绪,你可能需要使用其他机制,例如健康检查(health checks),来等待依赖服务完全可用。