用 Docker 部署一个可持久化的 Redis 服务

1718 字
9 分钟
用 Docker 部署一个可持久化的 Redis 服务

这篇文章是写给未来自己的 Docker + Redis 部署速记,从最简单的 docker rundocker-compose,把密码、持久化和常见坑一次性讲清楚。

一、为什么用 Docker 跑 Redis?#

在本地或服务器上部署 Redis,大致有两条路:

  • 直接在系统里安装(apt install redis-server 等)
  • 用 Docker 拉一个 Redis 容器跑起来

我更倾向于用 Docker,原因跟 MySQL 那篇类似:

  • 环境干净:不用在系统里装常驻服务,删容器就干净。
  • 版本可控:镜像标签里写明版本,比如 redis:7-alpine
  • 迁移容易:换机器只要装好 Docker,再跑一遍命令就能起来。

下面从零开始,一步步做到:

  1. 用 Docker 跑起一个 Redis 容器
  2. 给 Redis 加上密码和基础配置
  3. 开启数据持久化(重启/重建容器不丢数据)
  4. docker-compose 管理 Redis(以及未来的应用)

二、准备:拉取 Redis 镜像#

前提是 Docker 已安装(参考前一篇 MySQL 文章中的安装步骤),然后直接拉镜像:

Terminal window
docker pull redis:7-alpine

查看本地镜像:

Terminal window
docker images

看到类似 redis 7-alpine ... 就说明拉取成功。

三、第一次运行 Redis 容器(最小示例)#

先用一个最简单的命令把 Redis 跑起来:

Terminal window
docker run --name my-redis \
-p 6379:6379 \
-d redis:7-alpine

参数含义简单回顾:

  • --name my-redis:给容器取名,后续好操作。
  • -p 6379:6379:把宿主机 6379 映射到容器 6379。
  • -d:后台运行。
  • redis:7-alpine:使用刚才拉的 Redis 7 精简版镜像。

检查容器状态:

Terminal window
docker ps

能看到 my-redis 处于 Up 状态就说明服务已启动。

这个最小版本方便测试,但存在两个问题:

  1. 默认没有密码保护(不适合对外暴露)。
  2. 默认数据不做额外持久化设计,删容器很容易把数据带走。

下面逐步补上这些部分。

四、给 Redis 配置密码与基础参数#

Redis 的常见生产习惯是:

  • 打开 requirepass,给实例加一个访问密码。
  • 合理设置 appendonly 等参数,提高数据安全性。

在 Docker 里,有两种常用方式:

  • 启动命令里追加配置
  • 映射自定义配置文件

这里先用命令行参数的方式,便于快速上手。

Terminal window
docker stop my-redis
docker rm my-redis
docker run --name my-redis \
-p 6379:6379 \
-d redis:7-alpine \
redis-server --appendonly yes --requirepass "your_redis_password"

这里最后一行相当于执行:

  • 启动 redis-server
  • 打开 AOF 持久化:appendonly yes
  • 设置访问密码:requirepass your_redis_password

后续客户端连接时需要带上密码,否则会被拒绝。

五、开启持久化并挂载数据目录#

Redis 的数据持久化本身有 RDB、AOF 等多种机制,本文用的是 AOF(上一步已经开启)。
下一步要做的是:把容器里的数据目录挂载到宿主机,防止容器删掉时数据跟着消失。

Redis 默认把数据放在 /data 目录,我们可以创建一个宿主机目录映射过去。

1. 创建宿主机数据目录#

Linux / macOS:

Terminal window
mkdir -p ~/docker-data/redis

Windows:

Terminal window
mkdir C:\docker-data\redis

2. 用数据卷重新运行 Redis#

Terminal window
docker stop my-redis
docker rm my-redis
docker run --name my-redis \
-p 6379:6379 \
-v ~/docker-data/redis:/data \
-d redis:7-alpine \
redis-server --appendonly yes --requirepass "your_redis_password"

关键变化:

  • -v ~/docker-data/redis:/data:把容器的 /data 挂到宿主机目录,实现数据持久化。
  • 仍然通过 redis-server 的参数开启 AOF 并设置密码。

之后就算删掉 my-redis 容器,只要不动 ~/docker-data/redis 里的文件,新容器挂同一个目录也能读回原有数据。

六、简单连通性测试#

1. 用 redis-cli 连接(容器内部)#

可以进容器用内置的 redis-cli 测试:

Terminal window
docker exec -it my-redis sh

容器内执行:

Terminal window
redis-cli
AUTH your_redis_password
SET hello "docker-redis"
GET hello

能正常返回 "docker-redis",说明 Redis 正常工作且密码生效。

测试完退出:

Terminal window
exit
exit

2. 用客户端库连接(例如 Node.js)#

以 Node.js + ioredis 为例:

Terminal window
npm install ioredis
import Redis from "ioredis";
const redis = new Redis({
host: "127.0.0.1",
port: 6379,
password: "your_redis_password",
});
async function test() {
await redis.set("hello", "docker-redis");
const value = await redis.get("hello");
console.log("value:", value);
await redis.quit();
}
test().catch(console.error);

控制台输出 value: docker-redis 即说明和 Docker 里的 Redis 已连通。

七、用 docker-compose 管理 Redis#

当项目里不止 Redis 一个服务时,推荐用 docker-compose 把配置写进一个文件里统一管理。

在项目根目录(或单独的部署目录)创建 docker-compose.yml

version: "3.9"
services:
redis:
image: redis:7-alpine
container_name: my-redis
restart: always
ports:
- "6379:6379"
volumes:
- ./redis-data:/data
command:
- redis-server
- --appendonly
- "yes"
- --requirepass
- "your_redis_password"

这里做的几件事:

  • 把运行参数从 docker run 转成 YAML,更易读也好同步。
  • 加了 restart: always,机器/服务重启后自动拉起。
  • ./redis-data 做数据卷,数据跟着项目目录走。

docker-compose.yml 所在目录执行:

Terminal window
docker compose up -d

查看状态:

Terminal window
docker compose ps

停止服务:

Terminal window
docker compose down

默认 down 不会删除卷里的数据(除非加 -v)。

把应用也写进 docker-compose#

未来如果你的应用也用容器部署,可以在同一个 docker-compose.yml 里再加一个服务:

app:
build: .
container_name: my-app
depends_on:
- redis
environment:
REDIS_HOST: redis
REDIS_PORT: 6379
REDIS_PASSWORD: your_redis_password
ports:
- "8080:8080"

在同一个 compose 网络里,服务之间可以用 服务名 互相访问,所以 REDIS_HOSTredis 而不是 127.0.0.1

以后要启动整套服务,只需要一句:

Terminal window
docker compose up -d

八、几个常见坑#

1. 端口被占用#

如果启动时报类似 “Bind for 0.0.0.0:6379 failed: port is already allocated”,说明 6379 已被占用。

处理思路:

  • 查出占用 6379 的进程(Windows 用资源监视器,Linux 用 lsof -i:6379 等)。
  • 停掉本机自带的 Redis,只用 Docker 里的。
  • 或在 Docker 这边换个宿主机端口:
ports:
- "6380:6379"

客户端连接时用 6380 作为端口即可。

2. 数据卷权限问题#

在 Linux 上,如果把 /data 挂到权限控制较严格的目录,可能遇到读写失败,表现为容器启动即退出或日志里有权限报错。

建议:

  • 把卷挂到普通用户能读写的路径,比如 /home/youruser/docker-data/redis
  • 必要时调整目录权限:
Terminal window
sudo chown -R youruser:youruser /home/youruser/docker-data/redis

3. 密码与安全#

即使用的是内网环境,也建议:

  • 开启 requirepass
  • 不直接在仓库里的 docker-compose.yml 硬编码密码,而是用环境变量或 .env 文件:
REDIS_PASSWORD=your_redis_password
command:
- redis-server
- --appendonly
- "yes"
- --requirepass
- "${REDIS_PASSWORD}"

线上环境再配合防火墙或安全组,限制能访问 Redis 端口的 IP 范围。

九、简单回顾:从 0 到 可用#

本文的核心步骤可以压缩成几行:

  1. 拉镜像:docker pull redis:7-alpine
  2. docker run 跑起一个带密码、开启 AOF 的 Redis 容器。
  3. 挂载 /data 到宿主机目录,实现数据持久化。
  4. redis-cli 或客户端库测试 AUTHSETGET 是否正常。
  5. 把配置写进 docker-compose.yml,加上 restart: always 和数据卷映射,方便一键启动。
  6. 视情况把应用也写进 compose,用服务名作为 REDIS_HOST

目的仍然是留下一套自己顺手、可靠的 Redis 部署流程,方便以后再需要一个 Redis 实例时,少查几篇博客、少踩几次同样的坑。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
用 Docker 部署一个可持久化的 Redis 服务
https://firefly.cuteleaf.cn/posts/docker-redis-deploy/
作者
Airio_
发布于
2026-02-26
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
Airio_
Hello, I'm Airio_.
公告
欢迎来到OfoCa Space。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
6
分类
1
标签
16
总字数
18,733
运行时长
0
最后活动
0 天前

目录