Docker Compose для Redis: пароль, том, healthcheck
Готовая конфигурация Redis в Docker Compose: пароль берётся из файла .env, данные сохраняются в томе, а healthcheck сообщает, когда сервер готов принимать команды. Приложение стартует после проверки состояния через depends_on с условием service_healthy.
docker-compose.yml
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:
REDIS_PASSWORD=замените-на-длинный-парольНе добавляйте .env в git. Если переменная не задана, Compose остановится с понятным сообщением: так работает запись ${REDIS_PASSWORD:?...}.
Что делает каждая настройка
Настройка | Зачем |
|---|---|
| Фиксирует мажорную версию, образ небольшой |
| Включает пароль: без него Redis пускает любого, кто достучится |
| Журнал AOF: данные переживают перезапуск и сбой |
| Порт открыт только на вашем компьютере, а не для сети |
| Именованный том: данные Redis хранятся в |
| Двойной |
Запуск и проверка
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:
docker compose exec -e REDISCLI_AUTH="$REDIS_PASSWORD" redis redis-cli pingПодключить приложение
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).
Данные после перезапуска
docker compose restart redis
docker compose exec redis redis-cli -a "$REDIS_PASSWORD" get greeting # значение сохранилось
docker compose down # том остаётся
docker compose down -v # удалит том вместе с даннымиRedis как кэш без сохранения
Если данные не нужны после перезапуска, замените команду и уберите том:
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 подходит для разработки и небольших серверов.