Kafkaを手元で立てて遊べるように、confluent公式に従ってkafkaを立ち上げてみようと思います。実際にはproducerやconsumerとして何かしらのAPIを繋げて使うのが一般的かと思いますが、今回は付属のシェルスクリプトやUIでメッセージのproduce/consumeをして遊んでみようと思います。
composeファイル
kafkaとkafka UIの2つのコンテナを立てます。
コマンドラインからCLIで操作や確認をすることもできますが、やりやすいようにUIも使いたいと思います。
networks:
kafka-net:
name: kafka-net
services:
broker:
image: apache/kafka:latest
container_name: broker
ports:
- "9092:9092"
environment:
KAFKA_BROKER_ID: 1
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_NODE_ID: 1
KAFKA_LISTENERS: PLAINTEXT://broker:29092,CONTROLLER://broker:29093,PLAINTEXT_HOST://0.0.0.0:9092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker:29092,PLAINTEXT_HOST://localhost:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@broker:29093
KAFKA_LOG_DIRS: /tmp/kraft-combined-logs
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
CLUSTER_ID: MkU3OEVBNTcwNTJENDM2Qk
networks:
- kafka-net
healthcheck:
test: ["CMD-SHELL", "/opt/kafka/bin/kafka-metadata-quorum.sh --bootstrap-controller broker:29093 describe --status | grep LeaderId"]
interval: 10s
timeout: 10s
retries: 10
kafka-ui:
image: provectuslabs/kafka-ui
container_name: kafka-ui
ports:
- "8080:8080"
environment:
DYNAMIC_CONFIG_ENABLED: "true"
KAFKA_CLUSTERS_0_NAME: "local"
KAFKA_CLUSTERS_0_BOOTSTRAP_SERVERS: "broker:29092"
networks:
- kafka-net
Note
元々Kafkaはzookeeperというアプリも別コンテナで立ち上げて、繋げる必要がありましたが、新しいバージョンではzookeeper無しでも使えてよりシンプルになっています。
起動
docker-compose up -d
で起動します。こんな感じでログの最後に"Kafka Server started"のInfoログが出ていればOKです。
$ docker logs --tail 5 broker
[2025-07-14 14:49:26,144] INFO [BrokerServer id=1] Transition from STARTING to STARTED (kafka.server.BrokerServer)
[2025-07-14 14:49:26,145] INFO Kafka version: 4.0.0 (org.apache.kafka.common.utils.AppInfoParser)
[2025-07-14 14:49:26,146] INFO Kafka commitId: 985bc99521dd22bb (org.apache.kafka.common.utils.AppInfoParser)
[2025-07-14 14:49:26,146] INFO Kafka startTimeMs: 1752504566145 (org.apache.kafka.common.utils.AppInfoParser)
[2025-07-14 14:49:26,149] INFO [KafkaRaftServer nodeId=1] Kafka Server started (kafka.server.KafkaRaftServer)
UIには
http://localhost:8080/
でアクセスできます。
停止
docker-compose down -v
でコンテナを停止させます。
CLIでの操作
次のコマンドでコンテナの中の環境でbashを起動して操作します。
$ docker exec -it -w /opt/kafka/bin broker sh
トピックの作成
次のコマンドでトピックを作成します。partitionを3つ用意してみました。
/opt/kafka/bin $ ./kafka-topics.sh --create --topic my-topic --bootstrap-server broker:29092 --partitions 3 --replication-factor 1
Created topic my-topic.
できたトピックを確認します。
/opt/kafka/bin $ ./kafka-topics.sh --describe --topic my-topic --bootstrap-server broker:29092
Topic: my-topic TopicId: KjAZUQozRU6QBQgoahPiIQ PartitionCount: 3 ReplicationFactor: 1 Configs:
Topic: my-topic Partition: 0 Leader: 1 Replicas: 1 Isr: 1 Elr: LastKnownElr:
Topic: my-topic Partition: 1 Leader: 1 Replicas: 1 Isr: 1 Elr: LastKnownElr:
Topic: my-topic Partition: 2 Leader: 1 Replicas: 1 Isr: 1 Elr: LastKnownElr:
/opt/kafka/bin $
メッセージをproduce
以下のコマンドでstringメッセージをproduceするコンソールが起動します。
ctrl+c
で中断できます。
/opt/kafka/bin $ ./kafka-console-producer.sh --topic my-topic --bootstrap-server broker:29092
>All streams
>lead to Kafka
>^C
メッセージをconsume
同様に以下のコマンドでconsumeしたmessageが順次表示されます。
consumer group IDを指定してみました。
こちらもctrl+c
で中断できます。
./kafka-console-consumer.sh --bootstrap-server broker:29092 --topic my-topic --group my-consumer-group --from-beginning
All streams
lead to Kafka
^CProcessed a total of 2 messages
先ほどproduceした"All stream lead to Kafka"が出力されました。
Kafka UIで操作、確認
トピックの確認
先ほどproduceしたメッセージはpartition No.1に入っていることが分かります。
consumerのページからはmy-consumer-group(先ほどコンソールで読んだときにつけたconsumer group ID)でcosumeしたログが残っています。
トピックの作成
Topics
ページのAdd a Topicボタンから以下のダイアログが出てきます。ここからtopicを作ることもできます。
メッセージのproduce
topicをクリックし詳細のページに行くと、Produce message
ボタンからメッセージをproduceできます。