Kafka in Docker のチュートリアル


内容

公式のチュートリアルにはバージョンなどが原因で不備があるので、それを修正して解説したものを書きました。

公式チュートリアル

Install

dockerのインストールは前提とし、kafka-dockerをインストールします。

$ git clone [email protected]:wurstmeister/kafka-docker.git

docker-compose.ymlの修正

zookeeperのホストのポートは2181に制限したままだと接続できないので削除します。
KAFKA_ADVERTISED_HOST_NAMEはDockerホストのIPアドレスに変更します。

docker-compose.yml
version: '2'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181"
  kafka:
    build: .
    ports:
      - "9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: 192.168.100.93
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

起動と確認

$ docker-compose up -d
$ docker-compose ps
      Name                     Command               State                          Ports
----------------------------------------------------------------------------------------------------------------
kafka_kafka_1       start-kafka.sh                   Up      0.0.0.0:32768->9092/tcp
kafka_zookeeper_1   /bin/sh -c /usr/sbin/sshd  ...   Up      0.0.0.0:32769->2181/tcp, 22/tcp, 2888/tcp, 3888/tcp

Topicを作成し、Producerでメッセージを送る

Kafka shell を起動。
ZK_HOSTにはKAFKA_ADVERTISED_HOST_NAMEで設定したIPを入れます。
ZK_PORTにはzookeeperのコンテナのポートを入れます。


$ ./start-kafka-shell.sh <DOCKER_HOST_IP> <ZK_HOST:ZK_PORT>

Topicを作成。
testというTopic名でPartitionは4に設定します。
$ZKには<KAFKA_ADVERTISED_HOST_NAMEで設定したIP:zookeeperのホストのポート>を入れます。

$ $KAFKA_HOME/bin/kafka-topics.sh --create --topic test --partitions 4 --zookeeper $ZK --replication-factor 1

作成されたTopicを確認。
ちゃんと4つありますね。

$ $KAFKA_HOME/bin/kafka-topics.sh --describe --topic test --zookeeper $ZK
Topic:test  PartitionCount:4    ReplicationFactor:1 Configs:
    Topic: test Partition: 0    Leader: 1001    Replicas: 1001  Isr: 1001
    Topic: test Partition: 1    Leader: 1001    Replicas: 1001  Isr: 1001
    Topic: test Partition: 2    Leader: 1001    Replicas: 1001  Isr: 1001
    Topic: test Partition: 3    Leader: 1001    Replicas: 1001  Isr: 1001

Producerを起動し、適当なメッセージを送る

$KAFKA_HOME/bin/kafka-console-producer.sh --topic=test --broker-list=`broker-list.sh`
>test1
>test2
>test3
>test4

Consumerを起動し、メッセージを受け取る

Producerは起動したまま、別のshellからconsumerを起動し、メッセージを受け取ります。
ちゃんと全て受け取れてますね

./start-kafka-shell.sh <DOCKER_HOST_IP> <ZK_HOST:ZK_PORT>
$KAFKA_HOME/bin/kafka-console-consumer.sh --bootstrap-server=`broker-list.sh` --topic=test --from-beginning
test2
test3
test4
test1

参考

公式チュートリアル
Kafka を試してみる