ローカル環境にDockerを使用してApache Kafkaを構築する方法を説明します。KafkaはZooKeeperを必要とするため、Docker Composeを使用してKafkaとZooKeeperを一緒に構築するのが一般的です。
手順 1: Docker と Docker Compose のインストール
まず、DockerとDocker Composeがインストールされていることを確認してください。
- Dockerのインストール: Docker公式サイト
- Docker ComposeはDocker Desktopに含まれています。以下のコマンドでインストール済みか確認してください
docker-compose --version
手順 2: プロジェクトディレクトリの作成
Kafkaを構築するためのプロジェクトディレクトリを作成します。
mkdir kafka-docker-compose
cd kafka-docker-compose
手順 3: docker-compose.yml ファイルの作成
プロジェクトディレクトリ内に docker-compose.yml ファイルを作成し、以下の内容を記述します。
version: '3.8'
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
container_name: zookeeper
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ports:
- "2181:2181"
kafka:
image: confluentinc/cp-kafka:latest
container_name: kafka
depends_on:
- zookeeper
ports:
- "9092:9092"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
設定のポイント
- ZooKeeper:
KafkaはZooKeeperを使用してクラスタの管理を行います。
ZOOKEEPER_CLIENT_PORT はZooKeeperのポート番号(デフォルトは2181)。 - Kafka:
KAFKA_ZOOKEEPER_CONNECT: ZooKeeperの接続情報を指定します。
KAFKA_ADVERTISED_LISTENERS: Kafkaブローカーが外部からアクセスされる際のアドレスを指定します。
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 単一ノード構成の場合は1に設定します。
手順 4: Docker Compose でコンテナを起動
以下のコマンドを実行して、KafkaとZooKeeperのコンテナを起動します。
docker-compose up -d
コマンドの説明
-d オプション: コンテナをバックグラウンドで実行します。
起動後、以下のコマンドでコンテナの状態を確認できます。
docker-compose ps
手順 5: Kafkaの動作確認
Kafkaが正常に動作しているか確認するために、Kafkaのコンテナ内でトピックを作成し、メッセージを送受信します。
Kafkaコンテナに入る
以下のコマンドでKafkaコンテナに入ります。
docker exec -it kafka bash
トピックの作成
Kafkaのトピックを作成します。以下のコマンドを実行してください。
kafka-topics --create --topic test-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
--topic test-topic: トピック名を指定します。
--partitions 1: パーティション数を指定します。
--replication-factor 1: レプリケーション数を指定します(単一ノードの場合は1)。
トピックの確認
作成したトピックを確認します。
kafka-topics --list --bootstrap-server localhost:9092
トピック詳細の確認
kafka-topics --bootstrap-server localhost:9092 --describe --topic test-topic
トピックデータ保持期間(Retention Period)の確認
各オプションの説明:
--bootstrap-server <ブローカーのアドレス>:
Kafkaブローカーのアドレスを指定します(例: localhost:9092)。
--entity-type topics:
トピックの設定を対象にすることを指定します。
--entity-name <トピック名>:
設定を確認したいトピック名を指定します。
--describe:
トピックの設定を表示します。
kafka-configs.sh --bootstrap-server localhost:9092 --entity-type topics --entity-name my-topic --describe
出力例:
Configs for topic 'my-topic' are:
retention.ms=604800000
cleanup.policy=delete
segment.bytes=1073741824
出力結果の解釈
retention.ms:
トピックのデータ保持期間をミリ秒単位で指定します。
例: 604800000 は 7日間(7 * 24 * 60 * 60 * 1000 ミリ秒)を意味します。
cleanup.policy:
データの削除ポリシーを指定します。
delete: 古いデータを削除する(デフォルト)。
compact: 古いデータを圧縮する。
その他の設定(例: segment.bytes)も表示されますが、データ保持期間に直接関係するのは主に retention.ms です。
トピックデータ保持期間(Retention Period)の変更
注意点
デフォルト設定の影響:
トピックごとに retention.ms が設定されていない場合、ブローカー全体のデフォルト設定(log.retention.ms)が適用されます。
データ保持期間の単位:
retention.ms はミリ秒単位で指定します。
例: 1日 = 24 * 60 * 60 * 1000 = 86400000 ミリ秒。
ディスク容量の管理:
データ保持期間を長く設定すると、ディスク容量を圧迫する可能性があります。適切な値を設定してください。
kafka-configs.sh --bootstrap-server localhost:9092 --entity-type topics --entity-name my-topic --alter --add-config retention.ms=259200000
トピックの削除
kafka-topics.sh --bootstrap-server localhost:9092 --delete --topic my-topic
メッセージの送信
以下のコマンドでプロデューサーを起動し、メッセージを送信します。
kafka-console-producer --topic test-topic --bootstrap-server localhost:9092
プロデューサーが起動したら、任意のメッセージを入力してEnterを押します。
メッセージの受信
別のターミナルで以下のコマンドを実行し、コンシューマーを起動します。
docker exec -it kafka kafka-console-consumer --topic test-topic --bootstrap-server localhost:9092 --from-beginning
プロデューサーで送信したメッセージがコンシューマーで受信できれば、Kafkaが正常に動作していることが確認できます。
手順 6: コンテナの停止と削除
コンテナの停止
KafkaとZooKeeperのコンテナを停止するには以下を実行します。
docker-compose down
データを完全に削除する場合
以下のコマンドでボリュームも削除します。
docker-compose down -v
手順 7: ディレクトリ構成の例
最終的なプロジェクトディレクトリ構成は以下のようになります。
kafka-docker-compose/
├── docker-compose.yml
以上で、Docker Composeを使用したローカル環境でのKafka構築が完了です!