Skip to content

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,无论是单机模式还是集群模式。根据你的具体需求,可以调整配置中的参数和选项。