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