一.简介

docker作为一个容器技术,在搭建资源隔离性服务上具有很大的优势,在一台服务器上可以启动多个docker容器,感觉每个在容器里面部署的服务就像是部署在不同的服务器上。此次基于docker以及docker-compose(一种容器编排技术)搭建redis集群,包含六个实例,分为三主三从。

二.构建镜像

使用docker构建容器,首先需要一个镜像,这个镜像可以基于docker官方提供的标准镜像,也可以自定义镜像。

1)构建redis镜像文件

创建Dockerfile文件,内容如下

#指定基础镜像
FROM alpine
#指定下载源,使用阿里的源,可以加快下载速度。同时安装编译redis需要用到的命令
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
&& apk add gcc g++ libc-dev wget vim openssl-dev make linux-headers bash \
&& rm -rf /var/cache/apk/*

#通过选择更小的镜像,删除不必要文件清理不必要的安装缓存,从而瘦身镜像
#创建相关目录能够看到日志信息跟数据跟配置文件
RUN mkdir -p /usr/src/redis \
&& mkdir -p /usr/src/redis/data \
&& mkdir -p /usr/src/redis/conf \
&& mkdir -p /usr/src/sh \
&& mkdir -p /usr/src/module \
&& mkdir -p /usr/src/redis/log

#下载redis安装包(可以根据你的需要下载指定版本的redis)
RUN wget -O /usr/src/redis/redis-5.0.5.tar.gz "https://github.com/antirez/redis/archive/5.0.5.tar.gz" \
&& tar -xzf /usr/src/redis/redis-5.0.5.tar.gz -C /usr/src/redis \
&& cp /usr/src/redis/redis-5.0.5/src/redis-trib.rb /usr/src/redis/ \
&& rm -rf /usr/src/redis/redis-5.0.5.tar.tgz
#然后编译安装
RUN cd /usr/src/redis/redis-5.0.5 && make && make PREFIX=/usr/local/redis install \

&& ln -s /usr/local/redis/bin/* /usr/local/bin/ && rm -rf /usr/src/redis/redis-5.0.5

#容器启动后运行的命令(在容器启动后运行redis)
CMD ["/usr/local/bin/redis-server","/usr/src/redis/conf/redis.conf"]

2)构建redis镜像

基于上面的Dockerfile可以编译生成一个镜像文件,使用如下命令

docker build -t redis:test .
说明:
  docker build:镜像构建命令
  -t:      指定镜像的名称,后面:后的test表示版本
  .:       指定Dockerfile文件的路径,使用上述命令后会在当前目录下寻找Dockerfile文件

镜像构建完毕之后会得到一个镜像redis,版本为test

构建过程中出现问题会有提示,根据相应的提示修改Dockerfile文件中的内容

3)构建docker-compose.yml文件

version: "3"
services:
redis-1:
# build:
# context: .
# dockerfile: Dockerfile
image: redis:test #指定镜像,使用上一步构建的镜像
restart: always
container_name: redis-1 #指定容器的名字
volumes: #挂载共享目录,指定之后宿主机和容器就可以共享文件,比如从宿主机发送文件到容器或者从容器中发送文件到宿主机
- /app/docker/redis/redis-1:/usr/src/redis
networks: #指定网段,也可以不指定,如果不指定的话每次重启会随机分配一个ip
mybridge:
ipv4_address: 192.168.1.2
ports: #指定端口映射
- 6380:6379
- 16380:16379
# command: /usr/local/bin/redis-sentinel /usr/src/redis/conf/sentinel.conf
redis-2:
# build:
# context: .
# dockerfile: Dockerfile
image: redis:test
restart: always
container_name: redis-2
volumes:
- /app/docker/redis/redis-2:/usr/src/redis
networks:
mybridge:
ipv4_address: 192.168.1.3
ports:
- 6381:6379
- 16381:16379
# command: /usr/local/bin/redis-sentinel /usr/src/redis/conf/sentinel.conf
redis-3:
# build:
# context: .
# dockerfile: Dockerfile
image: redis:test
restart: always
container_name: redis-3
volumes:
- /app/docker/redis/redis-3:/usr/src/redis
networks:
mybridge:
ipv4_address: 192.168.1.4
ports:
- 6382:6379
- 16382:16379
# command: /usr/local/bin/redis-sentinel /usr/src/redis/conf/sentinel.conf
redis-4:
# build:
# context: .
# dockerfile: Dockerfile
image: redis:test
restart: always
container_name: redis-4
volumes:
- /app/docker/redis/redis-4:/usr/src/redis
networks:
mybridge:
ipv4_address: 192.168.1.5
ports:
- 6383:6379
- 16383:16379
# command: /usr/local/bin/redis-sentinel /usr/src/redis/conf/sentinel.conf

redis-5:
image: redis:test
restart: always
container_name: redis-5
volumes:
- /app/docker/redis/redis-5:/usr/src/redis
networks:
mybridge:
ipv4_address: 192.168.1.6
ports:
- 6384:6379
- 16384:16379
# command: /usr/local/bin/redis-sentinel /usr/src/redis/conf/sentinel.conf

redis-6:
image: redis:test
restart: always
container_name: redis-6
volumes:
- /app/docker/redis/redis-6:/usr/src/redis
networks:
mybridge:
ipv4_address: 192.168.1.7
ports:
- 6385:6379
- 16385:16379
# command: /usr/local/bin/redis-sentinel /usr/src/redis/conf/sentinel.conf
networks:
mybridge:
external:
name: mynetwork
在docker-compose.yml文件的目录下执行docker-compose up -d命令启动redis容器。完成之后可以通过docker ps命令查看启动后的容器情况,如果启动正常会有如下页面

分别有每个容器的id以及容器对应的镜像名称,表示是从redis:test这个镜像构建的

三.搭建redis集群

通过命令docker exec -it 868a909ee66c sh 命令进入到redis-6这个容器中,当然也可以选择进入到别的容器。查看当前容器的端口占用情况,会出现如下所示,表示redis启动正常。

redis5版本之后提供了cluster命令,使得构建cluster集群变得非常方便,使用如下命令即可

redis-cli --cluster create 192.168.1.2:6379 192.168.1.3:6379 192.168.1.4:6379 192.168.1.4:6379 192.168.1.6:6379 192.168.1.7:6379 --cluster-replicas 1

说明:

  -cluster create:表示使用redis的cluster命令创建集群,后面跟着每个redis实例对应的ip和端口

  --cluster-replicas:表示一个主节点有几个从节点,本次配置为一个

运行上述命令创建集群如果正常的话,redis会自动分别主从以及slot的分配,然后会询问是否接受它的分配规则,选择yes即可。具体情况如下图

第一次出现错误是应为我在redis的配置文件中配置了密码,在生成集群时没有加上密码导致认证不通过。加上之后重新运行命令会自动生成集群。看到如下界面表示redis集群创建成功。

使用redis-cli  -a 123456 cluster nodes查看集群节点的分布情况。

选择192.168.1.2(master中的一个)这个redis实例

设置key first的值,会首先计算first对应的hash值,然后根据哈希值与slot的个数取余,决定first应该存放到哪个redis实例中,途中提示first应该到192.168.1.4中的redis中。进入到192.168.1.4对应的redis中,同样进行设置操作。结果如下。

至此,整个redis集群搭建完毕。

注:redis配置文件的内容

bind 0.0.0.0
port 6379
tcp-keepalive 300
supervised no
loglevel notice
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
dir "/usr/src/redis/data"
masterauth "123456"
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
requirepass "123456"
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
cluster-enabled yes
cluster-node-timeout 15000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes



docker搭建redis集群的更多相关文章

  1. docker搭建redis集群和Sentinel,实现故障转移

    0.引言 公司开发需要用到redis,虽然有运维自动搭建,还是记录下如何搭建redis集群和Sentinel. 采用的是vagrant虚拟机+docker的方式进行搭建. 搭建思路: 首先是借鉴下其他 ...

  2. 利用Docker搭建Redis集群

    Redis集群搭建 运行Redis镜像 分别使用以下命令启动3个Redis docker run --name redis-6379 -p 6379:6379 -d hub.c.163.com/lib ...

  3. Docker:Docker搭建Redis集群(6)

    国外的公有云实在是太慢了,经常time out 这里搜集几个国内出名的: hub.c.163.com (网易:https://c.163.com/hub#/m/home/) dev.aliyun.co ...

  4. 5分钟实现用docker搭建Redis集群模式和哨兵模式

    如果让你为开发.测试环境分别搭一套哨兵和集群模式的redis,你最快需要多久,或许你需要一天?2小时?事实是可以更短. 是的,你已经猜到了,用docker部署,真的只需要十几分钟. 一.准备工作 拉取 ...

  5. 使用docker搭建redis集群

    创建网卡 docker network create redis --subnet 172.20.0.0/ --gateway 172.20.0.1 通过脚本创建6个redis配置 for i in ...

  6. docker 搭建 redis 集群(哨兵模式)

    文件结构 1. redis-sentinel 1-1. docker-compose.yml 1-2. sentinel 1-2-1 docker-compose.yml 1-2-2 sentinel ...

  7. 基于Docker的redis集群搭建

    Redis集群官方介绍:http://www.redis.cn/topics/cluster-tutorial.html 基于Docker搭建Redis集群 环境:6个节点,三主三从 制作Redis镜 ...

  8. docker 实现redis集群搭建

    摘要:接触docker以来,似乎养成了一种习惯,安装什么应用软件都想往docker方向做,今天就想来尝试下使用docker搭建redis集群. 首先,我们需要理论知识:Redis Cluster是Re ...

  9. 从零开始学习docker之在docker中搭建redis(集群)

    docker搭建redis集群 docker-compose是以多容器的方式启动,非常适合用来启动集群 一.环境准备 云环境:CentOS 7.6 64位 二.安装docker-compose #需要 ...

随机推荐

  1. CF877E Danil and a Part-time Job

    题目大意: link 有一棵 n 个点的树,根结点为 1 号点,每个点的权值都是 1 或 0 共有 m 次操作,操作分为两种 get 询问一个点 x 的子树里有多少个 1 pow 将一个点 x 的子树 ...

  2. vue+elmentUI项目的正则判断

    一.为了方便重复利用管理,我创建一个regExp.ts文件来管理正则的表达式,内容如下: 1 /* eslint-disable */ 2 const phoneNumberRegExp = /^[1 ...

  3. 优质分享 | Spring Boot 入门到放弃!!!

    持续原创输出,点击上方蓝字关注我 目录 前言 视频目录 如何获取? 总结 前言 最近不知不觉写Spring Boot专栏已经写了九篇文章了,从最底层的项目搭建到源码解析以及高级整合的部分,作者一直在精 ...

  4. linux 虚拟机下 安装redis

    虚拟机安装linux,打开,挂起就好: 使用ssh连接,这里使用的是Moba Xterm 可以ssh 可以ftp  满足你的日常开发所需,开发必备.每个人都有自己顺手的工具,你喜欢就好 虚拟机挂一边就 ...

  5. 2014年 实验三 B2B模拟实验(一)

    [实验目的] ⑴.熟悉企业网络银行和电子证书的应用 ⑵.通过B2B模拟实验掌握B2B的交易过程 [实验条件] ⑴.个人计算机一台 ⑵.计算机通过局域网形式接入互联网 (3).电子商务模拟实验室软件包. ...

  6. 多测师讲解html _段落标签002_高级讲师肖sir

    <html> <head> <meta charset="UTF-8"> <title>段落标签</title> < ...

  7. 多测师讲解python_模块间的调用_高级讲师肖sir

    案例1: 在aaa.py  文件A类中定义一个函数sadp: 在bbb.py文件中导入aaa模块,导入类 ,调用函数 案例2: aaa模块中定义一个A类, 在定义一个sadp的函数, 在bbb模块中导 ...

  8. 联赛模拟测试17 A. 简单的区间 启发式合并

    题目描述 分析 我们要找的是一段区间的和减去该区间的最大值能否被 \(k\) 整除 那么对于一段区间,我们可以先找出区间中的最大值 然后枚举最大值左边的后缀与最大值右边的前缀之和是否能被 \(k\) ...

  9. C 和 C++ 打起来了!曾今最亲密的伙伴到现今的不爽?

    70年代初,贝尔实验室创建了C语言,它是开发UNIX的副产品.很快C就成为了最受欢迎的编程语言之一.但是对于Bjarne Stroustrup来说,C的表达能力还不够.于是,他在1983年的博士论文中 ...

  10. C++里面类和对象是什么意思?

    本文章向大家介绍C++类和对象到底是什么意思?,主要包括C++类和对象到底是什么意思?使用实例.应用技巧.基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下.   C++ 是一门 ...