🔖
dockerで起動したstandaloneのapache kafkaに別のコンテナからアクセス可能にする方法
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
もうちょっと詳しく
解説自体は以下の記事でされていた。
要は 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