zoukankan      html  css  js  c++  java
  • 应用篇 = Docker下的Redis

    一。工具介绍

    1.1 什么是Docker?

    Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目。使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。

    但Docker和传统容器有一定区别,如下图:

    image

    image

    1.2 什么是Redis?

    Redis是一个开源的高性能的key-value存储系统。
    传送门

    Redis特点:

    • 1、Redis支持数据的持久化,可以以AOFRDB的形式将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
    • 2、Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,sorted set,hash等数据结构的存储。
    • 3、Redis支持数据的备份,即master-slave模式的数据备份。

    Redis优势:

    • 1、性能极高 – Redis能读的速度是110000次/s, 写的速度是81000次/s 。
    • 2、丰富的数据类型 – Redis支持二进制案例的 String, List, Hash, Set 及 Sorted Set 数据类型操作。
    • 3、原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
    • 4、丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性

    二。按部就班(安装使用)

    2.1 镜像的选择和下载

    2.1.1 查找Docker Hub 的Redis镜像

    runoob@runoob:~/redis$ docker search redis
    NAME                      DESCRIPTION                   STARS  OFFICIAL  AUTOMATED
    redis                     Redis is an open source ...   2321   [OK]       
    sameersbn/redis                                         32                   [OK]
    torusware/speedus-redis   Always updated official ...   29             [OK]
    bitnami/redis             Bitnami Redis Docker Image    22                   [OK]
    anapsix/redis             11MB Redis server image ...   6                    [OK]
    webhippie/redis           Docker images for redis       4                    [OK]
    clue/redis-benchmark      A minimal docker image t...   3                    [OK]
    williamyeh/redis          Redis image for Docker        3                    [OK]
    unblibraries/redis        Leverages phusion/baseim...   2                    [OK]
    greytip/redis             redis 3.0.3                   1                    [OK]
    servivum/redis            Redis Docker Image            1                    [OK]
    

    2.1.2 拉去镜像

    这里我们拉取官方的镜像, 使用默认的版本标签latest.

    runoob@runoob:~/redis$ docker pull redis
    

    2.1.3 查看镜像

    runoob@runoob:~/redis$ docker images
    

    2.2 镜像的启动

    2.2.1 方法1:直接启动

    runoob@runoob:~/redis$ docker run --name clock-redis -p 6379:6379 -v $PWD/data:/data  -d redis redis-server --appendonly yes
    43f7a65ec7f8bd64eb1c5d82bc4fb60e5eb31915979c4e7821759aac3b62f330
    

    参数解读:

    • --name clock-redis 启动的容器名字
    • run docker命令, 运行一个image
    • -p 知道映射端口
    • 6379:6379 前面的6379表示映射到宿主机的端口,后面的端口表示Docker容器内,Redis监听的端口
    • -v 指定变量,本次为指定redis的一个文件夹映射
    • $PWD/data:/data 将容器内的/data文件夹映射到宿主机的$PWD/data
    • -d redis 指定启动的镜像
    • redis-server --appendonly yes 随容器启动时,容器内执行的命令,本次为启动Redis服务,并且开启AOF持久化
    • 43f7a65ec7f8bd64···· 执行后的返回值,启动成功后的container ID

    三。略有不足

    端口固定

    这里需要注意,在本人旻天Clock使用官方的Redis容器时,还有一个Bug,就是映射到宿主机的外部端口必须也是6379,才可以通过连接宿主连接到Redis上, 不知道现在修复了没有。

    解决办法

    第一次遇到这个问题, 我的解决思路很暴力, 就是换了一个镜像。

    因此我选择了使用次数仅次于(在2018.11.11)官方的一个镜像bitnami/redis, 获取方法大同小异,启动方式,这会我选择了使用Compose.yml启动:

    version: '3'
    
    services:
      redis:
        image: 'bitnami/redis:latest'
        environment:
            - ALLOW_EMPTY_PASSWORD=yes
        ports:
            - '6378:6379'
        volumes:
            - /path/to/redis-persistence:/bitnami/redis/data
    

    注意, Compose.yml文件不能有tab制表符,只能用space空格代替。

    启动命令:

    runoob@runoob:~/redis$ docker stack deploy -c Compose.yml pharbers
    

    其中pharbers为启动的服务前缀,此时查看服务,如下:

    runoob@runoob:~/redis$ docker service ls
    ID                  NAME                                          MODE                REPLICAS            IMAGE                                                       PORTS
    agk34y1fixyb        pharbers_apm                                  replicated          1/1                 clockq/pharbers-apm:latest                                  *:18002->9000/tcp
    rkno8e48wlad        pharbers_redis                                replicated          1/1                 clockq/redis:latest                                         *:6378->6379/tcp
    

    四。只要思想不滑坡, 方法总比困难多

    本来已经可以爽爽的使用Redis了,可惜有一天,我发现Redis里面的数据空了, 并且被人插入了几条看着很陌生的数据,不用想,肯定被黑了。

    这里有几点方法, 可以大大减少被黑的几率

    4.1 修改外部端口

    这个在上面已经说过了, 不咋赘述。

    4.2 设置连接密码

    我们继续使用bitnami/redis镜像, 在启动的Compose.yml文件中, 加入

    environment:
        - REDIS_PASSWORD=password123
    

    4.3 禁用管理命令

    同样, 我们在Compose.yml文件中加入:

    environment:
        - DISABLE_COMMANDS=FLUSHDB,FLUSHALL,CONFIG
    

    4.4 上面的都不好使

    理论上吧,上面的每一步,都是很简单的,只要改写启动的Compose.yml启动文件就行了。但是不排除有人和旻天Clock一样的脸黑,以上命令设置后,无法启动Redis镜像,还有人可能不放心别人打包的镜像, 或者想要使用redis自己的配置文件redis.conf

    所以, 我们就需要打包一个自己的redis镜像, 步骤如下:

    1. 编写redis.conf
      找到一份redis.conf配置文件,并且加入自己的自定义配置,其中包括禁用命令,如下:
    rename-command CONFIG ""
    rename-command FLUSHALL ""
    rename-command FLUSHDB ""
    
    1. 生成镜像
      编写一个Dockerfile文件,里面内容如下:
    FROM redis
    COPY redis.conf /usr/local/etc/redis/redis.conf
    CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
    

    注意,要将redis.confDockerfile放到同一目录

    运行命令生成镜像

    runoob@runoob:~/redis$ docker build -t redis:pharbers .
    
    1. 启动镜像
      使用Compose.yml启动,内容如下:
    version: '3'
    
    redis:
        image: redis:pharbers
        ports:
          - "6378:6379"
        volumes:
          - /root/redis_data/redis.conf:/usr/local/etc/redis/redis.conf
          - /root/redis_data:/data
    

    原文地址https://www.cnblogs.com/clockq/p/9946513.html

    至此, 本人会的Docker+Redis就交代完了,各位观众赏脸,可以留言讨论一下, 谢谢各位!!!

  • 相关阅读:
    初学Android: 四大组件之Activity
    jQuery Pagination Plugin ajax分页控件
    PHPExcel 多工作表 导入
    PHPExcel 多工作表 导出
    js常用方法
    如何让多个不同版本的jquery库共存
    总结机器学习部分计算原理—续
    第四周学习进度报告
    总结机器学习部分计算原理
    数据清洗报告
  • 原文地址:https://www.cnblogs.com/clockq/p/9946513.html
Copyright © 2011-2022 走看看