跳到主要内容

Docker 部署 Redis

本文提供一个与具体应用无关的 Redis 单机部署基线。示例启用 AOF 和 ACL,并默认只允许从 Docker 宿主机访问。

准备配置

建议目录如下:

redis/
├── compose.yaml
├── redis.conf
└── secrets/
└── users.acl

创建一个不会提交到版本控制的 secrets/users.acl。将占位符替换为密码管理器生成的长随机密码:

secrets/users.acl
user default on >REPLACE_WITH_LONG_RANDOM_PASSWORD ~* &* +@all

限制文件权限,并把 secrets/ 加入版本控制忽略列表:

chmod 600 secrets/users.acl

基础配置:

redis.conf
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

compose.yaml
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-datadocker compose down -v 会永久删除命名卷;FLUSHALL 会清空所有数据库。两者都只能在确认目标实例、备份和影响范围后执行。

安全与高可用边界

  • 不要把 6379 直接暴露到公网;需要跨主机访问时使用受控私网和 TLS。
  • ACL 示例中的默认用户拥有全部命令权限。生产环境应为应用创建最小权限用户,限制命令、键模式和 Pub/Sub 通道。
  • 单容器、单卷不提供高可用。Sentinel、Cluster 和复制涉及拓扑、故障切换与一致性设计,应按 Redis 官方文档单独规划,不能通过复制几个 Compose 服务就视为完成。

官方资料