用 Docker 部署一个可持久化的 Redis 服务
这篇文章是写给未来自己的 Docker + Redis 部署速记,从最简单的
docker run到docker-compose,把密码、持久化和常见坑一次性讲清楚。
一、为什么用 Docker 跑 Redis?
在本地或服务器上部署 Redis,大致有两条路:
- 直接在系统里安装(
apt install redis-server等) - 用 Docker 拉一个 Redis 容器跑起来
我更倾向于用 Docker,原因跟 MySQL 那篇类似:
- 环境干净:不用在系统里装常驻服务,删容器就干净。
- 版本可控:镜像标签里写明版本,比如
redis:7-alpine。 - 迁移容易:换机器只要装好 Docker,再跑一遍命令就能起来。
下面从零开始,一步步做到:
- 用 Docker 跑起一个 Redis 容器
- 给 Redis 加上密码和基础配置
- 开启数据持久化(重启/重建容器不丢数据)
- 用
docker-compose管理 Redis(以及未来的应用)
二、准备:拉取 Redis 镜像
前提是 Docker 已安装(参考前一篇 MySQL 文章中的安装步骤),然后直接拉镜像:
docker pull redis:7-alpine查看本地镜像:
docker images看到类似 redis 7-alpine ... 就说明拉取成功。
三、第一次运行 Redis 容器(最小示例)
先用一个最简单的命令把 Redis 跑起来:
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 精简版镜像。
检查容器状态:
docker ps能看到 my-redis 处于 Up 状态就说明服务已启动。
这个最小版本方便测试,但存在两个问题:
- 默认没有密码保护(不适合对外暴露)。
- 默认数据不做额外持久化设计,删容器很容易把数据带走。
下面逐步补上这些部分。
四、给 Redis 配置密码与基础参数
Redis 的常见生产习惯是:
- 打开
requirepass,给实例加一个访问密码。 - 合理设置
appendonly等参数,提高数据安全性。
在 Docker 里,有两种常用方式:
- 启动命令里追加配置
- 映射自定义配置文件
这里先用命令行参数的方式,便于快速上手。
docker stop my-redisdocker 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:
mkdir -p ~/docker-data/redisWindows:
mkdir C:\docker-data\redis2. 用数据卷重新运行 Redis
docker stop my-redisdocker 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 测试:
docker exec -it my-redis sh容器内执行:
redis-cliAUTH your_redis_passwordSET hello "docker-redis"GET hello能正常返回 "docker-redis",说明 Redis 正常工作且密码生效。
测试完退出:
exitexit2. 用客户端库连接(例如 Node.js)
以 Node.js + ioredis 为例:
npm install ioredisimport 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 所在目录执行:
docker compose up -d查看状态:
docker compose ps停止服务:
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_HOST 写 redis 而不是 127.0.0.1。
以后要启动整套服务,只需要一句:
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。 - 必要时调整目录权限:
sudo chown -R youruser:youruser /home/youruser/docker-data/redis3. 密码与安全
即使用的是内网环境,也建议:
- 开启
requirepass。 - 不直接在仓库里的
docker-compose.yml硬编码密码,而是用环境变量或.env文件:
REDIS_PASSWORD=your_redis_passwordcommand: - redis-server - --appendonly - "yes" - --requirepass - "${REDIS_PASSWORD}"线上环境再配合防火墙或安全组,限制能访问 Redis 端口的 IP 范围。
九、简单回顾:从 0 到 可用
本文的核心步骤可以压缩成几行:
- 拉镜像:
docker pull redis:7-alpine。 - 用
docker run跑起一个带密码、开启 AOF 的 Redis 容器。 - 挂载
/data到宿主机目录,实现数据持久化。 - 用
redis-cli或客户端库测试AUTH、SET、GET是否正常。 - 把配置写进
docker-compose.yml,加上restart: always和数据卷映射,方便一键启动。 - 视情况把应用也写进 compose,用服务名作为
REDIS_HOST。
目的仍然是留下一套自己顺手、可靠的 Redis 部署流程,方便以后再需要一个 Redis 实例时,少查几篇博客、少踩几次同样的坑。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!