裸机装 Redis 要改一堆系统配置,Docker 版把环境隔离了,但三个必配项(密码、持久化、内存上限)一个都不能少——少了任何一个,出事的方式都不一样。
一、准备配置文件
Redis 容器的习惯做法是把整个 redis.conf 挂进去,先在宿主机生成一份:
mkdir -p /data/redis/{data,conf}
curl -fsSL https://raw.githubusercontent.com/redis/redis/7.4/redis.conf \
-o /data/redis/conf/redis.conf
拉不下来就手写一份精简版,内容如下,直接用也行:
bind 0.0.0.0
protected-mode yes
port 6379
requirepass 你的强密码
appendonly yes
appendfsync everysec
maxmemory 512mb
maxmemory-policy allkeys-lru
dir /data
五个关键字段:
| 配置 | 不配会怎样 |
|---|---|
requirepass |
公网裸奔,几小时内被扫描脚本写进挖矿任务(真实高发) |
appendonly yes |
只剩 RDB 快照,宕机丢最近几分钟数据 |
maxmemory |
无上限吃到宿主机 OOM,容器被杀 |
maxmemory-policy |
内存满后所有写入报 OOM command not allowed |
dir /data |
持久化文件写到容器层,删容器就丢 |
注意 bind 0.0.0.0 必须配合 protected-mode yes + 密码使用;只想本机访问就把 bind 改成 127.0.0.1 并去掉端口映射。
二、启动
docker run -d \
--name redis7 \
--restart unless-stopped \
-p 6379:6379 \
-v /data/redis/data:/data \
-v /data/redis/conf/redis.conf:/etc/redis/redis.conf \
-e TZ=Asia/Shanghai \
redis:7.4 \
redis-server /etc/redis/redis.conf
最后那段 redis-server /etc/redis/redis.conf 不能省——它是让容器用你的配置启动,不写就是默认配置(无密码、无持久化)。
验证:
docker exec -it redis7 redis-cli -a '你的强密码' ping # PONG
docker exec -it redis7 redis-cli -a '你的强密码' info persistence | grep aof
三、compose 写法
services:
redis:
image: redis:7.4
container_name: redis7
restart: unless-stopped
ports:
- "6379:6379"
volumes:
- ./data:/data
- ./conf/redis.conf:/etc/redis/redis.conf
command: ["redis-server", "/etc/redis/redis.conf"]
healthcheck:
test: ["CMD-SHELL", "redis-cli -a 你的强密码 ping | grep PONG"]
interval: 10s
timeout: 3s
retries: 5
四、常见问题
| 现象 | 原因 | 解法 |
|---|---|---|
(error) NOAUTH / NOAUTH Authentication required |
连上了但没给密码 | 客户端补密码;程序里检查连接串 |
| 改了 redis.conf 不生效 | 容器没带 redis-server /etc/redis/redis.conf 启动 |
`docker inspect redis7 |
| 重启后数据丢了 | 只有 RDB 且 save 条件没触发,或 dir 没指向挂载卷 | 开 AOF,确认 info persistence 里 aof_enabled:1 |
OOM command not allowed |
maxmemory 到顶且策略是 noeviction | 按业务选 allkeys-lru 或 volatile-lru |
| 宿主机连不上 | -p 没映射 / 云安全组 / bind 127.0.0.1 |
依次查端口映射、安全组、bind 配置 |
五、一个提醒
-p 6379:6379 加上 requirepass 是「能防住扫描」的最低配置,但密码要够强(16 位以上随机串)。Redis 的性能瓶颈通常根本不在单线程,别担心密码校验的开销——担心的是没有密码的后果。
相关工具:Docker 命令速查 · Linux 命令速查 · HTTP/Ping 检测