• 本文环境

前言

  • 首先需要安装好 Docker,可以参考Ubuntu 安装 Docker
    • 使用 Docker 需要 root 权限,推荐将用户加入 Docker 用户组(上文中有),这样使用就不需要加上sudo了(但是我是 root,所以文中都没加
  • Docker Hub 中的 Redis 官方镜像文档 redis - Official Image | Docker Hub

1.寻找镜像

在 Docker 仓库中查找 Redis 镜像

1
docker search redis


可以看到第一个就是我们需要的镜像

2.拉取镜像

在查找到 Redis 的镜像后,就可以进行拉取

1
docker pull redis


因为没有指定 Redis 的版本,所以默认拉取最新的版本(即 latest)
如果想要拉取指定的版本,可以在拉取时添加版本号(redis:tag),以 Redis 7.2.3 版本为例

1
docker pull redis:7.2.3

3.查看镜像

拉取完毕后,检查镜像是否安装完成

1
2
## 查看所有镜像
docker images


可以看到已经有 Redis 的镜像了

4.创建容器并启动

通过 Docker 安装 Redis 和直接安装 Redis 的一处不同在于通过 Docker 创建的 Redis 容器中是没有redis.conf配置文件的
Redis 可以在没有配置文件的情况下使用内置的默认配置启动,但是这种方法只建议在测试和开发的时候使用,当然 Redis 官方也给我们提供了使用配置文件启动 Redis 容器的方法,因此下面介绍两种方法

一、无配置文件简易版

1
2
3
4
5
6
7
# 容器名称、端口、密码均可自行指定
docker run \
--name redis \
-p 6379:6379 \
-- requirepass 123456 \
-d \
redis

参数说明:

  • --name redis:指定容器的名称为 redis(可以自己指定)
  • -p 6379:6379:将容器的 6379(右边的)端口映射到宿主机的 6379(左边的)端口(前提是不被占用)
  • -- requirepass 123456:设置密码为 123456
    • 如果不想设置密码可以不使用该参数,但是需要注意为了便于容器外能够访问到该容器内的 Redis,其protected mode(保护模式)默认关闭,这意味着如果你将端口暴露在主机外部,它将在没有密码的情况下对所有人开放
  • -d:以后台的方式运行
  • redis:tag:指定创建容器的镜像(:tag指定版本,不加默认最新版)
    • 建议创建容器时使用:tag指定版本,可以使用docker images查看镜像的版本,以免过段时间版本更新后导致现在拉取的镜像已经不是最新版本,又重新拉取一个最新版本的镜像进行容器创建

执行后返回的一长串是容器 id

说明

该方式创建的容器适合在测试环境使用,简单方便,但是没法通过配置文件去自定义一些配置,而且数据容易丢失,一旦关机或者容器挂了数据就没了,因为是存在缓存里的

二、 配置文件挂载版

准备配置文件

先准备一个目录用于存放配置文件(用于后面创建容器时挂载配置),目录可以自己选择,通常选择放在用户的主目录下的一个子目录中,好处是每个用户都有自己的挂载目录,可以隔离不同用户的数据
但是因为我的云服务器只有我一个人在玩,平常都是直接用的 root 用户,所以直接在根目录下创建了一个/data目录用来存放 Docker 容器的挂载配置和数据,因此我这边准备的目录在/data/redis/

1
2
# 创建用于 Redis 容器配置文件挂载的目录
mkdir /data/redis/conf

然后提前在该目录下新建一个redis.conf文件

1
2
# 新建 redis.conf 文件
touch /data/redis/conf/redis.conf

创建完配置文件后,直接去 Redis 的官网找对应版本的配置文件 Redis configuration | Redis

往下滑可以找到各个不同版本的配置文件
因为我拉取的是最新版本的镜像,所以这边选择第一个 7.2 版本(最新版本),根据拉取 Redis 的实际版本选择即可
点进去后就可以看到配置文件的内容,本文就不具体介绍了,可以自行了解

直接ctrl+a + ctrl+c复制,然后用 vim 打开我们之前准备好的redis.conf文件

1
vim /data/redis/conf/redis.conf

输入i进入编辑模式,ctrl+v粘贴,然后别急着保存退出,还需要修改一些配置

编辑配置文件

修改配置主要是为了能在宿主机访问容器中的 Redis,因为配置文件中的protected-mode(保护模式)设置是开启的

  • 保护模式:如果符合下面两个条件(不是之一)则无法被外部访问
    1. 没有明确使用 bind 绑定某个 ip 地址
    2. 没有设置密码
取消本地绑定/绑定某个 ip 地址

定位到bind 127.0.0.1 -::1,将其注释

bind 127.0.0.1 -::1的意思是限制只能本地访问(即只有该容器内部才可以访问,容器外的宿主机也访问不了),注释掉表示允许所有 ip 访问
当然也可以选择绑定指定 ip 允许其访问

设置密码

定位到## requirepass foobared,取消其注释,并将foobared修改为你想设置的密码

比如我这边就将密码设置为了123456
如果不想设置密码还想被外部宿主机访问,那就需要另外定位到protected-mode yes,将参数修改为no(解除保护模式的限制)

其他配置
1
2
3
4
5
## 默认 no,表示不以守护进程启动,Docker 部署不需要改为 yes,因为 docker run -d 本身就是后台启动
daemonize no

## 开启持久化,根据需求选择是否开启,会将数据持久化到容器中的 /data 目录
appendonly yes

更多其他配置根据自己需求修改,本文不多介绍

以配置文件方式创建容器并启动

1
2
3
4
5
6
7
8
9
10
# 容器名称、端口、挂载目录均可自行指定
docker run \
--name redis \
-p 6379:6379 \
-v /data/redis/conf:/usr/local/etc/redis \
# 如果配置了 appendonly yes(持久化)可以选择挂载该目录
-v /data/redis/data:/data \
-d \
redis \
redis-server /usr/local/etc/redis/redis.conf

简易版的参数就不再介绍了,说明一下新参数:

  • -v:数据卷挂载
    • /data/redis/conf:/usr/local/etc/redis:将容器中/usr/local/etc/redis目录挂载到宿主机的/data/redis/conf目录
      • /data/redis/conf目录即之前准备的存放redis.conf文件的目录,这里可以理解为 Docker 容器和宿主机共享该配置文件
    • /data/redis/data:/data:将容器中/data数据目录挂载到宿主机的/data/redis/data目录
      • 如果开启了持久化,进行挂载可以避免持久化的数据丢失,如果不挂载的话在删除容器后会丢失该容器中持久化的数据,即挂载后即使容器删除,只要宿主机目录中的数据还存在,使用该目录新创建的容器中依旧有原先容器中挂载的数据
      • 如果没有开启持久化也就不需要挂载\data数据目录了,因为 Redis 的数据都存在缓存里,不开启持久化也不会在该目录下存储数据
      • 宿主机用于挂载的目录(比如我这边的/data/redis/data)可以自行选择,一般就放在配置目录旁边
  • redis-server /usr/local/etc/redis/redis.conf:以配置文件启动容器,加载容器内的redis.conf文件,实际找到的是挂载在宿主机中配置目录下的reids.conf


返回的一长串是创建的容器 id

6.查看容器

检查容器是否创建成功

1
2
# 查看运行中的容器
docker ps


可以看到创建的 Redis 容器已经在运行中了
我们可以通过 Docker 命令进入 Redis 容器内部

1
2
3
4
5
# 这里的 redis 是创建容器时自行指定的容器名称
docker exec -it redis /bin/bash

# 也可以使用容器 id(即上图中的 CONTANINER ID)
docker exec -it 7cd1552e2cf5 /bin/bash


进入后就可以和在 linux 中一样使用 Redis 了
输入redis-cli -a 123456即可进入 Redis 命令行,-a后面的参数是你设置的密码

后续使用和正常 Redis 一样,想要退出 Redis 和容器使用exit命令即可

7.删除容器

不能直接删除运行中的容器,因此需要先停止容器再删除

1
2
3
4
5
# 这里的 redis 是创建容器时自行指定的容器名称
# 停止容器
docker stop redis
# 删除容器
docker rm redis

但是可以加上-f参数来强制删除运行中的容器

1
2
# 这里的 redis 是创建容器时自行指定的容器名称
docker rm -f redis