# Redis
针对 [Redis](https://redis.io) 应用的 Docker 镜像,用于提供 Redis 服务。
详细信息可参照:[官方说明](https://redis.io/documentation)
**版本信息:**
- latest
- 7.0.12
**镜像信息:**
* 镜像地址:
- 阿里云: registry.cn-shenzhen.aliyuncs.com/colovu/redis:latest
- Colovu Registry: docker.colovu.com/colovu/redis:latest
- 依赖镜像:colovu/debian:12
> 后续相关命令行默认使用 Aliyun ACR 镜像服务器做说明
## TL;DR
Docker 快速启动命令:
```shell
# 从 Registry 服务器下载镜像并启动
$ docker run -d -e ALLOW_ANONYMOUS=yes --name imgname registry.cn-shenzhen.aliyuncs.com/colovu/redis:latest
```
- `registry.cn-shenzhen.aliyuncs.com/colovu/imgname:`:镜像名称及版本标签 TAG;标签不指定时默认使用`latest`
Docker-Compose 快速启动命令:
```shell
# 从 Gitee 下载 Compose 文件
$ curl -sSL -o https://gitee.com/colovu/docker-redis/raw/master/docker-compose.yml
# 从 Github 下载 Compose 文件
$ curl -sSL -o https://raw.githubusercontent.com/colovu/docker-redis/master/docker-compose.yml
# 创建并启动容器
$ docker-compose up -d
```
Docker-Compose 主从集群快速启动命令:
```shell
$ curl -sSL -o https://raw.githubusercontent.com/colovu/docker-redis/master/docker-compose-cluster.yml
$ docker-compose -f docker-compose-cluster.yml up -d
```
---
## 默认对外声明
### 端口
- 6379:Redis 业务客户端访问端口
- 26379:Redis Sentinel 端口
### 数据卷
镜像默认提供以下数据卷定义,默认数据分别存储在自动生成的应用名对应`redis`子目录中:
```shell
/srv/redis/data # Redis 数据文件,主要存放 Redis 持久化数据
/srv/redis/conf # Redis 配置文件
/srv/redis/cert # TLS 通讯证书文件
/srv/redis/log # 日志文件,日志文件名为:redis.log
/var/run/redis # 进程运行 PID 文件,PID 文件名为:redis.pid、redis_sentinel.pid
```
如果需要持久化存储相应数据,需要**在宿主机建立本地目录**,并在使用镜像初始化容器时进行映射。宿主机相关的目录中如果不存在对应应用 Redis 的子目录或相应数据文件,则容器会在初始化时创建相应目录及文件。
## 容器配置
在初始化 Redis 容器时,如果没有预置配置文件,可以在命令行中设置相应环境变量对默认参数进行修改。类似命令如下:
```shell
$ docker run -d -e "REDIS_CFG_KEYNAME=key_value" registry.cn-shenzhen.aliyuncs.com/colovu/redis:latest
```
### 自动变量替换
针对应用配置文件中的配置项,支持由环境变量名自动替换生成,该类环境变量需要使用统一前缀,定义规则为:`REDIS_CFG_*=`
- `REDIS_CFG_`:环境变量自动替换标识,具备该前缀的环境变量会被自动处理并更新至配置文件
- `*`:配置文件中对应的配置项名,大小写需要符合实际参数名要求;特殊字符需要符合`特殊字符替换规则`
- ``:配置项对应值
**特殊字符替换规则**:
因为 Shell 变量只能以字母、数字和下划线组成,针对'xml'、'ini'等配置文件中使用的'.'、'-'等特殊字符,需要进行重定义及转换。预定义如下:
+ "_" ==> "-" : 应用配置属性中的`-`(中划线),与环境变量中由`_`(单下划线)表示
+ "__" ==> "_" : 应用配置属性中的`_`(下划线),在环境变量中由`__`(双下划线)表示
+ "___" ==> "." : 应用配置属性中的`.`(半角点),在环境变量中由`___`(三下划线)表示
例如:
```shell
# 用于`key-value`类型的配置
REDIS_CFG_REQUIREPASS=colovu123
REDIS_CFG_APPENDONLY=no
# 容器启动后,应用配置文件中对应配置项生效,且设置为相应值:
requirepass colovu123
appendonly no
```
### 常规配置参数
常使用的环境变量主要包括:
- **ALLOW_ANONYMOUS**:默认值:**no**。设置是否允许无密码连接。如果没有设置`REDIS_CFG_REQUIREPASS`,则必须设置当前环境变量为 `yes`
- **REDIS_CFG_REQUIREPASS**:默认值:**无**。客户端认证的密码
- **REDIS_CFG_APPENDONLY**:默认值:**no**。设置是否启用 Append Only File 存储
### 常规可选参数
如果没有必要,可选配置参数可以不用定义,直接使用对应的默认值,主要包括:
- `ENV_DEBUG`:默认值:**false**。设置是否输出容器调试信息。可选值:false、no、true、yes
- **DISABLE_COMMANDS**:默认值:**无**。设置禁用的 Redis 命令
- **PASSWORD_FILE**:默认值:**无**。以绝对地址指定的客户端认证用户密码存储文件。该路径指的是容器内的路径
- **MASTER_PASSWORD_FILE**:默认值:**无**。以绝对地址指定的服务器密码存储文件。该路径指的是容器内的路径
- **REDIS_CFG_PORT**:默认值:**6379**。设置应用的默认客户访问端口
### Sentinel配置参数
- **REDIS_SENTINEL_HOST**:默认值:**无**
- **REDIS_SENTINEL_MASTER_NAME**:默认值:**无**
- **REDIS_SENTINEL_PORT_NUMBER**:默认值:**26379**。设置 Sentinel 默认端口
### TLS配置参数
使用证书加密传输时,相关配置参数如下:
- **REDIS_CFG_TLS_PORT**:使用 TLS 加密传输的端口。默认值:**6379**
- **REDIS_CFG_TLS_CERT_FILE**:TLS 证书文件。默认值:**无**
- **REDIS_CFG_TLS_KEY_FILE**:TLS 私钥文件。默认值:**无**
- **REDIS_CFG_TLS_CA_CERT_FILE**:TLS 根证书文件。默认值:**无**
- **REDIS_CFG_TLS_AUTH_CLIENTS**:配置客户端是否需要 TLS 认证。 默认值:**no**
当使用 TLS 时,则默认的 non-TLS 通讯被禁用。如果需要同时支持 TLS 与 non-TLS 通讯,可以使用参数`REDIS_CFG_TLS_PORT`配置容器使用不同的 TLS 端口。
## 安全
### 用户及密码
Redis 镜像默认禁用了无密码访问功能,在实际生产环境中建议使用用户名及密码控制访问;如果为了测试需要,可以使用以下环境变量启用无密码访问功能:
```shell
ALLOW_ANONYMOUS=yes
```
通过配置环境变量`REDIS_PASSWORD`,可以启用基于密码的用户认证功能。命令行使用参考:
```shell
$ docker run -d -e REDIS_PASSWORD=colovu registry.cn-shenzhen.aliyuncs.com/colovu/redis:latest
```
使用 Docker-Compose 时,`docker-compose.yml`应包含类似如下配置:
```yaml
services:
redis:
...
environment:
- REDIS_CFG_REQUIREPASS=colovu
...
```
### 容器安全
本容器默认使用`non-root`运行应用,以加强容器的安全性。在使用`non-root`用户运行容器时,相关的资源访问会受限;应用仅能操作镜像创建时指定的路径及数据。使用`non-root`方式的容器,更适合在生产环境中使用。
如果需要切换为`root`方式运行应用,可以在启动命令中增加`-u root`以指定运行的用户。
## 注意事项
- 容器中应用的启动参数不能配置为后台运行,如果应用使用后台方式运行,则容器的启动命令会在运行后自动退出,从而导致容器退出
## 更新记录
- 2023.8.17: 更新 Redis 版本为 7.0.12
----
本文原始来源 [Endial Fang](https://github.com/colovu) @ [Github.com](https://github.com)