Docker Compose 部署 Redis
Docker Compose 是部署 Redis 的理想工具,它可以通过一个简单的 YAML 文件定义和运行 Redis 容器。下面我将详细介绍如何使用 Docker Compose 部署 Redis,包括基础配置、生产环境优化以及集群部署方案。
1. 基础部署配置
1.1 创建项目目录结构
首先创建一个标准的目录结构来管理 Redis 配置和数据文件:
redis-project/
├── docker-compose.yml
├── config/
│ └── redis.conf
├── data/
│ └── redis/
└── .env
1.2 基础 docker-compose.yml 配置
在项目根目录创建docker-compose.yml
文件,内容如下:
yaml
version: "3.8"
services:
redis:
image: redis:7.0
container_name: redis-server
ports:
- "6379:6379"
volumes:
- ./data/redis:/data
- ./config/redis.conf:/usr/local/etc/redis/redis.conf
command: redis-server /usr/local/etc/redis/redis.conf
restart: unless-stopped
这个配置定义了一个 Redis 服务,使用官方 7.0 镜像,将容器的 6379 端口映射到主机的 6379 端口,并挂载了数据目录和配置文件。
1.3 Redis 基础配置文件
在config/redis.conf
中添加以下配置:
# 关闭保护模式(仅在受信网络中使用)
protected-mode no
# 监听所有网卡
bind 0.0.0.0
# 设置访问密码
requirepass YourStrongP@ssw0rd
# 开启AOF持久化
appendonly yes
appendfilename "appendonly.aof"
# 内存极限(单位bytes)
maxmemory 256mb
maxmemory-policy allkeys-lru
2. 生产环境部署方案
2.1 完整生产环境配置
对于生产环境,建议使用以下增强配置:
yaml
version: "3.8"
services:
redis:
image: redis:7.0
container_name: production_redis
environment:
- REDIS_PASSWORD=${REDIS_PASSWORD}
- TZ=Asia/Shanghai
ports:
- "${REDIS_PORT}:6379"
volumes:
- redis_data:/data
- ./config/redis.conf:/usr/local/etc/redis/redis.conf:ro
networks:
- redis_network
deploy:
resources:
limits:
cpus: "2"
memory: 4G
healthcheck:
test:
[
"CMD",
"redis-cli",
"--no-auth-warning",
"-a",
"${REDIS_PASSWORD}",
"ping",
]
interval: 30s
timeout: 5s
retries: 3
volumes:
redis_data:
driver: local
driver_opts:
type: none
device: ./data/redis
o: bind
networks:
redis_network:
driver: bridge
这个配置增加了资源限制、健康检查、网络隔离等生产环境需要的特性。
2.2 环境变量文件(.env)
创建.env
文件管理敏感信息:
REDIS_PASSWORD=your_strong_password_here
REDIS_PORT=6379
3. Redis 集群部署
3.1 主从复制配置
要实现 Redis 主从复制,可以使用以下配置:
yaml
services:
redis-master:
image: redis:7.0
command: redis-server --requirepass ${REDIS_PASSWORD} --appendonly yes
ports:
- "6379:6379"
volumes:
- master_data:/data
redis-replica:
image: redis:7.0
command: >
redis-server --requirepass ${REDIS_PASSWORD}
--masterauth ${REDIS_PASSWORD}
--replicaof redis-master 6379
--appendonly yes
depends_on:
- redis-master
volumes:
- replica_data:/data
volumes:
master_data:
replica_data:
这个配置创建了一个主节点和一个从节点,从节点会自动同步主节点的数据。
3.2 Redis 哨兵模式
要实现高可用性,可以配置 Redis 哨兵模式:
yaml
services:
redis-master:
image: redis:7.0
command: redis-server --requirepass ${REDIS_PASSWORD} --appendonly yes
networks:
- redis-net
redis-replica:
image: redis:7.0
command: >
redis-server --requirepass ${REDIS_PASSWORD}
--masterauth ${REDIS_PASSWORD}
--replicaof redis-master 6379
--appendonly yes
depends_on:
- redis-master
networks:
- redis-net
redis-sentinel1:
image: redis:7.0
command: redis-sentinel /sentinel.conf
volumes:
- ./sentinel1.conf:/sentinel.conf
depends_on:
- redis-master
networks:
- redis-net
networks:
redis-net:
driver: bridge
哨兵节点会监控主节点的健康状态,并在主节点故障时自动进行故障转移。
4. 安全加固方案
4.1 安全配置示例
yaml
services:
redis:
image: redis:7.0
user: "999:999"
cap_drop:
- ALL
security_opt:
- no-new-privileges:true
environment:
- REDIS_PASSWORD=${REDIS_PASSWORD}
command: >
redis-server --requirepass ${REDIS_PASSWORD}
--rename-command FLUSHDB ""
--rename-command FLUSHALL ""
--rename-command CONFIG ""
volumes:
- ./tls:/tls
这个配置限制了容器的权限,禁用了危险命令,并使用了非 root 用户运行。
4.2 网络隔离配置
yaml
networks:
redis_internal:
internal: true
redis_external:
driver: bridge
services:
redis:
networks:
- redis_internal
app:
networks:
- redis_internal
- redis_external
这样 Redis 服务只能在内部网络访问,提高了安全性。
5. 监控与维护
5.1 Prometheus 监控集成
yaml
services:
redis:
image: redis:7.0
command: redis-server --enable-prometheus-metrics
ports:
- "6379:6379"
- "9121:9121"
depends_on:
- redis-exporter
redis-exporter:
image: oliver006/redis_exporter
ports:
- "9121:9121"
environment:
- REDIS_ADDR=redis://redis:6379
- REDIS_PASSWORD=${REDIS_PASSWORD}
prometheus:
image: prom/prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
这个配置集成了 Redis 指标导出器和 Prometheus 监控系统。
5.2 备份策略实现
yaml
services:
redis:
volumes:
- redis_data:/data
- ./backups:/backups
redis-backup:
image: redis:7.0
depends_on:
- redis
volumes:
- ./backups:/backups
command: >
sh -c 'while true; do
sleep 86400;
redis-cli -h redis -a $${REDIS_PASSWORD} --rdb /backups/dump-$$(date +%Y%m%d).rdb;
done'
environment:
REDIS_PASSWORD: ${REDIS_PASSWORD}
这个配置会每天自动备份 Redis 数据到宿主机目录。
6. 常用命令参考
命令 | 描述 |
---|---|
docker-compose up -d | 启动服务(后台模式) |
docker-compose down | 停止并移除容器 |
docker-compose logs -f redis | 查看 Redis 日志 |
docker-compose ps | 查看服务状态 |
docker-compose exec redis redis-cli -a ${REDIS_PASSWORD} | 进入 Redis CLI |
docker-compose restart redis | 重启 Redis 服务 |
通过以上配置和最佳实践,你可以轻松地使用 Docker Compose 部署 Redis,无论是单机模式还是集群模式。根据你的具体需求,可以调整配置中的参数和选项。