Docker 部署 Redis
本文提供一个与具体应用无关的 Redis 单机部署基线。示例启用 AOF 和 ACL,并默认只允许从 Docker 宿主机访问。
准备配置
建议目录如下:
redis/
├── compose.yaml
├── redis.conf
└── secrets/
└── users.acl
创建一个不会提交到版本控制的 secrets/users.acl。将占位符替换为密码管理器生成的长随机密码:
user default on >REPLACE_WITH_LONG_RANDOM_PASSWORD ~* &* +@all
限制文件权限,并把 secrets/ 加入版本控制忽略列表:
chmod 600 secrets/users.acl
基础配置:
bind 0.0.0.0
protected-mode yes
port 6379
aclfile /run/secrets/redis_acl
appendonly yes
appendfsync everysec
save 300 10
maxmemory 1gb
maxmemory-policy allkeys-lru
maxmemory 和淘汰策略必须根据数据用途与宿主机容量调整。若 Redis 承担不能丢失的数据存储职责,还需要明确 RDB、AOF、复制和异地备份的恢复目标,不能只依赖容器卷。
Docker Compose
services:
redis:
image: redis:8-alpine
restart: unless-stopped
ports:
- "127.0.0.1:6379:6379"
command:
- redis-server
- /usr/local/etc/redis/redis.conf
volumes:
- redis-data:/data
- ./redis.conf:/usr/local/etc/redis/redis.conf:ro
secrets:
- redis_acl
secrets:
redis_acl:
file: ./secrets/users.acl
volumes:
redis-data:
官方镜像在启用持久化时把数据写入 /data。命名卷 redis-data 可跨容器重建保留数据,但它不是备份。
示例跟踪 Redis 8 主版本。生产环境应在兼容性和许可证评估后固定补丁标签或镜像摘要,并在升级前执行备份与恢复演练。
如果只有同一 Compose 网络中的应用需要访问 Redis,可以删除 ports;其他服务通过 redis:6379 连接即可。
启动与验证
docker compose config
docker compose up -d
docker compose ps
docker compose logs --tail=100 redis
连接时让 redis-cli 交互式读取密码,避免把密码直接放进命令行参数和 shell 历史:
docker compose exec redis redis-cli --user default --askpass ping
返回 PONG 表示认证和基本请求正常。继续检查持久化状态和内存配置:
docker compose exec redis redis-cli --user default --askpass INFO persistence
docker compose exec redis redis-cli --user default --askpass CONFIG GET maxmemory
备份与恢复
Redis 官方文档建议用 RDB 作为时间点备份。可从宿主机上的 redis-cli 创建远程 RDB 备份:
mkdir -p backups
chmod 700 backups
redis-cli -h 127.0.0.1 -p 6379 --user default --askpass --rdb backups/redis.rdb
也可以先执行 BGSAVE,确认 INFO persistence 中后台保存成功,再从卷中复制完整的 dump.rdb。RDB 文件生成完成后不会被原地修改,因此可以在服务运行时复制;AOF 备份则必须避开重写过程,并遵循 Redis 官方持久化文档中的步骤。
恢复前先停止目标实例,把经过校验的 RDB 文件放到一个新的空数据卷,再启动并核对键数量和关键数据。恢复到非空卷可能覆盖或混合现有数据,应先在隔离环境演练。
至少把备份复制到 Docker 宿主机之外,并定期校验文件摘要与实际可恢复性。
停止与清理
docker compose stop
docker compose down
docker compose down 默认保留 redis-data。docker compose down -v 会永久删除命名卷;FLUSHALL 会清空所有数据库。两者都只能在确认目标实例、备份和影响范围后执行。
安全与高可用边界
- 不要把
6379直接暴露到公网;需要跨主机访问时使用受控私网和 TLS。 - ACL 示例中的默认用户拥有全部命令权限。生产环境应为应用创建最小权限用户,限制命令、键模式和 Pub/Sub 通道。
- 单容器、单卷不提供高可用。Sentinel、Cluster 和复制涉及拓扑、故障切换与一致性设计,应按 Redis 官方文档单独规划,不能通过复制几个 Compose 服务就视为完成。