2016-05-18 14 views
2

私はドッカーコンテナの中でカフカを実行しています。私はコンテナ内にコピーして、それを実行することができ、簡単なプログラムを書かれている次のコマンドドッカー内で実行中のカフカにメッセージを公開

docker run --rm -p 2181:2181 -p 9092:9092 -p 8081:8081 --env 
ADVERTISED_HOST=\`docker-machine ip \\`docker-machine active\\`` --env 
ADVERTISED_PORT=9092 -v 
/Users/abhishek.srivastava/MyProjects/KafkaTest/target/scala-2.11:/app 
-it -- name kafka spotify/kafka bash 

を使用して、私のコンテナを起動し、それが完璧に動作します。

object KafkaProducerString { 

    def SendStringMessage(msg: String) : Unit = { 
    val inputRecord = new ProducerRecord[String, String]("test", null, msg) 
    val producer: KafkaProducer[String, String] = CreateProducerString 
    val rm = producer.send(inputRecord).get(10, SECONDS) 
    println(s"offset: ${rm.offset()} partition: ${rm.partition()} topic: ${rm.topic()}") 
    producer.close() 
    } 

    private def CreateProducerString: KafkaProducer[String, String] = { 
    val props = new Properties() 
    props.put("bootstrap.servers", "localhost:9092") 
    props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer") 
    props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer") 
    props.put("batch.size", "0") 
    props.put("client.id", "1") 
    val producer = new KafkaProducer[String, String](props) 
    producer 
    } 
} 

しかし、私はコンテナの外から(my macから)この同じプログラムを実行します。私の理解では、カフカの生産のためのリモート私は開く必要がある唯一のポートは2181(飼育係していることをということでした私は

[error] (run-main-0) java.util.concurrent.TimeoutException: Timeout after waiting for 10000 ms. 
java.util.concurrent.TimeoutException: Timeout after waiting for 10000 ms. 
    at org.apache.kafka.clients.producer.internals.FutureRecordMetadata.get(FutureRecordMetadata.java:50) 
    at org.apache.kafka.clients.producer.internals.FutureRecordMetadata.get(FutureRecordMetadata.java:25) 
    at com.abhi.KafkaProducerString$.SendStringMessage(KafkaProducerString.scala:23) 
    at com.abhi.KafkaMain$$anonfun$main$1.apply$mcVI$sp(KafkaMain.scala:19) 
    at scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:160) 
    at com.abhi.KafkaMain$.main(KafkaMain.scala:17) 
    at com.abhi.KafkaMain.main(KafkaMain.scala) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 

このエラーが出る

[私はdocker-machine ipからの出力には「localhost」を置き換えます] )と9092(カフカ)と私はこれらを開いたことを見ることができます。

でも同じプログラムをコンテナの外で実行するとタイムアウトしますが、コンテナの内部では(localhostを使用して)動作します。

編集::以下の提案に基づいて、私は次の

docker run --rm -p 127.0.0.1:2181:2181 -p 127.0.0.1:9092:9092 -p 
127.0.0.1:8081:8081 --env ADVERTISED_HOST=`docker-machine ip \`docker-machine 
active\`` --env ADVERTISED_PORT=9092 -v 
/Users/abhishek.srivastava/MyProjects/KafkaTest/target/scala-2.11:/app -it -- 
name kafka kafka_9.0 bash 

docker run --rm -p 0.0.0.0:2181:2181 -p 0.0.0.0:9092:9092 -p 0.0.0.0:8081:8081 
--env ADVERTISED_HOST=`docker-machine ip \`docker-machine active\`` --env 
ADVERTISED_PORT=9092 -v 
/Users/abhishek.srivastava/MyProjects/KafkaTest/target/scala-2.11:/app -it -- 
name kafka kafka_9.0 bash 

を試みたが、これらの問題を解決していません。

+0

こんにちは、私も同じ問題に直面しています。それは解決されましたか? – maverick

+0

私はあきらめました:)時間があるときにもう一度試してみるでしょう。以下の解決策を確認してください。それが動作するかどうか私に知らせる:) –

+0

私はwurstmeisterカフカドッカーを使用しています。すべてがドッカー内で動作しますが、ホストマシン上のプロデューサ/コンシューマ用のコードはkafkaブローカに接続できません。私は何かが起きたときにこれをトラブルシューティングしています。私はあなたに知らせます – maverick

答えて

0

ドッキング・コンテナをローカル・マシンにバインドする必要があります。また、あなたがバインドIPとのドッキングウィンドウの実行を使用することができます

docker run --rm -p 127.0.0.1:2181:2181 -p 127.0.0.1:9092:9092 -p 127.0.0.1:8081:8081 .... 

docker run --rm -p 0.0.0.0:2181:2181 -p 0.0.0.0:9092:9092 -p 0.0.0.0:8081:8081 ..... 

あなたは、ネットワーク上のドッキングウィンドウのコンテナがルーティング可能なようにしたい場合は、使用することができます。これは、ドッキングウィンドウの実行を使用して行うことができます

docker run --rm -p <private-IP>:2181:2181 -p <private-IP>:9092:9092 -p <private-IP>:8081:8081 .... 

それとも最後に、あなたは使用してネットワークインターフェイスをcontainerisingないために行くことができます。

docker run --rm -p 2181:2181 -p 9092:9092 -p 8081:8081 --net host .... 
+0

最初の2つを試しましたが、私の問題を解決しませんでした –

+0

Dockerfileに関連するポートを公開しましたか? – t6nand

+0

ここにドッカーファイルhttps://github.com/spotify/docker-kafka/blob/master/kafka/Dockerfile –

0

私も同じような問題に直面していますが、私はこの動作を説明しようとすることができます。

カフカのプロデューサーは、レコードをトピックに公開する前に、Zookeeperのパーティションリーダーを検索します。 Zookeeperは、Dockerコンテナの内部で実行されているKafkaサーバーによってマークされたリーダーホストエントリを持っています。

このため、サーバーによってマークされたIPは、ホストIPではなくDockerの内部IPになります。どちらがクライアントマシンから解決できず、タイムアウトしますか。

可能な解決策は、advertised.host.nameをDockerマシンのホストIPに設定することです。しかし、これは別の問題を引き起こすでしょう(私が直面したように)

サーバによってブローカのメタデータがフェッチされるようになりました。これは、Zookeeperエントリにコンテナの内部から解決できないホストIPが存在するためです。結果として、どのコンシューマアプリケーションでも、LEADER_NOT_AVAILABLEの警告が開始されます。

これはデッドロックの状況であり、ソリューションは主にホスト解決方法を使用しています。私は人々がここに行く方法を提案する方法を知りたいです。

関連する問題