DockerのApache Kafka環境構築

ローカル環境にDockerを使用してApache Kafkaを構築する方法を説明します。KafkaはZooKeeperを必要とするため、Docker Composeを使用してKafkaとZooKeeperを一緒に構築するのが一般的です。
### 手順 1: Docker と Docker Compose のインストール
まず、DockerとDocker Composeがインストールされていることを確認してください。

- Dockerのインストール: Docker公式サイト
- Docker ComposeはDocker Desktopに含まれています。以下のコマンドでインストール済みか確認してください
```console
docker-compose --version
```
### 手順 2: プロジェクトディレクトリの作成
Kafkaを構築するためのプロジェクトディレクトリを作成します。
```console
mkdir kafka-docker-compose
cd kafka-docker-compose
```
### 手順 3: docker-compose.yml ファイルの作成
プロジェクトディレクトリ内に docker-compose.yml ファイルを作成し、以下の内容を記述します。
```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構築が完了です！