Redisは可用性の高いインメモリデータベースです。永続ディスクによるキーバリュー型データストアは、あらゆる高可用性の求められる用途に効果を発揮します。
一方、Dockerはアプリケーションやサービスをコンテナ化し、環境を分離して個別に実行できるようにするツールです。Dockerでは、アプリケーションやサービスに必要な依存関係、設定、スクリプトなどをパッケージマネージャとして使用することができます。Dockerfileと呼ばれるスクリプトがDockerコンテナ内に配置され、コンテナを単一のエンティティとしてデプロイすることができます。
今回の記事では、これら2つのオープンソース技術の効果的な使い方をご紹介します。また、Dockerコンテナ内でRedisクラスタを実行することが重要である理由や、仮想マシンやベアメタルサーバー上でRedisクラスタを実行するケースと比較した時のメリットについても触れます。
Redisの様々な用途
Redisにはいくつもの強みがあります。最も一般的な用途は以下のとおりです。
- 分散/キーバリュー型データベースキャッシュ
- メッセージブローカー(仲介者)としての利用
- 永続オブジェクトキャッシュサーバー
さらに、Redisは複数のデータタイプと構造をサポートするため、アプリケーションのプライマリデータベースレイヤーとしてもセカンダリデータベースレイヤーとしても使用できます。リスト、ストリーム、ハッシュ、セットなどもサポートしています。
そしてRedisをコンテナ化することで、Redisの利点をさらに引き出すことが可能です。
Redisはコンテナ内で使うのがおすすめ
RedisはDockerレジストリで最も人気のあるDockerイメージの1つで、ダウンロード数は10億を超えています。Redisアプリケーションをコンテナ化する理由は、最も一般的なRedisの用途でDockerの強みとコミュニティのサポートを活用することです。
Redis Dockerイメージにはオープンソースコミュニティがあり、明確なドキュメントが作成・維持されています。さらに、Dockerは信頼性が高く、使いやすく柔軟です。
使いやすさ
Dockerは、コンテナ内で実行するアプリとサービスの両方の環境を分離します。分離により、ホストOSに関係なく動作するRedisイメージのパッケージング、ビルド、出荷が可能に、そして、Docker内でのRedisアプリケーションの開発と実行が容易になります。さらに、Docker Desktopは一貫性のあるローカル開発環境のセットアップを簡素化する代物であり、大規模なチームには特に有用です。
セキュリティ
コンテナ内のRedisでセキュリティの脆弱性をスキャンできます。Dockerは、Dockerイメージの安全性を可視化するツールであるSnykを採用しています。Dockerコンテナをスキャンする役割を果たし、イメージ破損の際にはその詳細や修復方法を表示します。Dockerはまた、まだ実験的ではあるものの、コンテナイメージを構築する際に使用されるすべての依存関係をスキャンするソフトウェア部品表(SBOM)を生成することもできます。
柔軟性
DockerはほとんどのUnixベースおよびWindowsオペレーティングシステムとアプリケーションで利用可能です。コンテナを使用してソフトウェアを環境から分離し、すべてのシステムで動作するようにするため、Redisアプリやサービスがインフラストラクチャに関係なく実行されます。
信頼性
Dockerを使用することで、あらゆる環境で多種多様なコンテナ化されたワークロードを確実に実行できます。Dockerコンテナは定期的にコンテナイメージのスナップショットを取得します。データベースが不良または破損した場合には、そのスナップショットに戻すことができるため、RedisはDockerで利用するのが効果的です。Redisデータベースファイルを含むディレクトリをコンテナ内にマウントしてDockerボリュームを作成することもできます。
Dockerボリュームは、偶発的なデータ損失からコンテナを安全に保つのに有用です。ただし、Dockerボリュームにはイメージスナップショットが含まれないという点で注意が必要です。定期的にRedisデータベースファイルのデータを手動で保存またはバックアップする必要があります。
DockerでRedisを使用する方法
RedisストアをDockerコンテナ内に配置するには、対象となる環境にDockerが必要になります。以下の手順では、WindowsにDockerをインストールする方法をご説明します。
UnixまたはUnixベースのOSの場合は、Dockerウェブサイトの説明をご覧ください。インストールと設定が終わったら、Dockerコンテナ内にネットワークを作成します。次にRedisをインストールし、データベースを作成します。最後に、Redisデータベースに対して操作を実行していきます。
まず、お使いのOSにDockerをインストールします。そしてDocker Hubに移動し、アカウントを作成します。イメージの作成と公開にはアカウントが必要です。

アカウントを作成したら、Docker Hubにサインインし、お使いのオペレーティングシステムの最新バージョンのDocker Desktopをダウンロードします。

インストールの手順が完了したら、ターミナルウィンドウでDocker Engineが実行できる状態になっているか確認します。以下のコマンドを入力してください。
docker --version

そして、以下を入力してください。
docker-compose --version

ComposeはYAMLファイルを使ってマルチコンテナのDockerアプリケーションを定義し、実行するためのツールです。
以下のコードを使用して、Docker化したRedisを実行し、Docker Engineが稼働していることを確認できます。この例ではDocker HubからRedisイメージを実行し、my-redis-containerと名付けています。
docker run --name my-redis-container -d redis

ローカルにイメージがないため、DockerはDocker HubからRedisイメージを取り出します。
Docker Desktopを開いて、Redisイメージがプルされたことを確認します。ダッシュボードで、左側のパネルの「Images」をクリックします。

次に、ネットワークを作成することができます。DockerドライバはDockerネットワークを作成するために、ブリッジまたはオーバーレイ組み込みネットワークドライバを使用します。サードパーティのネットワークドライバをインストールして使用することもできます。
これらの違いとして、ブリッジネットワークは単一のDocker Engine上で孤立し稼働するのに対し、オーバーレイネットワークは複数のDockerホストにまたがり、それぞれがエンジンを実行します。
次に以下を入力します。
docker network create -d bridge kinsta-demo-network

Docker Engineのインストール時に自動でブリッジドライバが作成されることから、デフォルトでドライバを指定しないと、Dockerによりブリッジドライバを使用して新しいネットワークが作成されます。ただし、Docker runコマンドでDockerコンテナを実行すると、このネットワークは使用されません。
これでネットワークができたので、次はDockerコンテナ内にRedisをインストールします。そのためには、次のように入力してください。
docker pull redis

Redisイメージが正しくインストールされていることを確認するには、以下のコマンドのいずれかを実行します。
docker images
docker image ls

次に、Redisコンテナを作成し起動します。以下のコマンドを実行してください。
docker run -it –name dev_kinsta_redis_container -d redis

Redisがコンテナ内で実行されていることを確認します。次のように入力してください。
docker ps

Dockerコンテナが稼働していることが確認できたので、コンテナをネットワークに追加することができます。以下を入力してください。
docker network connect

ここまですべてが正常に機能しているのを確認したところで、続いては、Docker内で動作しているRedisサーバーが接続を受け入れる準備ができているかどうか確認します。これには、docker logs
を使います。

次に、サーバー上でコマンドを実行するためにRedisコンテナに接続する方法が必要になります。データベースを作成しましょう。これを行うには、docker exec -it bash
と入力します。コンテナ名とコンテナIDは同じものを指します。

コンテナ内でCLIを使用してコマンドを実行します。Redisにより自動でDockerホストがインストールされます。Redis-CLIを使用するには、redis-cli
と入力します。

これにより、ローカルホスト上のRedisのデフォルトポートに接続されます。ping
と入力すると、レスポンスとしてpong
が返されるはずです。

次に、select
と入力して、Redisサーバー内のデータベースを選択します。デフォルトのデータベースは0
ですが、db 1
を選択してください。

次に、データベースにデータを挿入します。Redis SET
コマンドを使用します。これを行うには、SET <key> <value>
と入力してください。
例えば、以下のようになります。
SET mykey "Hello"
同じキーを取得するには、次のように入力します。
get myKey

キーの値を取得するには、get
を実行します。すると値が返されます。次に、MONITOR
と入力して、Redisデータベースを監視することができます。

最後に、CLIを終了してRedisサーバーを停止します。exit
を2回入力して、CLIとRedisを終了します。

最後にdocker stop
と入力して、Redisコンテナの実行を停止します。

DevKinstaとRedis
DevKinstaを使用して、WordPressサイトをRedisデータベースに接続することができます。DevKinstaでは、Redisアドオンがオブジェクトキャッシュとしてシームレスに動作し、複数のページ読み込みにわたるデータの永続化が可能になります。つまり、Redisアドオンを使用することで、MySQLデータベースに常に問い合わせる代わりに、キャッシュを使用してオブジェクトを再利用することができます。
DevKinstaをダウンロードしてセットアップしたら、依存関係としてDocker Desktopをインストールしてください。このセットアップにより、DevkinstaのRedisアドオンを設定することができます。
DevKinstaのRedisアドオンをセカンダリソースとして使用することで、プライマリデータベースの負荷を軽減し、レスポンスタイムを向上させ、アプリケーションの動作を高速化することが可能です。
このような施策は、アプリのより多くの負荷処理や効率的なスケーリングにつながります。ウェブサイトでRedisプラグインを使用するには、この記事をご覧ください。
まとめ
RedisをDockerコンテナ内で実行することには多くのメリットがあります。アプリケーションにとってのサンドボックス環境が確保できることで、アプリケーションをデプロイするプラットフォームを気にする必要がなくなります。さらに、Dockerは使いやすさ、柔軟性、高い信頼性という面でも注目です。
セキュリティに関して言えば、Dockerイメージの安全性を可視化するツールであるSynkを使えば、すぐにセキュリティの脆弱性をチェックし、スキャンすることができます。柔軟性の面でも、DockerはほとんどのUnixベースおよびWindowsオペレーティングシステムとアプリケーションで動作します。この仕様により、Docker化またはコンテナ化したアプリやサービスを、OSに関係なく実行できます。
DockerとRedisアドオンをDevKinstaで使い、Docker化したWordPressサイトをローカル環境で簡単に構築できます。今すぐDevKinstaとRedisアドオンをご活用ください。