# Docker Redis

docker hub 网址:https://hub.docker.com/_/redis (opens new window)

当前(2020-04-02) latest 版本和 6.2.1 是同一个版本。

# 1. 安装及测试

# 查询中央仓库
docker search -f is-official=true redis

# 从中央仓库下载
docker pull redis:6.2.1

# 或,直接导入已有的镜像文件
# docker load -i redis-6.2.1.tar

# 查看本地镜像
docker images

# 会出现类似以下内容:
# REPOSITORY  TAG      IMAGE ID        CREATED        SIZE
# redis       6.2.1    7f33e76fcb56    45 hours ago   105MB

运行容器:

# 删除曾经已有的同名容器
docker stop redis-test
docker rm redis-test

# 创建并运行 redis 容器的语法
docker run -d --name <指定容器名> -p <指定宿主机端口>:6379 redis:6.2.1

例如:

docker run \
   -d \
   --name redis-test \
   -p 6379:6379 \
   redis:6.2.1

验证安装成功

  • 通过 docker ps 命令查看容器的运行信息:

  • 进入 redis-test 容器

    docker exec -it redis-test /bin/bash
    
  • 执行 redis-cli 连接 redis server

    redis-cli
    

后续可选操作:

  • 设置键值对

    连上 Redis Server 之后,执行 redis 命令:set test 1,会显示 OK

  • 从容器外部连接

    redis-cli -h <宿主机IP> -p <宿主机端口> -a <登录密码>
    

# 2. 容器中的配置文件和数据的存储

  • Docker Redis Server 的数据的存储目录在容器内部的

    /data
    

    很显然,只有开启持久化功能时,才会有数据存储于此。

  • 早期的 Docker Redis 在容器中有默认的配置文件,但现在没有了。

    从 5 版本开始 Docker Redis 改变了思路,容器内部不在包含配置文件,而是要求容器启动时指定宿主机中的一个文件作为配置文件

    例如:

    docker run \
      ... \
      -v <宿主机上的redis.conf>:/usr/local/etc/redis/redis.conf \
      redis:6.2.1 \
      redis-server /usr/local/etc/redis/redis.conf \
      ...
    

    说明

    当然,如果你没有提供配置文件,它还是有默认的配置的,只不过你在容器中找不到配置文件。

    5.0.6 的默认的配置文件的有效内容见最后。

# 3. 配置与挂载

  • 删除已存在的同名容器

    docker rm -f redis-6379
    

    后续可通过 docker run--rm 选项免去『删除』这步操作。

  • 创建本机挂载目录

    mkdir -p ~/docker/redis/6379/data
    touch ~/docker/redis/6379/redis.conf
    
  • 创建并运行容器

    docker run \
       -d \
       --name redis-6379 \
       -p 6379:6379 \
       -v ~/docker/redis/6379/redis.conf:/usr/local/etc/redis/redis.conf \
       -v ~/docker/redis/6379/data:/data \
       redis:6.2.1 \
       redis-server /usr/local/etc/redis/redis.conf \
       --appendonly yes 
    

    --appendonly yes 开启 Redis 持久化功能。

# 4. docker-compose 启动

version: '3'
services:
  redis:
    image: redis:5.0
    container_name: redis-6379
    mem_limit: 512m
    ports:
      - 6379:6379
    volumes:
      - "~/docker/6379/data:/data"
      - "./docker/6379/redis.conf:/usr/local/etc/redis/redis.conf"
    command:
      redis-server /usr/local/etc/redis/redis.conf --appendonly yes

# 5. redis.conf

bind 127.0.0.1
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly no
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
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
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
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes