计划用 Docker 实现 Redis 的主从,简单主从而已。主的名称叫 redis-master

一步步来。

先新建个Dockerfile ,从alpine 开始,比较简单。

FROM alpine:latest
MAINTAINER qufo qufo@163.com # 换源
RUN echo 'http://mirrors.ustc.edu.cn/alpine/edge/main' > /etc/apk/repositories
RUN echo '@community http://mirrors.ustc.edu.cn/alpine/edge/community' >> /etc/apk/repositories
RUN echo '@testing http://mirrors.ustc.edu.cn/alpine/edge/testing' >> /etc/apk/repositories RUN apk update # 修正时区
ENV TIMEZONE Asia/Shanghai
RUN apk add tzdata
RUN ln -snf /usr/share/zoneinfo/$TIMEZONE /etc/localtime
RUN echo $TIMEZONE > /etc/timezone # 修改一些系统设置
RUN echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
RUN echo "echo never > /sys/kernel/mm/transparent_hugepage/enabled" >> /etc/rc.local # 开始安装 redis
RUN apk add redis
COPY start_redis.sh /usr/local/
RUN chmod +x /usr/local/start_redis.sh
RUN chown redis:redis /usr/local/start_redis.sh EXPOSE 6379 ENTRYPOINT ["sh","/usr/local/start_redis.sh"]
CMD ["master"]

可以看到,我们还需要一个启动脚本。start_redis.sh

redis_role=$1
sed -i 's/protected-mode yes/protected-mode no/g' /etc/redis.conf
sed -i 's/daemonize yes/daemonize no/g' /etc/redis.conf
sed -i 's/bind 127.0.0.1/bind 0.0.0.0/g' /etc/redis.conf echo "Start Redis by "
if [ $redis_role = "master" ]; then
echo "master"
redis-server /etc/redis.conf
elif [ $redis_role = "slave" ]; then
echo "slave"
sed -i 's/# slaveof <masterip> <masterport>/slaveof redis-master 6379/g' /etc/redis.conf
redis-server /etc/redis.conf
else
echo "unknow role!"
fi

这里修改了一些系统配置,然后根据传进来的 role 区别启动主或从模式。其中的主名称是写死了的 redis-master

好了,现在构建,在Dockerfile 和 start_redis.sh 所在的目录下,执行

docker rmi qufo/redis
docker build -t="qufo/redis" .

我们就得到了一个名为 qufo/redis 的 image , 因为采用的是 alpine 的包,所以速度很快,在我的机器上大概7秒就完成了。

通过

docker images

看下镜象的信息,只有9M多些。

好了,现在来启动他们,启运完后检查一下是不是都在。

ufo@ubuntu:~$ docker run -d --name=redis-master -p=6379:6379 qufo/redis master
ad7c5a6e16a8d87f04240c7bcb20ef765eab832737f32457e956966a2f282179
ufo@ubuntu:~$ docker run -d --name=node1 --link=redis-master:redis-master -p=7001:6379 qufo/redis slave
8cef160881f59b017cd915775fa3f76d9456b510b300147779fd8ff4ba9f9a2c
ufo@ubuntu:~$ docker run -d --name=node2 --link=redis-master:redis-master -p=7002:6379 qufo/redis slave
767011663ef8b93b5326bd4f9940762922ee4a685278806d42b8ce690164de48
ufo@ubuntu:~$ docker run -d --name=node3 --link=redis-master:redis-master -p=7003:6379 qufo/redis slave
6c4bb442d5adb6773301bac29e6a7a5b1f636d47c67dc21c9ec0ec28cf988602
ufo@ubuntu:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6c4bb442d5ad qufo/redis "sh /usr/local/start_" 38 seconds ago Up 37 seconds 0.0.0.0:7003->6379/tcp node3
767011663ef8 qufo/redis "sh /usr/local/start_" 48 seconds ago Up 47 seconds 0.0.0.0:7002->6379/tcp node2
8cef160881f5 qufo/redis "sh /usr/local/start_" 57 seconds ago Up 56 seconds 0.0.0.0:7001->6379/tcp node1
ad7c5a6e16a8 qufo/redis "sh /usr/local/start_" About a minute ago Up About a minute 0.0.0.0:6379->6379/tcp redis-master

可以看到有一主(redis-master)多从 node1,node2,node3。

现在来试一下,在主里 set ,从里 get

# 利用映射出来的端品直接连 redis-master
ufo@ubuntu:~/$ redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:3
slave0:ip=172.17.0.3,port=6379,state=online,offset=239,lag=0
slave1:ip=172.17.0.4,port=6379,state=online,offset=239,lag=1
slave2:ip=172.17.0.5,port=6379,state=online,offset=239,lag=1
master_repl_offset:239
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:238
127.0.0.1:6379> set username qufo
OK
127.0.0.1:6379> get username
"qufo"
127.0.0.1:6379> exit
# 可见 为 master 模式,在里面设置和 username
# 通过 7001 连接 node1
ufo@ubuntu:~/$ redis-cli -p 7001
127.0.0.1:7001> info replication
# Replication
role:slave
master_host:redis-master
master_port:6379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:327
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:7001> get username
"qufo"
127.0.0.1:7001> set username nothing
(error) READONLY You can't write against a read only slave.
127.0.0.1:7001> exit
ufo@ubuntu:~/$
# 可见为 slave 模式,可以 get username ,但不能 set username 因为slave 是只读的。

好吧,主从配置完成。

Docker 实现的 redis 主从的更多相关文章

  1. 在docker中部署redis主从配置

    环境说明: 阿里云服务器 Ubuntu 16.04 docker 1.拉取Redis镜像 docker pull redis 2.配置Redis启动配置文件,此处我创建一个专用目录,存放Redis相关 ...

  2. nopCommerce 3.9 大波浪系列 之 使用部署在Docker中的Redis缓存主从服务

    一.概述 nop支持Redis作为缓存,Redis出众的性能在企业中得到了广泛的应用.Redis支持主从复制,HA,集群. 一般来说,只有一台Redis是不可行的,原因如下: 单台Redis服务器会发 ...

  3. docker搭建redis主从集群和sentinel哨兵集群,springboot客户端连接

    花了两天搭建redis主从集群和sentinel哨兵集群,讲一下springboot客户端连接测试情况 redis主从集群 从网上查看说是有两种方式:一种是指定配置文件,一种是不指定配置文件 引用地址 ...

  4. docker部署redis主从和哨兵

    docker部署redis主从和哨兵 原文地址:https://www.jianshu.com/p/72ee9568c8ea 1主2从3哨兵 一.前期准备工作 1.电脑装有docker 2.假设本地i ...

  5. docker安装redis主从以及哨兵

    docker安装redis主从以及哨兵 本文使用docker在四台机器上部署一主二从三哨兵的Redis主从结构. 服务器配置 192.168.102.128 主节点 centos7.5 192.168 ...

  6. docker学习(四) - docker构建redis主从结构

    此文章假设你已经安装了docker,如果没有安装请查询本博客docker安装章节 容器网络 docker network ls  查看默认的网络 Docker安装后,默认会创建下面三种网络类型 在启动 ...

  7. nopCommerce 3.9 大波浪系列 之 使用Redis主从高可用缓存

    一.概述 nop支持Redis作为缓存,Redis出众的性能在企业中得到了广泛的应用.Redis支持主从复制,HA,集群. 一般来说,只有一台Redis是不可行的,原因如下: 单台Redis服务器会发 ...

  8. redis单点、redis主从、redis哨兵sentinel,redis集群cluster配置搭建与使用

    目录 redis单点.redis主从.redis哨兵 sentinel,redis集群cluster配置搭建与使用 1 .redis 安装及配置 1.1 redis 单点 1.1.2 在命令窗口操作r ...

  9. 基于docker/dockerfile实现redis主从复制

    今天我们来搭建基于docker实现redis主从复制集群 为什么要使用redis集群模式? Redis可以说是内存数据库,mysql的数据库是真实存储在硬盘里的,因此,redis的读取速度要比mysq ...

随机推荐

  1. “FPGA+云"助力高性能计算

    用AI防鲨鱼.用AI学写中国书法.用AI预测人类死亡时间.用AI审判罪犯……在人工智能方兴未艾的今天,越来越廉价和普及的AI领域真的是什么都不值钱,除了想象力.那在这无所不能的AI盛世,一定没道理让算 ...

  2. JDBC--数据库链接及相关方法的封装

    使用的是MySQL数据库,首先导入驱动类,然后根据数据库URL和用户名密码获得数据的链接.由于使用的是MySQL数据库,它的URL一般为,jdbc:mysql://主机地址:端口号/库名. 下面是封装 ...

  3. Linnx 服务器中mysql 无法正常访问问题

    本机连接远程Linnx服务器不通 1. 检测防火墙 -- 保证防火墙关闭 查看到iptables服务的当前状态:service iptables status. 但是即使服务运行了,防火墙也不一定起作 ...

  4. json用法常见错误

    Json用法三个常见错误   net.sf.json.JSONException: java.lang.NoSuchMethodException

  5. ES6中的新特性

    本人最近学习es6一些方法,难免有些手痒,想着能不能将这些方法总结下,如下 1.数组的扩展 1)首先什么是伪数组 无法直接调用数组方法或期望length属性有什么特殊的行为,但仍可以对真正数组遍历方法 ...

  6. Julia - 浮点型

    浮点数类型: Float64 类型,双精度,64 位 Float32 类型,单精度,32 位 Float16 类型,半精度,16 位 julia> 5.0 5.0 julia> 5. 5. ...

  7. python‘s first day for me

    计算机的基础 1,计算机由硬件及软件组成. 其中硬件主要包括了cpu,内存以及硬盘.软件则由操作系统以及一系列软件. 操作系统则可以操控硬件,使硬件完成一些需要的操作. python的历史 1989年 ...

  8. Python 小知识点(9)--反射

    通过字符串映射或修改程序运行时的状态.属性.方法.有如下四个方法 1.hasattr(obj,name_str) , 判断一个对象obj里是否有对应的name_str字符串的方法 2.getattr( ...

  9. Python 小知识点(7)--类的创建方式

    1. 创建类的第1方式(常用) class Foo(object): def func(self): print("Hello Foo") 2.创建类的第2方式 def func( ...

  10. 爬虫——回顾HTTP 协议

    一.HTTP协议 1.官方概念: HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文 ...