1:搜索redis 镜像(当前最新版本是6.2.6)



[root@localhost ~]# docker search redis
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
redis Redis is an open source key-value store that… 10051 [OK]
sameersbn/redis 83 [OK]
grokzen/redis-cluster Redis cluster 3.0, 3.2, 4.0, 5.0, 6.0, 6.2 79
rediscommander/redis-commander Alpine image for redis-commander - Redis man… 66 [OK]
redislabs/redisearch Redis With the RedisSearch module pre-loaded… 40
redislabs/redisinsight RedisInsight - The GUI for Redis 35
kubeguide/redis-master redis-master with "Hello World!" 33
redislabs/redis Clustered in-memory database engine compatib…


 

2:下载镜像



docker pull redis


 

3:创建Redis配置文件

     下载redis 最新的redis.conf 文件(可以官网下载redis的tar 包,然后解压。使用其中的redis.conf 文件)

      在物理机上创建 redis配置文件目录(自定义) /home/zhangxs/Documents/dockerdata/redis/config

(1)创建主从配置文件(从redis.conf中复制出多份文件即可)



[root@localhost config]# ll
total 252
-rw-rw-r--. 1 polkitd zhangxs 83390 Oct 20 16:20 redis.conf // master节点6380
-rw-r--r--. 1 polkitd root 83413 Oct 20 16:21 slave6381.conf // 从节点,端口6381
-rw-r--r--. 1 polkitd root 83409 Oct 20 16:22 slave6382.conf //从节点,端口6382


(2)redis.conf 修改



bind 0.0.0.0 # 允许连接的客户端。默认是 127.0.0.1 。可以设置指定的客户端ip
port 6380 # 设置访问端口


 

(3)slave6381.conf



bind 0.0.0.0 # 允许连接的客户端。默认是 127.0.0.1 。可以设置指定的客户端ip
port 6381 # 设置访问端口
slaveof master 6380 # 设置master节点的ip 端口。因为容器重启ip可能会发生变化,所以这里没有硬编码ip。使用别名的方式。下面会讲到


(4)slave6382.conf



bind 0.0.0.0 # 允许连接的客户端。默认是 127.0.0.1 。可以设置指定的客户端ip
port 6382 # 设置访问端口
slaveof master 6380 # 设置master节点的ip 端口。因为容器重启ip可能会发生变化,所以这里没有硬编码ip。使用别名的方式。下面会讲到


 

4:启动容器

(1)master节点(容器名 r-master)



docker run -v /home/zhangxs/Documents/dockerdata/redis/config:/data/etc/redis -d -p 6380:6380 --name r-master redis redis-server /data/etc/redis/redis.conf


 - v(数据卷) : 映射物理机 与 容器目录共享

 -d :让容器后台运行

 -p:物理机的 6380 映射到 容器的 6380端口

- name:r-master   masrer容器的名称

redis-server /data/etc/redis/redis.conf  : 容器启动后执行的命令,这里是指定redis的配置文件

 

(2)  启动slave6381 和 6382  容器



docker run -v /home/zhangxs/Documents/dockerdata/redis/config:/data/etc/redis -d -p 6381:6381 --link r-master:master --name r-slave6381 redis redis-server /data/etc/redis/slave6381.conf

docker run -v /home/zhangxs/Documents/dockerdata/redis/config:/data/etc/redis -d -p 6382:6382 --link r-master:master --name r-slave6382 redis redis-server /data/etc/redis/slave6382.conf


 slave 节点启动跟master 多了一个 --link 配置

 link使用 格式



--link <name or id>:alias  # name:源容器名称,id:源容器id
作用:可以连接两个容器,使两个容器可以相互通信。并且还可以接受源容器的环境变量等数据


 

5:查看两个 slave 容器的 hosts 配置,看下 --link 是否生效



[root@localhost config]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ca4da15e431f redis "docker-entrypoint.s…" 50 minutes ago Up 50 minutes 6379/tcp, 0.0.0.0:6382->6382/tcp r-slave6382
25abe8e18d8a redis "docker-entrypoint.s…" 2 hours ago Up 55 minutes 6379/tcp, 0.0.0.0:6381->6381/tcp r-slave6381
b4e37ae6e33e redis "docker-entrypoint.s…" 2 hours ago Up 53 minutes 6379/tcp, 0.0.0.0:6380->6380/tcp r-master



[root@localhost config]# docker exec -it 25abe8e18d8a /bin/bash
root@25abe8e18d8a:/data# more /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.0.2 master b4e37ae6e33e r-master # master节点
172.18.0.3 25abe8e18d8a # 当前容器 r-slave6381



[root@localhost config]# docker exec -it ca4da15e431f /bin/bash
root@ca4da15e431f:/data# more /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.0.2 master b4e37ae6e33e r-master # master 节点
172.18.0.4 ca4da15e431f # 当前节点 r-slave6382


  从slave节点的hosts 文件可以看到link 生效了。

 

6:登录master节点 查看两个从节点是否连接上来



[root@localhost config]# docker exec -it b4e37ae6e33e /bin/bash
root@b4e37ae6e33e:/data# redis-cli -h 127.0.0.1 -p 6380
127.0.0.1:6380> info



# Replication
role:master # 表示当前节点的角色
connected_slaves:2 # slave 的数量。可以看到有 6381,6382两个节点
slave0:ip=172.18.0.3,port=6381,state=online,offset=5431,lag=1
slave1:ip=172.18.0.4,port=6382,state=online,offset=5431,lag=0
master_failover_state:no-failover
master_replid:ff6a639562d45268e55caf72d27cab9332f03bab
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:5431
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:5431


 

7:设置redis 数据卷

目前配置只有redis.conf 是存在物理机上,其他数据比如dump.rdb,日志文件等 都是存在容器中,如果容器删除,丢失 就会造成数据丢失

(2)创建dump存储目录(自定义) :/home/zhangxs/Documents/dockerdata/redis/dump

(2)修改 master的redis.conf 配置。



dbfilename dump.rdb # 改成 dbfilename dump6380.rdb
dir ./ # 改成 dir ./dump/ (自定义)


(3)删除master 容器

(4)重新创建masrter 容器



docker run -v /home/zhangxs/Documents/dockerdata/redis/config:/data/etc/redis -v /home/zhangxs/Documents/dockerdata/redis/dump:/data/dump -d -p 6380:6380 --name r-master redis redis-server /data/etc/redis/redis.conf


新增了 -v /home/zhangxs/Documents/dockerdata/redis/dump:/data/dump 配置。 /data/dump 对应着[dir ./dump] 这个配置。[./]表示/data 目录

(5)在我们映射的dump已经存在了dump6380.rdb文件



[root@localhost dump]# ll
total 4
-rw-r--r--. 1 polkitd input 175 Oct 21 09:54 dump6380.rdb
[root@localhost dump]# pwd
/home/zhangxs/Documents/dockerdata/redis/dump


其他节点同理