Гид по технологиям

Запуск Redis в Docker

• 8 min read • DevOps • Обновлено 01 Dec 2025
Запуск Redis в Docker — быстро и безопасно
Запуск Redis в Docker — быстро и безопасно

Быстрые ссылки

  • Getting Started

  • Data Storage

  • Configuring Your Server

  • Managing Redis Security

  • Using Your Redis Installation

  • Summary

Логотип Redis на красном фоне

Введение

Redis — это in-memory key-value хранилище, которое эффективно сохраняет и обрабатывает абстрактные структуры данных (строки, списки, множества, хеши, отсортированные множества и т.д.). Открытое программное обеспечение часто используют для кэша, брокера сообщений и быстрой базы данных.

Docker — инструмент для упаковки приложений в контейнеры. Он изолирует компоненты приложения с собственным файловым пространством, библиотеками и конфигурациями.

В этом руководстве мы развернём Redis с помощью официального образа Docker Hub. В сравнении с установкой «на голый металл», Docker упрощает запуск и не засоряет хост пакетом системных зависимостей. Убедитесь, что Docker уже установлен и работает на вашем хосте.

Основная идея (в одну строку): контейнеризованный Redis = быстрый старт + явное управление конфигом и данными.

Getting Started

Официальный образ Redis включает сервер и официальный клиент (redis-cli). По умолчанию образ настроен так, чтобы при старте контейнера сервер запускался с рабочими значениями конфигурации.

В образе есть теги для версий (например, 5.0, 6.0, 7.0) и базовых ОС (Alpine, Debian). Просмотрите список тегов на Docker Hub и выберите тот, который подходит по версии и образу основы.

Самый простой запуск выглядит так:

docker run --name redis -d -p 6379:6379 redis:6.0

Эта команда создаёт контейнер с именем redis, запускает Redis 6.0 в фоне (-d) и пробрасывает порт 6379 на хост. Сервер будет работать до тех пор, пока вы не остановите контейнер командой docker stop redis.

Важно: Redis по умолчанию слушает порт 6379. Проброс порта на хост (-p) делает Redis доступным по адресу localhost:6379. Если ваш хост открыт в интернет, это небезопасно — любой, кто попадёт на ваш хост, может получить доступ к данным.

Data Storage

Проблема: Docker-контейнеры эфемерны — при удалении контейнера всё внутри него теряется. Решение — монтировать том или bind-mount для каталога /data, в который Redis записывает состояние.

Redis поддерживает несколько механизмов персистентности:

  • RDB (snapshots) — периодические снимки базы на диск. Быстро, но возможна потеря последних изменений.
  • AOF (Append Only File) — журнал команд, даёт более тонкую долговечность, но занимает больше места и может быть медленнее.
  • Комбинированный режим — одновременно RDB и AOF для баланса между скоростью восстановления и безопасностью.

Простой пример с использованием Docker volume и RDB-снимков:

docker run --name redis -d \
    -v redis-data:/data \
    redis:6.0 --save 60 1

Пояснения:

  • -v redis-data:/data создаёт Docker volume redis-data и монтирует его в контейнер по пути /data.
  • Параметр --save 60 1 передаётся Redis: он сохраняет снимок каждые 60 секунд, если произошла хотя бы одна запись с момента предыдущего снимка.

Удаление и управление томами:

  • Чтобы удалить том: docker volume rm redis-data.
  • Чтобы просмотреть списки: docker volume ls.

Bind-mount против именованных томов:

  • Именованные тома удобны для бэкапов и управления жизненным циклом через Docker.
  • Bind-mount (например, -v /srv/redis/data:/data) даёт прозрачный путь к файлам на хосте и может быть полезен для бэкапов или инспекции.

Критерии приёмки (для хранения данных):

  • Данные сохраняются на томе, а не внутри контейнера.
  • После перезапуска контейнера данные доступны.
  • Вы настроили RDB, AOF или оба, в зависимости от требований к долговечности.

Configuring Your Server

Самый быстрый способ добавить параметры конфигурации — передать аргументы CLI в docker run (как в примере с --save). Любой текст после имени образа в docker run передаётся в команду, которая запускается внутри контейнера (в случае образа Redis — это redis-server).

Для более устойчивой настройки используйте файл конфигурации (redis.conf). Конвенциональный путь в образе — /usr/local/etc/redis/redis.conf.

Пример с bind-mount конфигурации:

docker run --name redis -d \
    -v redis-data:/data \
    -v ./redis-conf:/usr/local/etc/redis \
    redis:6.0 /usr/local/etc/redis.conf

Шаги:

  1. Создайте каталог redis-conf в рабочей папке.
  2. Скопируйте туда redis.conf или создайте собственный.
  3. Запустите контейнер, указав путь к файлу конфигурации.

Советы по конфигу:

  • Измените appendonly и appendfsync для настройки AOF.
  • Настройте maxmemory и стратегию выброса (eviction policy) для кэшей.
  • Логи и директории указывайте на тома, чтобы иметь доступ к ним с хоста.

Managing Redis Security

По умолчанию официальные образы Redis запускают сервер в непредохранённом режиме (unprotected). Это удобно для локальной разработки и взаимодействия между контейнерами, но опасно для продакшен-сред.

Основные способы защитить Redis:

  • Защита на уровне сети (не пробрасывать порт 6379 на публичный интерфейс).
  • Включить protected-mode yes в redis.conf — Redis будет отвечать только на запросы с loopback интерфейсов.
  • Добавить пароль: requirepass <сложный-пароль> в redis.conf.
  • Использовать ACL (Redis 6+) для создания нескольких пользователей с разными правами.
  • Слой сети Docker: поместите Redis в отдельную внутреннюю сеть с ограниченными участниками.
  • Ограничить доступ через firewall (iptables, ufw) или security groups в облаке.

Пример: минимально безопасная конфигурация для продакшена

  • Не пробрасывайте 6379 на внешние интерфейсы хоста.
  • Используйте Docker network, чтобы только нужные сервисы имели доступ.
  • Установите requirepass или настройте ACL.
  • При возможности — используйте TLS (начиная с Redis 6 это возможно при сборке с поддержкой TLS или проксированием через stunnel/nginx).

Примечание: protected-mode yes в Docker-контейнере обычно ограничит доступ только внутри контейнера — это может затруднить взаимодействие с другими контейнерами. Вместо этого ограничьте сеть Docker и используйте аутентификацию.

Using Your Redis Installation

Доступ с хоста:

  • Узнайте IP контейнера: docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis (замените redis на имя контейнера).
  • Или, если вы пробросили порт, подключайтесь к localhost:6379.

Доступ из другого контейнера:

Создайте сеть и подключите контейнеры:

docker network create redis
docker run --name redis --network redis -d redis:6.0
docker run --name api --network redis -d my-api:latest

В данном случае контейнер api может обратиться к Redis по имени хоста redis:6379.

Скриншот запуска redis-cli внутри Docker-контейнера

Подключение к контейнеру и запуск redis-cli:

docker exec -it redis-container redis-cli

Это откроет интерактивный сеанс redis-cli внутри контейнера.

Пример простых команд:

SET hello "world"
GET hello
LPUSH mylist "a"
LRANGE mylist 0 -1

Альтернативный способ: docker-compose

Для повторяемости и простоты управления сервисами используйте docker-compose. Пример файла docker-compose.yml:

version: '3.8'
services:
  redis:
    image: redis:6.0
    container_name: redis
    volumes:
      - redis-data:/data
      - ./redis-conf/redis.conf:/usr/local/etc/redis/redis.conf
    command: ["/usr/local/etc/redis/redis.conf"]
    networks:
      - internal

volumes:
  redis-data:

networks:
  internal:
    driver: bridge

Преимущества docker-compose:

  • Один файл для конфигурации и запуска.
  • Лёгкое масштабирование и интеграция с CI/CD.
  • Понятная версияция конфигов.

Production checklist — пошаговый план

  1. Выберите образ и версию Redis, поддерживаемую приложением.
  2. Подготовьте redis.conf с параметрами persistence, memory и security.
  3. Настройте Docker volume или bind-mount для /data и бэкапов.
  4. Разверните в отдельной Docker-сети или внутри виртуальной приватной сети.
  5. Настройте аутентификацию (ACL или requirepass) и/или TLS.
  6. Настройте мониторинг (Prometheus exporter, Redis INFO, alerting).
  7. Настройте регулярные бэкапы RDB/AOF и тест восстановления.
  8. Пропишите политики рестарта, healthchecks и ограничение ресурсов (CPU, memory).

Ролевые чек-листы

Для разработчика:

  • Убедиться, что тесты работают с реалистичным порядком команд.
  • Использовать временные базы/префиксы ключей для изоляции тестов.
  • Не хранить секреты в открытом виде.

Для оператора:

  • Установить мониторинг и алёрты по задержкам и памяти.
  • Проверить конфигурацию персистентности и бэкапы.
  • Настроить ограничения ресурсов контейнера.

Для инженера по безопасности:

  • Убедиться, что порт 6379 не доступен извне без защиты.
  • Настроить ACL/требование пароля и при необходимости TLS.
  • Провести аудит доступа к Docker-сети и хосту.

Модели зрелости использования Redis в Docker

  1. Разработка: контейнеры на локальной машине, необязательно с бэкапами.
  2. Стадия: Docker Compose, тома, базовая аутентификация.
  3. Продакшен: orchestration (Kubernetes/Docker Swarm), TLS, ACL, мониторинг, бэкапы, SLA.

Когда этот подход не подходит (контрпримеры)

  • Когда требуется много RAM и низкая латентность при масштабировании на несколько хостов без кластеризации — предпочтительнее управляемые сервисы Redis или профильная infra.
  • Если вам нужна встроенная репликация с автоматическим failover на уровне кластера — настройка Redis Cluster или использование провайдера как услуга будет предпочтительнее.
  • В средах с жёсткими требованиями к безопасности/сертификации может потребоваться выделенный физический хост.

Резервное копирование и восстановление

  • Для RDB: копируйте файл dump.rdb из тома; для восстановления поместите его в /data и перезапустите контейнер.
  • Для AOF: храните файл appendonly.aof и применяйте его при запуске.
  • Регулярно тестируйте процесс восстановления на стенде.

Security hardening — практические рекомендации

  • Не пробрасывайте порт 6379 на внешний интерфейс.
  • Используйте сеть Docker без подключения к внешнему миру, если возможно.
  • Включите requirepass или настройте ACL.
  • Используйте TLS для шифрования транспорта в производстве.
  • Обновляйте образ Redis и базовую систему, проверяйте CVE.
  • Минимизируйте привилегии файловой системы и не запускайте контейнер с лишними правами.

Тесты и приёмка

Критерии приёмки для простого развёртывания:

  • Контейнер стартует и отвечает на PING.
  • Данные, записанные в Redis, сохраняются после перезапуска контейнера (при включённой персистентности и смонтированном томе).
  • Подключение из приложения успешно с заданными настройками сети и аутентификацией.

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

Q: Нужно ли пробрасывать порт 6379 на хост для доступа из приложения?

A: Нет, если приложение и Redis находятся в одной Docker-сети. Проброс порта нужен только для доступа с хоста или извне.

Q: Какой механизм персистентности выбрать — RDB или AOF?

A: Для кэша обычно достаточно RDB; для критичных данных и минимальной потери данных — AOF или комбинация RDB+AOF.

Q: Как обеспечить шифрование трафика к Redis?

A: Нативный TLS поддержан в Redis 6+, но часто используют прокси (stunnel, nginx, haproxy) или TLS-сборки образа.

Итог

Docker упрощает развёртывание Redis: официальный образ даёт быстрый старт, а тома сохраняют данные между перезапусками. Однако обращайте внимание на персистентность и безопасность: смонтируйте данные на внешние тома, настройте требование пароля или ACL, и не пробрасывайте порт 6379 на публичные интерфейсы без защиты.

Ключевые рекомендации:

  • Используйте Docker volume для /data.
  • Храните и версионируйте redis.conf, монтируя его в контейнер.
  • Настройте аутентификацию и ограничьте доступ по сети.
  • В production используйте мониторинг, бэкапы и тесты восстановления.

Дополнительные ресурсы и шаги: просмотрите список тегов образа на Docker Hub, посмотрите документацию Redis по AOF/RDB/ACL и протестируйте режимы на стенде перед вводом в эксплуатацию.

Сводка

  • Быстрый запуск: docker run --name redis -d -p 6379:6379 redis:6.0.
  • Персистентность: монтируйте -v redis-data:/data и выберите RDB/AOF.
  • Безопасность: не открывайте порт 6379 публично; включите requirepass или ACL.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро