🔖

dockerで起動したstandaloneのapache kafkaに別のコンテナからアクセス可能にする方法

2024/12/23に公開

docker image apache/kafka を試していたところホストからはアクセスできるが、別途起動したコンテナからアクセスできない問題に遭遇した。
どうやらこれは有名な問題らしいが最小の起動例が見当たらないので例を残しておく。

ネットワークの用意

docker network create kafka-network

kafkaの起動

docker run --name broker \
  -e KAFKA_NODE_ID=1 \
  -e KAFKA_ADVERTISED_LISTENERS="PLAINTEXT://broker:9092" \
  -e KAFKA_PROCESS_ROLES="broker,controller" \
  -e KAFKA_CONTROLLER_QUORUM_VOTERS="1@broker:9093" \
  -e KAFKA_LISTENERS="CONTROLLER://:9093,PLAINTEXT://:9092" \
  -e KAFKA_CONTROLLER_LISTENER_NAMES="CONTROLLER" \
  --network kafka-network \
  apache/kafka

クライアント用のコンテナの起動

docker run --network kafka-network --rm -it --workdir /opt/kafka/bin apache/kafka:latest sh

トピックを作成してみる。

./kafka-topics.sh --create --topic quickstart-events --bootstrap-server broker:9092

もうちょっと詳しく

解説自体は以下の記事でされていた。

https://www.confluent.io/blog/kafka-listeners-explained/

要は kafkaクライアントはブローカーからもらったリスナーに接続をしに行く。
初期設定は PLAINTEXT://localhost:9092 になっており、自分自身にアクセスしにいき存在せず失敗してしまう。
そのため、これを PLAINTEXT://broker:9092 に変えたい。しかし、変えるとKRaftモードで動いたのにもかかわらず、Zookeeperを必要とするモードになってしまうようだ。この要因は調査しきれていない。そのため、ちゃんと動くように最低限の設定のみを模索したところ上記のようになった。

その際に出ていたログ

 WARN [AdminClient clientId=adminclient-1] Connection to node 1 (localhost/127.0.0.1:9092) could not be established. Node may not be available. (org.apache.kafka.clients.NetworkClient)

参考

Discussion