Установка и настройка Redis как контейнера Docker для продуктового использования

Прочитав эту статью вы научитесь использовать современный способ запуска Redis как безопасного приложения Docker.

Redis — популярное хранилище вида «ключ-значение» в памяти и не только — он позволяет организовывать другие хранилища, например, для множеств, очередей сообщений, блокировок, счетчиков и других структур. Благодаря высочайшей производительности Redis стал популярным хранилищем и используется в множестве продуктов, например, вы можете настроить хранение пользовательских сессий в Redis для PHP, что позволить разгрузить файловую систему сервера и автоматически удалять устаревшие объекты.

Настройка Docker

Если у вас уже настроен и установлен Docker, просто пропустите этот шаг. Если Docker не установлен, установите его по одному из руководств: Ubuntu 16.04 и 18.04, Debian 9 и 10, Centos 7 и приступайте к следующему шагу.

Настройка Redis

При установке Redis мы будем использовать внешний конфигурационный файл и внешний каталог хранения данных для того, чтобы при перезапуске контейнера вся информация оставалась в сохранности.

Нам понадобится два каталога — /opt/redis/etc и /opt/redis/data. В первом мы будем хранить настройки для redis.conf, а во втором — базы данных Redis и журналы, если вам требуется сохранять данные между перезапусками Redis. Обычно, если Redis используется для целей СУБД, а не кэша, то сохранение данных требуется.

Создадим каталоги:

sudo mkdir -p /opt/redis/{etc,data}
sudo mkdir /opt/redis/data/{bases,log}

Заполним конфигурационный файл /opt/redis/etc/redis.conf содержимым из блока, приведенного ниже:

bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
pidfile /var/run/redis/redis-server.pid
loglevel notice
logfile /data/log/redis-server.log
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /data/bases
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble no
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes

Записи журнала Redis будут находиться в файле /opt/redis/logs/redis-server.log, а базы данных Redis в каталоге /opt/redis/data/bases.

Преимущества выполненных настроек Redis:

  • все базы данных Redis будут сохраняться между перезагрузками контейнера;
  • журналы redis будут находиться в файле, а не в syslog или в стандартном выводе контейнера;
  • конфигурационный файл, использованный в настройке находится во внешнем файле и может быть изменен по необходимости.

Запустим контейнер:

sudo docker run --restart=always -d --name redis_1 \
   -v /opt/redis/etc/redis.conf:/usr/local/etc/redis/redis.conf \
   -v /opt/redis/data:/data \
   -p 127.0.0.1:6379:6379 redis redis-server \ 
   /usr/local/etc/redis/redis.conf

Для проверки того, что контейнер нормально запустился запустите команду

sudo docker ps

В результате, вы должны увидеть вывод, похожий на следующий:

CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                    NAMES
afcd2f031d62        redis                    "docker-entrypoint.s…"   14 minutes ago      Up 14 minutes       127.0.0.1:6379->6379/tcp   redis_1

На этом базовое продуктовое развертывание Redis можно считать законченной. Следующим шагом мы рекомендуем выполнить настройки безопасности, приведенные в нашей статье.