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 Hub

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

Dockerダウンロードページ
Dockerダウンロードページ

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

docker --version
インストールされているDockerのバージョンを確認する
インストールされているDockerのバージョンを確認する

そして、以下を入力してください。

docker-compose --version

Dockerと一緒にインストールされたComposeを確認する
Dockerと一緒にインストールされたComposeを確認する

ComposeはYAMLファイルを使ってマルチコンテナのDockerアプリケーションを定義し、実行するためのツールです。

以下のコードを使用して、Docker化したRedisを実行し、Docker Engineが稼働していることを確認できます。この例ではDocker HubからRedisイメージを実行し、my-redis-containerと名付けています。

docker run --name my-redis-container -d redis
Docker Hubからの操作(Redisイメージの名前にはmy-redis-containerを採用)
Docker Hubからの操作(Redisイメージの名前にはmy-redis-containerを採用)

ローカルにイメージがないため、DockerはDocker HubからRedisイメージを取り出します。

Docker Desktopを開いて、Redisイメージがプルされたことを確認します。ダッシュボードで、左側のパネルの「Images」をクリックします。

Docker Desktop
Docker Desktop

次に、ネットワークを作成することができます。DockerドライバはDockerネットワークを作成するために、ブリッジまたはオーバーレイ組み込みネットワークドライバを使用します。サードパーティのネットワークドライバをインストールして使用することもできます。

これらの違いとして、ブリッジネットワークは単一のDocker Engine上で孤立し稼働するのに対し、オーバーレイネットワークは複数のDockerホストにまたがり、それぞれがエンジンを実行します。

次に以下を入力します。

docker network create -d bridge kinsta-demo-network
Dockerネットワーク(ブリッジドライバを使用)
Dockerネットワーク(ブリッジドライバを使用)

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

これでネットワークができたので、次はDockerコンテナ内にRedisをインストールします。そのためには、次のように入力してください。

docker pull redis

Docker HubからRedisイメージをプルする
Docker HubからRedisイメージをプルする

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

docker images
docker image ls
List available Docker images in the user's terminal
ユーザーのターミナルで利用可能なDockerイメージ

次に、Redisコンテナを作成し起動します。以下のコマンドを実行してください。

docker run -it –name dev_kinsta_redis_container -d redis
Dockerコンテナ
Dockerコンテナ

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

docker ps

Redisがコンテナ内で稼働していることを確認する
Redisがコンテナ内で稼働していることを確認する

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

docker network connect 

Add a Docker container to the created docker network
作成したネットワークにDockerコンテナを追加する

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

RedisイメージがDockerコンテナ内で実行されていることを確認する
RedisイメージがDockerコンテナ内で実行されていることを確認する

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

Redisコンテナインスタンスに接続する
Redisコンテナインスタンスに接続する

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

Redis CLIを使用してRedisコマンドを実行する
Redis CLIを使用してRedisコマンドを実行する

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

Redis接続が稼働しているかどうかをテストする
Redis接続が稼働しているかどうかをテストする

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

特定のRedisデータベースを選択する
特定のRedisデータベースを選択する

次に、データベースにデータを挿入します。Redis SETコマンドを使用します。これを行うには、SET <key> <value>と入力してください。

例えば、以下のようになります。

SET mykey "Hello"

同じキーを取得するには、次のように入力します。

get myKey
Redisへのデータの挿入とそこからのデータの取得
Redisへのデータの挿入とそこからのデータの取得

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

Redisデータベースを監視する
Redisデータベースを監視する

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

RedisのCLIを終了する
RedisのCLIを終了する

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

Dockerコンテナの実行を停止するコマンドを実行する
Dockerコンテナの実行を停止するコマンドを実行する

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アドオンをご活用ください。

Salman Ravoof

Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.