Ruby on Railsアプリケーションを開発する際、インメモリDBとしてRedisを用いることがあると思います。 ローカルでRedisサーバを立てるとき、Dockerを用いるとすぐにRedisサーバを起動できるので、環境構築に時間をかけずに済むようになります。

この記事では、Docker Composeを用いてRedisサーバを起動し、Railsアプリケーションから接続する方法について実装例とともにまとめます。

前提

この記事の内容は、次の記事で構築した開発環境を元に検証しています。 次の記事もあわせてご覧ください。

Redisサーバを起動する

Redisサーバをインストールするのはとても簡単で、docker-compose.ymlRedisの公式イメージを指定するだけで完了します。

以下に、Railsアプリケーションを起動するための必要最小限の設定を示します。 Redisの公式イメージのデフォルト値はホストがredis、ポートが6379なので、これをWebサーバの環境変数に設定しています。

services:
  web:
    command: bundle exec rails s -p 3000 -b 0.0.0.0
    depends_on:
      - db
      - redis
    environment:
      - REDIS_HOST=redis
      - REDIS_PORT=6379
    ports:
      - 3000:3000
    volumes:
      - .:/app
  db:
    image: postgres
  redis:
    image: redis

あとは、次のコマンドですべてのコンテナを立ち上げることができます。

$ docker-compose up

Gemをインストールする

次に、RailsアプリケーションからRedisサーバに接続するためのライブラリをインストールします。 今回は例としてRedis::Objectsを用いるので、これもあわせてインストールします。

Gemfile:

gem 'redis'
gem 'redis-objects'

これをDockerコンテナをとおしてインストールします。 これで準備は完了です。

$ docker-compose run web bundle install

アプリケーションの実装

ここでは例として一般的なPostモデルに閲覧数を持たせてみます。 すでにpostsテーブルは生成済みであるとします。

まず、Redisサーバへの接続設定を行ないます。 docker-compose.ymlで環境変数として設定したので、これを参照します。

config/initializers/redis.rb:

Redis::Objects.redis = Redis.new(
  host: ENV['REDIS_HOST'],
  port: ENV['REDIS_PORT']
)

次にモデルの実装です。 PostモデルのRedisに関する記述は次のようになります。

app/models/post.rb:

class Post < ApplicationRecord
  include Redis::Objects

  counter :views
end

これをコンソールから試してみると、次のような動作が得られます。 Redisサーバに正しく接続し、動作できていることが確認できました。

$ docker-compose run web bundle exec rails c
> post = Post.create
> 3.times { post.views.increment }
> post.views.value #=> 3

参考記事

おわりに

これまでは、ローカルにPostgreSQLやRedisのサーバを立てるとなると手間がかかりましたが、Docker Composeを用いるととても簡単に開発環境をつくることができます。

今後はRedisを用いた実践的な内容や、DockerによるElasticsearchを用いた開発環境などに関する記事も書いてみたいと思います。