Я запускаю Kafka внутри док-контейнера. Я запускаю свой контейнер, используя следующую команду
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
}
}
Но если я запускаю эту же программу из-за пределов контейнера (с моего Mac). [Я заменяю "localhost" выводом из docker-machine ip
]
я получаю эту ошибку
[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)
Насколько я понимаю, для удаленного производителя kafka мне нужно открыть только порты 2181 (zookeeper) и 9092 (kafka), и вы можете видеть, что я их открыл.
Но все же та же программа при выполнении вне контейнера истекает, но работает внутри контейнера (с локальным хостом).
Изменить:: Основываясь на приведенных ниже предложениях, я попробовал следующее
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
Но это не решило проблему. Я получаю точно такую же проблему