web-dev-qa-db-ja.com

kafka Dockerコンテナをdockerホストの外部から操作する

kafka dockerコンテナーを構築し、docker-composeを使用してオーケストレーションしました。

docker psを呼び出すと、次のputputが表示されます。

CONTAINER ID        IMAGE                          COMMAND                CREATED             STATUS              PORTS                                         NAMES
    5bde6f76246e        hieutrtr/docker-kafka:0.0.1    "/start.sh"            About an hour ago   Up About an hour    7203/tcp, 0.0.0.0:32884->9092/tcp             dockerkafka_kafka_3
    be354f1b8cc0        hieutrtr/docker-ubuntu:devel   "/usr/bin/supervisor   About an hour ago   Up About an hour    22/tcp                                        producer1
    50d3203af90e        hieutrtr/docker-kafka:0.0.1    "/start.sh"            About an hour ago   Up About an hour    7203/tcp, 0.0.0.0:32883->9092/tcp             dockerkafka_kafka_2
    61b285f39615        hieutrtr/docker-kafka:0.0.1    "/start.sh"            2 hours ago         Up 2 hours          7203/tcp, 0.0.0.0:32882->9092/tcp             dockerkafka_kafka_1
    20c9c5ccec05        jplock/zookeeper:3.4.6         "/opt/zookeeper/bin/   2 hours ago         Up 2 hours          2888/tcp, 3888/tcp, 0.0.0.0:32881->2181/tcp   dockerkafka_zookeeper_1

Dockerコンテナーの内部からプロデューサーとコンシューマーを実行できますが、Dockerネットワークの外部からは機能しません。

kafkaプロデューサをローカルホストで実行すると、次のエラーが表示されます:

$ kafka_2.9.1-0.8.2.1: bin/kafka-console-producer.sh --topic test --broker-list $DOCKER_Host:32884
[2015-08-31 06:55:15,450] WARN Property topic is not valid (kafka.utils.VerifiableProperties)
to
[2015-08-31 06:55:20,214] WARN Failed to send producer request with correlation id 2 to broker 1 with data for partitions [test,0] (kafka.producer.async.DefaultEventHandler)
Java.nio.channels.ClosedChannelException
    at kafka.network.BlockingChannel.send(BlockingChannel.scala:100)
    at kafka.producer.SyncProducer.liftedTree1$1(SyncProducer.scala:73)
    at kafka.producer.SyncProducer.kafka$producer$SyncProducer$$doSend(SyncProducer.scala:72)
    at kafka.producer.SyncProducer$$anonfun$send$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(SyncProducer.scala:103)
    at kafka.producer.SyncProducer$$anonfun$send$1$$anonfun$apply$mcV$sp$1.apply(SyncProducer.scala:103)
    at kafka.producer.SyncProducer$$anonfun$send$1$$anonfun$apply$mcV$sp$1.apply(SyncProducer.scala:103)

これは私のkafka github上のdockerの例 で、これには前述の問題が含まれています。

それで、誰かが同じ問題を経験していて、何らかの形で私を助けることができますか?

追加情報

(ちょうどches/kafkaからフォークし、docker-composeのために何かを変更します):

17

Kafkaサーバープロパティで、設定する必要があるadvertised.Host.nameおよびadvertised.portto実行中のコンテナのip/portにすると、機能するはずです。

8
Lundahl

Dockerインスタンスがデプロイされたホストマシンの名前を入力する必要があります。また、ポートをdocker Host machine(public)からdocker container instance(private)にマップする必要があります。

3
sivakadi

これを理解するのに苦労したので、ここに私の2セントがあります。

$ KAFKA_HOME/config/server.propertiesには以下が含まれています。

listener.security.protocol.map=INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT

advertised.listeners=INSIDE://${container_ip}:9092,OUTSIDE://${outside_Host_ip}:29092

listeners=INSIDE://:9092,OUTSIDE://:29092

inter.broker.listener.name=INSIDE

これにより2つの接続が作成されます。1つはDocker内で使用され、もう1つは外部で使用されます。後者の場合は新しいポートを選択する必要があります。私の場合は29092です。このポートがdockerによって公開され、マップされていることを確認してください。

私はまだ環境に$ {outside_Host_ip}がないソリューションを理解できなかったため、ホストマシンのIPを環境変数として提供しています。

テスト:

  1. Kafkaコンテナを入力してトピックを作成します:./kafka-topics.sh -zookeeper zookeeper:2181 --create --topic dummytopic --partitions 1 --replication-factor 1
  2. Kafkaコンテナの外側から:./kafka-console-producer.sh --broker-list 0.0.0.0:29092 --topic dummytopicとメッセージを入力

これが他の人に役立つことを願っています

1
João Matos

TL; DRホストのポート9092を公開し、それを9092コンテナポートにマップして、kafkaブローカーコンテナの外部にアクセスします。を参照してください。 docker-compose 詳細はドキュメント。

問題は、ポート9092をコンテナーの外部に公開しないことだと思います。 docker psの一覧によると、9092コンテナーポートはホストのポート範囲32882-32884に動的にマッピングされます。このように構成されたブローカーに接続すると、広告用のポート9092を含むメタデータを受け取ります。このメタデータを使用すると、プロデューサーはポート9092を介して他のリクエストを実行しようとして失敗します。

0

記録のために、私のローカルを取得する別の方法kafka Dockerコンテナー内のリモートブローカーと通信するコンシューマーは、私のエントリを追加することでした/ etc/hostsdocker-Host-ip-address docker-kafka-container-hostname

とにかく、Lundahlの解決策は私には問題なく機能し、よりクリーンに見えます。 advertised.listeners=Host-ipportadvertised.Host.nameおよびadvertised.portは非推奨であるため。

0
manucho