1. 安装 Docker
2. 创建 Docker 网络
为 Redis 容器创建一个自定义网络,使它们能够相互通信。
[root@icoolkj docker]# docker network create redis-net
3. 启动 Redis 主服务器容器并设置端口
启动 Redis 主服务器容器,并将 Redis 的默认端口(6379)映射到主机上的另一个端口(例如 8001)。你可以通过以下命令来实现:
[root@icoolkj docker]# docker run -d --name redis-master --network redis-net --hostname redis-master -p 8001:6379 redis
在这个命令中:
-d
表示以后台模式运行容器。--name redis-master
为容器命名为redis-master
。--network redis-net
将容器连接到redis-net
网络。--hostname redis-master
设置容器的主机名。-p 8001:6379
将主机的 8001 端口映射到容器的 6379 端口。
4. 获取主服务器的 IP 地址
获取 Redis 主服务器容器的 IP 地址,这个地址将在配置从服务器时使用。
[root@icoolkj docker]# docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-master
172.19.0.2
5. 启动 Redis 从服务器
启动 Redis 从服务器容器,并将其配置为连接到主服务器。假设主服务器的 IP 地址是 172.19.0.2
(替换为你实际的 IP 地址),从服务器的 Redis 端口可以保持默认的 6379。
[root@icoolkj docker]# docker run -d --name redis-slave1 --network redis-net --hostname redis-slave1 -p 8002:6379 redis redis-server --replicaof 172.19.0.2 6379
[root@icoolkj docker]# docker run -d --name redis-slave2 --network redis-net --hostname redis-slave2 -p 8003:6379 redis redis-server --replicaof 172.19.0.2 6379
6. 验证主从复制
进入 Redis 从服务器容器,并验证主从复制是否成功。
验证第一个从服务器
在 Redis CLI 中运行以下命令:
[root@icoolkj docker]# docker exec -it redis-slave1 redis-cli
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:redis-master
master_port:6379
master_link_status:up
......
你应该看到类似以下的输出,其中包含 role:slave
,并且指定了主服务器的 IP 地址和端口。
验证第二个从服务器
[root@icoolkj docker]# docker exec -it redis-slave2 redis-cli
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:redis-master
master_port:6379
master_link_status:up
......
你也应该看到类似的输出,表明其作为从服务器运行,并正确指向主服务器。
7. 测试主从复制
在 Redis 主服务器上设置一些键值对,然后检查从服务器是否同步了这些数据。
在主服务器上设置键值对
[root@icoolkj docker]# docker exec -it redis-master redis-cli
127.0.0.1:6379> set key1 "hello, redis"
OK
127.0.0.1:6379> get key1
"hello, redis"
127.0.0.1:6379>
在从服务器上验证键值对
[root@icoolkj docker]# docker exec -it redis-slave1 redis-cli
127.0.0.1:6379> get key1
"hello, redis"
127.0.0.1:6379> exit
[root@icoolkj docker]# docker exec -it redis-slave2 redis-cli
127.0.0.1:6379> get key1
"hello, redis"
127.0.0.1:6379>
你应该在两个从服务器上看到 key1的值为 hello, redis,这表明主从复制配置成功。
====================================================================
使用 docker-compose.yml
配置 Redis 主从复制
使用 Docker 容器运行 Redis 时,如果没有正确配置数据持久化,容器挂掉后数据确实有丢失的风险。为了避免这种情况,可以将 Redis 数据存储在宿主机的文件系统上,而不是容器内部。这可以通过 Docker 的卷(volumes)来实现。使用 docker-compose.yml
配置 Redis 主从复制,并将数据和日志持久化到本地,可以按照以下步骤进行。我们将创建一个主服务器和两个从服务器,并将它们的数据和日志持久化到宿主机。
目录结构
首先,在宿主机上创建用于存储数据和日志的目录结构:
[root@icoolkj docker]# mkdir -p /data/docker/redis/master/data
[root@icoolkj docker]# mkdir -p /data/docker/redis/slave1/data
[root@icoolkj docker]# mkdir -p /data/docker/redis/slave2/data
[root@icoolkj docker]# mkdir -p /data/docker/redis/master/logs
[root@icoolkj docker]# mkdir -p /data/docker/redis/slave1/logs
[root@icoolkj docker]# mkdir -p /data/docker/redis/slave2/logs
## 确保 Redis 进程有权访问和写入这些目录。你可以使用以下命令更改目录权限:
[root@icoolkj docker]# chmod -R 777 /data/docker/redis/
docker-compose.yml
配置
接下来,创建一个 docker-compose.yml
文件,并添加以下内容:
version: '3.3'
services:
redis-master:
image: redis:latest
container_name: redis-master
ports:
- "8001:6379"
volumes:
- /data/docker/redis/master/data:/data
- /data/docker/redis/master/logs:/logs
command: ["redis-server", "--appendonly", "yes", "--logfile", "/logs/redis-master.log"]redis-slave1:
image: redis:latest
container_name: redis-slave1
depends_on:
- redis-master
ports:
- "8002:6379"
volumes:
- /data/docker/redis/slave1/data:/data
- /data/docker/redis/slave1/logs:/logs
command: ["redis-server", "--replicaof", "redis-master", "6379", "--appendonly", "yes", "--logfile", "/logs/redis-slave1.log"]redis-slave2:
image: redis:latest
container_name: redis-slave2
depends_on:
- redis-master
ports:
- "8003:6379"
volumes:
- /data/docker/redis/slave2/data:/data
- /data/docker/redis/slave2/logs:/logs
command: ["redis-server", "--replicaof", "redis-master", "6379", "--appendonly", "yes", "--logfile", "/logs/redis-slave2.log"]
说明
redis-master
服务使用最新的 Redis 镜像,端口映射到宿主机的 8001 端口,并将数据和日志目录挂载到宿主机的目录。redis-slave1
和redis-slave2
服务依赖于redis-master
,它们将连接到redis-master
并配置为从服务器。端口分别映射到宿主机的 8002 和 8003 端口,同样将数据和日志目录挂载到宿主机。- 使用
--appendonly yes
确保 AOF 日志持久化,并使用--logfile
参数指定日志文件的位置。 REDIS_REPLICAOF
环境变量用于配置从服务器指向主服务器。
启动服务
运行以下命令启动 Redis 主从复制集群:
[root@icoolkj docker]# docker-compose up -d
Starting redis-master ... done
Starting redis-slave1 ... done
Starting redis-slave2 ... done
[root@icoolkj docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2c5b783d60d7 redis:latest "docker-entrypoint.s…" 4 minutes ago Up 13 seconds 0.0.0.0:8003->6379/tcp redis-slave2
7eb822078912 redis:latest "docker-entrypoint.s…" 4 minutes ago Up 13 seconds 0.0.0.0:8002->6379/tcp redis-slave1
024c6e0d13ae redis:latest "docker-entrypoint.s…" 4 minutes ago Up 13 seconds 0.0.0.0:8001->6379/tcp redis-master
验证配置,测试写入和读取,同上;
总结
通过以上配置,你可以在 Docker 中实现 Redis 的主从复制,并将数据和日志持久化到宿主机。这种方式可以确保即使 Docker 容器挂掉,数据和日志也不会丢失。