Apache Kafkaのインストールと確認

ローカルでDockerを使ってKafkaサーバー環境を作る

今回はDockerfileを使用してApache Kafkaを起動してみる。

Dockerのインストール

まずDockerとDocker Composeがインストールされている必要がある。インストールされているかどうかは、次のバージョン確認コマンドで確認できる。

% docker -v
Docker version 20.10.11, build dea9396
% docker-compose -v
Docker Compose version v2.2.1

インストールされていなければ、先にインストールしておくこと。ここではDockerのインストール手順は説明しない。

DockerにApache Kafkaサーバーをインストールする

次にDockerを使用してApache Kafkaをインストールする。

GitHubからApache Kafka Dockerリポジトリをクローンする

git clone https://github.com/wurstmeister/kafka-docker.git
% git clone https://github.com/wurstmeister/kafka-docker.git
Cloning into 'kafka-docker'...
remote: Enumerating objects: 1100, done.
remote: Counting objects: 100% (82/82), done.
remote: Compressing objects: 100% (44/44), done.
remote: Total 1100 (delta 48), reused 50 (delta 38), pack-reused 1018
Receiving objects: 100% (1100/1100), 285.65 KiB | 7.52 MiB/s, done.
Resolving deltas: 100% (608/608), done.

docker-compose.ymlファイルを修正する

ここではDockerを使ってKafkaを実行することだけを目的にするため、Kafkaの分散環境は考慮せず、まず1台だけ起動してみる。
そのため、リポジトリ内のdocker-compose.ymlではなく、docker-compose-single-broker.ymlを使用する。
Dockerをローカルで起動するので、docker-compose-single-broker.ymlを次のように修正する。

... 途中省略 ...
      KAFKA_ADVERTISED_HOST_NAME: 127.0.0.1
... 途中省略 ...

docker-composeを実行する

docker-compose -f docker-compose-single-broker.yml up -d

-fオプションは、docker-compose.yml以外の名前を持つComposeファイルを実行する場合に使用する。
今回はdocker-compose-single-broker.ymlを使用するため、-fオプションの後ろにファイル名を指定する。
-dオプションはバックグラウンドで起動する指定である。

% docker-compose -f docker-compose-single-broker.yml up -d
[+] Running 17/17
 ⠿ zookeeper Pulled                                                                                                           20.8s
   ⠿ a3ed95caeb02 Pull complete                                                                                                1.1s
 
 ... 途中省略 ...

 => => writing image sha256:5609038ba9d28b5380b4403f4905867e9fa39cc48b03e6f32466be47b5e9b35d                                                     0.0s
 => => naming to docker.io/library/kafka-docker_kafka                                                                                            0.0s

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
[+] Running 3/3
 ⠿ Network kafka-docker_default        Created                                                                                                   0.1s
 ⠿ Container kafka-docker_kafka_1      Started                                                                                                   0.7s
 ⠿ Container kafka-docker_zookeeper_1  Started                                                                                                   0.8s

Dockerが正しく起動したか確認する

上記のコマンドを実行すると、KafkaとZooKeeperの2つが起動していることを確認できる。

docker ps -a
% docker ps -a
CONTAINER ID   IMAGE                                                  COMMAND                  CREATED         STATUS                      PORTS                                                NAMES
30cf1bccb37f   kafka-docker_kafka                                     "start-kafka.sh"         2 minutes ago   Up 2 minutes                0.0.0.0:9092->9092/tcp                               kafka-docker_kafka_1
c578f5c36248   wurstmeister/zookeeper                                 "/bin/sh -c '/usr/sb..."   2 minutes ago   Up 2 minutes                22/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp   kafka-docker_zookeeper_1

ローカルにKafkaクライアントをインストールする

これでDocker上でメッセージを受け取るKafkaサーバーが起動した。次に、動作確認のためローカルにKafkaクライアントをインストールし、実際にメッセージを送受信してみる。

まずKafkaクライアントをインストールするため、上で起動したKafkaサーバーのバージョンを確認し、同じバージョンをインストールすると互換性がよい。

上でクローンしたリポジトリに入り、Dockerfileの内容を確認する。

... 途中省略 ...
ARG kafka_version=2.8.1
ARG scala_version=2.13
... 途中省略 ...

上部付近でKafkaのバージョンとScalaのバージョンを確認できる。

このKafkaバージョンと同じものを、Kafka公式サイトのDOWNLOADページからダウンロードすればよい。

次はcurlコマンドを使ったダウンロード例である。

curl https://archive.apache.org/dist/kafka/2.8.1/kafka_2.13-2.8.1.tgz -o kafka_2.13.2.8.1.tgz
% curl https://archive.apache.org/dist/kafka/2.8.1/kafka_2.13-2.8.1.tgz -o kafka_2.13-2.8.1.tgz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 68.1M  100 68.1M    0     0   130k      0  0:08:55  0:08:55 --:--:--  115k

ダウンロードが完了したら、次のように展開する。

tar xzvf kafka_2.13-2.8.1.tgz

Topicを作成する

bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic devkuma-topic
% cd kafka_2.13-2.8.1
% bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic devkuma-topic
Created topic devkuma-topic.

Producerを実行する

bin/kafka-console-producer.sh --topic devkuma-topic --broker-list localhost:9092

次のようにCLIコマンドを実行すると、メッセージ送信の待機状態になる。

bin/kafka-console-producer.sh --topic devkuma-topic --broker-list localhost:9092
>

>が表示されて待機状態になれば、メッセージを送信できる状態である。

Consumerを実行する Producerコンソールでメッセージを送信する前に、メッセージを受信するConsumerコンソールを起動する。

別のターミナルウィンドウを開き、Consumerコンソールを次のように実行する。

bin/kafka-console-consumer.sh --topic devkuma-topic --bootstrap-server localhost:9092 --from-beginning

次のようにCLIコマンドを実行すると、メッセージ受信の待機状態になる。

$ bin/kafka-console-consumer.sh --topic devkuma-topic --bootstrap-server localhost:9092 --from-beginning

実行後に何も表示されず待機していれば、メッセージを受信できる状態である。

Producerからメッセージを送信し、Consumerで受信を確認する Producerコンソールを実行しているターミナルに戻り、任意の文字列を入力してみる。

% bin/kafka-console-producer.sh --topic devkuma-topic --broker-list localhost:9092
>hello
>devkuma
>welcome to devkuma

すると、Consumerコンソールを実行しているターミナルで、入力したメッセージを受信できることを確認できる。

% bin/kafka-console-consumer.sh --topic devkuma-topic --bootstrap-server localhost:9092 --from-beginning
hello
devkuma
welcome to devkuma

参考