こんにちは。よっしーです(^^)
今日は、Redisの実行環境をDockerで構築する方法についてご紹介します。
背景
Redisの実行環境をDockerで構築する方法について調査する機会があったので、そのときの内容を備忘として残しました。
今回作成したファイルは下記のGitHUBにあります。
概要
Redis(Remote Dictionary Server)は、高性能でオープンソースのインメモリデータベースおよびキャッシュストアです。以下に、Redisの主な特徴と用途について説明します。
- データ構造のサポート:
Redisは、さまざまなデータ構造をサポートしています。文字列、ハッシュ、リスト、セット、ソート済みセットなどがあり、それぞれ異なる用途に利用できます。この柔軟性により、様々なアプリケーションのデータ管理に利用できます。 - インメモリデータベース:
Redisはメモリ内にデータを保持するため、非常に高速な読み書きが可能です。ただし、データは通常ディスクにも永続化されます。そのため、高いパフォーマンスを提供しながらも、データの永続性も確保されます。 - キャッシュとしての利用:
Redisはキャッシュとしても広く利用されています。データベースやAPIなどから取得したデータをメモリ内に保持し、高速な応答を提供することが可能です。これにより、データベースへのアクセスや計算コストを削減できます。 - パブサブメッセージング:
Redisはパブサブ(Publish-Subscribe)メッセージングモデルをサポートしています。これにより、異なる部分でのイベント駆動型の通信が可能であり、リアルタイムな情報伝達に適しています。 - トランザクション:
Redisは複数のコマンドをまとめて実行するトランザクションもサポートしています。これにより、複数のコマンドがアトミックに実行されることが保証されます。 - クラスタリング:
Redisは、複数のサーバーをクラスターとして構成し、データを分散して格納できます。これにより、大規模かつ高可用性な環境で利用することができます。 - 豊富なクライアントサポート:
Redisには多くのプログラミング言語向けのクライアントライブラリが提供されており、利用が容易です。これにより、様々なプログラミング環境でRedisを利用することができます。
Redisはこれらの特徴から、高いパフォーマンスが要求されるアプリケーションや、リアルタイムなデータ処理が必要な場面で広く利用されています。
今回はその環境をDockerで構築したときの内容を共有します。
ファイル一覧
下記のファイルを作成しました。
new file: Makefile
new file: compose.yml
new file: redis/Dockerfile
redis/Dockerfile
FROM redis:7.2.4-alpine
compose.yml
version: '3.8'
services:
redis:
build: ./redis
container_name: redis
ports:
- '6379:6379'
Makefile
SHELL = /bin/bash
WOKR_DIR = ./
.DEFAULT_GOAL := help
# コンテナの状態
.PHONY: ps
ps:
cd $(WOKR_DIR) \
&& docker compose ps
# アプリのビルド
.PHONY: build
build:
cd $(WOKR_DIR) \
&& docker compose build
# アプリの起動
.PHONY: up
up:
cd $(WOKR_DIR) \
&& docker compose up -d
# アプリの停止
.PHONY: down
down:
cd $(WOKR_DIR) \
&& docker compose down
# コンテナのログ
.PHONY: log
log:
cd $(WOKR_DIR) \
&& docker compose logs
# コンテナの削除
.PHONY: clean
clean:
cd $(WOKR_DIR) \
&& docker compose down --rmi all --volumes --remove-orphans
# Redisコンテナへのログイン
.PHONY: login
login:
cd $(WOKR_DIR) \
&& docker compose exec -it redis sh
# help
.PHONY: help
help:
@grep -B 2 -E '^[a-zA-Z_-]+:' Makefile \
| grep -v '.PHONY' \
| grep -v -E '^\s*$$' \
| tr '\n' ',' \
| sed 's/--,/\n/g' \
| awk -F, '{printf "%-20s %s\n", $$2, $$1}'
動作確認
下記のコマンドを実行します。
make build
make up
make login
redis-cli --version
下図のような実行結果になっていれば成功です。
解説
compose.yml
このコードは、Docker Composeと呼ばれるツールを使用して、Dockerコンテナを定義および実行するための設定ファイルです。この設定は、Redisと呼ばれるデータベースのDockerコンテナを構築し、実行するためのものです。
ここで使われている主な要素を見ていきましょう。
- version: ‘3.8’:
この行は、Docker Composeのバージョンを指定しています。この例では、バージョン3.8が使用されています。 - services:
services
セクションは、定義するサービス(コンテナ)の設定を含みます。この例では、redis
というサービスが定義されています。 - redis サービス:
redis:
build: ./redis
container_name: redis
ports:
- '6379:6379'
- build: ./redis:
./redis
ディレクトリにある Dockerfile を使用して、Redisのイメージをビルドします。Dockerfileは、Redisコンテナのビルド手順を定義します。 - container_name: redis: このコンテナの名前を
redis
に設定します。この名前は、Dockerネットワーク内でのコンテナの識別に使用されます。 - ports: ポートのマッピングを行っています。
6379:6379
は、ホストマシンのポート6379
とコンテナのポート6379
をマッピングします。これにより、ホストマシンから Redis にアクセスできます。
この設定を使用すると、docker-compose up
コマンドを実行することで、定義した redis
サービスが実行され、ホストマシンのポート 6379
がコンテナのポート 6379
にマッピングされます。これにより、ホストマシンから Redis にアクセスできるようになります。
Makefile
これはMakefileと呼ばれるビルドツールの設定ファイルの一例です。Makefileは主にCやC++などのソースコードをコンパイルするために使用されますが、この例ではDockerコマンドのラッパーとして使用されています。以下に各ターゲット(タスク)の概要を示します。
- 変数定義:
SHELL = /bin/bash
WOKR_DIR = ./
.DEFAULT_GOAL := help
SHELL
: Makefile内で使用されるシェルを指定します。WOKR_DIR
: ワーキングディレクトリを指定します。.DEFAULT_GOAL
: メイクファイルを引数なしで実行したときに実行されるデフォルトのターゲットを指定します。
- ターゲット定義:
ps
: Dockerコンテナの状態を表示します。build
: アプリのビルドを行います。up
: アプリをバックグラウンドで起動します。down
: アプリを停止します。log
: Dockerコンテナのログを表示します。clean
: コンテナを停止し、関連するイメージ、ボリューム、孤立したコンテナを削除します。login
: Redisコンテナに対して対話的なシェルでログインします。help
: 利用可能なターゲット(タスク)の一覧を表示します。
- 各ターゲットの実行コマンド:
各ターゲットの実行コマンドは、Makefile内で定義されたワーキングディレクトリに移動して、対応するDockerコマンドを実行するようになっています。 - helpターゲットの生成:
help
ターゲットでは、Makefile内の各ターゲットに対してコメントを追加し、make help
コマンドを実行したときに利用可能なタスクの一覧を表示します。grepやawkを使用してMakefile内のコメントを抽出しています。
このMakefileは、Docker Composeを使って複数のDockerコンテナを管理するためのシンプルなラッパーとして機能します。特に、Dockerコマンドを簡略化し、一貫性を持たせるために使われています。
おわりに
今日は、Redisの実行環境をDockerで構築する方法についてご紹介しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント