Redis в Docker — установка, настройка и подключение

Redis в Docker — проще некуда. Одна команда, никакой установки на систему. Легко добавить в docker compose рядом с приложением как кэш или брокер задач.

Вся рубрика Docker: уроки, команды и практические сценарии

Быстрый старт

# Запустить Redis 7
docker run -d \
  --name my-redis \
  -p 6379:6379 \
  redis:7

# Подключиться через redis-cli внутри контейнера
docker exec -it my-redis redis-cli

# Базовые операции
SET key "Hello Docker"
GET key          # "Hello Docker"
DEL key
PING             # PONG
KEYS *           # все ключи
FLUSHALL         # удалить все ключи

Redis с паролем

# Запустить с requirepass
docker run -d \
  --name my-redis \
  -p 6379:6379 \
  redis:7 \
  redis-server --requirepass mypassword

# Подключиться с паролем
docker exec -it my-redis redis-cli -a mypassword

# Или авторизоваться внутри redis-cli
docker exec -it my-redis redis-cli
127.0.0.1:6379> AUTH mypassword
OK

Сохранение данных (persistence)

# По умолчанию Redis хранит всё в RAM
# При docker rm — все данные теряются!

# С persistence через volume
docker run -d \
  --name my-redis \
  -p 6379:6379 \
  -v redis-data:/data \
  redis:7 \
  redis-server --save 60 1 --loglevel warning
# --save 60 1 = сохранять на диск если за 60 секунд было минимум 1 изменение

# Appendonly — AOF persistence (надёжнее)
docker run -d \
  --name my-redis \
  -p 6379:6379 \
  -v redis-data:/data \
  redis:7 \
  redis-server --appendonly yes

Redis + приложение через Docker Compose

# docker-compose.yml
version: "3.9"

services:
  app:
    build: .
    ports:
      - "5000:5000"
    environment:
      - REDIS_URL=redis://redis:6379
    depends_on:
      - redis
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    volumes:
      - redis-data:/data
    command: redis-server --save 60 1 --appendonly yes
    restart: unless-stopped

volumes:
  redis-data:

Python + Redis — примеры

# pip install redis

import redis
import os

r = redis.from_url(os.getenv("REDIS_URL", "redis://localhost:6379"))

# Проверить соединение
r.ping()  # True

# Кэш с TTL
r.set("user:1:name", "John", ex=3600)   # TTL 1 час
name = r.get("user:1:name")             # b"John"

# Декодировать bytes в строку
name = r.get("user:1:name").decode()    # "John"

# Инкрементный счётчик
r.incr("page_views")
r.incr("page_views")
views = int(r.get("page_views"))        # 2

# Список (очередь)
r.lpush("tasks", "task3", "task2", "task1")
task = r.rpop("tasks")                  # b"task1"

# Множество
r.sadd("online_users", "user1", "user2")
r.sismember("online_users", "user1")    # True

# Hash (словарь)
r.hset("session:abc123", mapping={"user_id": "42", "role": "admin"})
role = r.hget("session:abc123", "role") # b"admin"

Redis как брокер для Celery

# docker-compose.yml для Flask + Celery + Redis
version: "3.9"

services:
  app:
    build: .
    ports:
      - "5000:5000"
    depends_on:
      - redis

  worker:
    build: .
    command: celery -A app.celery worker --loglevel=info
    depends_on:
      - redis
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    restart: unless-stopped
# Flask + Celery
from flask import Flask
from celery import Celery
import os

app = Flask(__name__)
celery = Celery(app.name, broker="redis://redis:6379/0")

@celery.task
def send_email(to, subject, body):
    # Выполняется асинхронно в worker контейнере
    # ...
    return "sent"

@app.route("/send")
def trigger():
    send_email.delay("user@example.com", "Hello", "Body")
    return "Email queued!"

Redis Commander — веб-интерфейс

# Добавить в docker-compose.yml
  redis-commander:
    image: rediscommander/redis-commander:latest
    environment:
      - REDIS_HOSTS=local:redis:6379
    ports:
      - "8081:8081"
    depends_on:
      - redis

Открыть в браузере: http://localhost:8081 — просмотр ключей, значений, TTL, управление данными Redis.

Часто задаваемые вопросы

Как подключиться к Redis в Docker из Python?

Установить: pip install redis. Подключиться: r = redis.from_url("redis://localhost:6379") — если Redis на хосте или пробрасывает порт. Если приложение в Docker Compose — redis://redis:6379 где redis — имя сервиса. С паролем: redis://:password@redis:6379. Проверить соединение: r.ping().

Redis данные сохраняются при перезапуске контейнера?

По умолчанию — нет. Redis хранит всё в RAM, при docker stop/docker rm данные теряются. Для сохранения нужен volume + persistence: запусти с --appendonly yes (AOF) или --save 60 1 (RDB). При docker stop Redis корректно завершается и сбрасывает AOF/RDB — данные сохраняются если есть volume.

Redis Sentinel или Redis Cluster в Docker?

Для большинства проектов — обычный Redis с persistence достаточно. Redis Sentinel — высокая доступность: один master + несколько replica + sentinel процессы для автоматического failover. Redis Cluster — горизонтальное масштабирование для очень больших нагрузок (сотни ГБ данных). Оба варианта значительно сложнее в настройке. Начни с простого — добавь сложность только когда упрёшься в ограничения.

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x