Docker Compose для Redis: пароль, том, healthcheck

Категория: docker · Язык: YAML · Обновлено:

Готовая конфигурация Redis в Docker Compose: пароль берётся из файла .env, данные сохраняются в томе, а healthcheck сообщает, когда сервер готов принимать команды. Приложение стартует после проверки состояния через depends_on с условием service_healthy.

docker-compose.yml

YAML
services:
  redis:
    image: redis:7-alpine
    restart: unless-stopped
    command: ["redis-server", "--requirepass", "${REDIS_PASSWORD:?Укажите REDIS_PASSWORD в .env}", "--appendonly", "yes"]
    ports:
      - "127.0.0.1:6379:6379"
    volumes:
      - redis-data:/data
    healthcheck:
      test: ["CMD-SHELL", "redis-cli -a \"$$REDIS_PASSWORD\" ping | grep -q PONG"]
      interval: 5s
      timeout: 3s
      retries: 10
    environment:
      REDIS_PASSWORD: ${REDIS_PASSWORD}

volumes:
  redis-data:

Файл .env рядом с docker-compose.yml:

Bash
REDIS_PASSWORD=замените-на-длинный-пароль

Не добавляйте .env в git. Если переменная не задана, Compose остановится с понятным сообщением: так работает запись ${REDIS_PASSWORD:?...}.

Что делает каждая настройка

Настройка

Зачем

image: redis:7-alpine

Фиксирует мажорную версию, образ небольшой

--requirepass

Включает пароль: без него Redis пускает любого, кто достучится

--appendonly yes

Журнал AOF: данные переживают перезапуск и сбой

127.0.0.1:6379:6379

Порт открыт только на вашем компьютере, а не для сети

redis-data:/data

Именованный том: данные Redis хранятся в /data

$$REDIS_PASSWORD

Двойной $ передаёт переменную внутрь контейнера

Запуск и проверка

Bash
docker compose up -d
docker compose ps                                          # статус и health: healthy
docker compose exec redis redis-cli -a "$REDIS_PASSWORD" ping    # PONG
docker compose exec redis redis-cli -a "$REDIS_PASSWORD" set greeting "привет"
docker compose exec redis redis-cli -a "$REDIS_PASSWORD" get greeting

Пароль в ключе -a виден в списке процессов. Безопаснее передать его через переменную окружения REDISCLI_AUTH:

Bash
docker compose exec -e REDISCLI_AUTH="$REDIS_PASSWORD" redis redis-cli ping

Подключить приложение

YAML
services:
  app:
    image: python:3.13-slim
    command: ["python", "-c", "print('app started')"]
    env_file: .env
    environment:
      REDIS_URL: redis://:${REDIS_PASSWORD}@redis:6379/0
    depends_on:
      redis:
        condition: service_healthy

Адрес redis://:пароль@redis:6379/0 содержит имя пользователя без значения, имя сервиса redis вместо localhost и номер базы. Спецсимволы в пароле нужно кодировать (@ как %40).

Данные после перезапуска

Bash
docker compose restart redis
docker compose exec redis redis-cli -a "$REDIS_PASSWORD" get greeting    # значение сохранилось
docker compose down                                                       # том остаётся
docker compose down -v                                                    # удалит том вместе с данными

Redis как кэш без сохранения

Если данные не нужны после перезапуска, замените команду и уберите том:

YAML
    command: ["redis-server", "--requirepass", "${REDIS_PASSWORD}", "--save", "", "--appendonly", "no", "--maxmemory", "256mb", "--maxmemory-policy", "allkeys-lru"]

Параметр maxmemory-policy allkeys-lru вытесняет самые старые ключи при нехватке памяти.

Частые вопросы

Почему healthcheck постоянно unhealthy?

Проверьте, что переменная REDIS_PASSWORD доступна внутри контейнера: она задана в разделе environment, а в команде используется $$. Посмотреть вывод проверки: docker inspect --format '{{json .State.Health}}' имя.

Как подключиться с хоста?

redis-cli -h 127.0.0.1 -p 6379 -a "пароль", если порт опубликован, как в примере выше.

Можно ли хранить пароль не в .env?

Да, для production лучше использовать секреты Docker или менеджер секретов. Файл .env подходит для разработки и небольших серверов.