与Docker主机外部的kafka docker容器进行交互

我已经构build了一个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集装箱内运行一个生产者和一个消费者,但是它不在dockernetworking之外工作。

例如

我在本地主机上运行一个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) 

这是我在github上的包含上面提到的问题的kafka docker示例 。

那么,有没有人遇到同样的问题,可以以任何方式帮助我?

附加信息

(只需从ches / kafka分叉,然后修改docker-compose):

在Kafka服务器属性中,您需要将advertised.host.nameadvertised.port设置为正在运行的容器的IP /端口,然后才能正常工作。

您需要放置部署docker实例的主机名称。 您还需要将端口从docker主机(公共)映射到docker容器实例(私人)。

TL; DR在主机上公开端口9092,并将其映射到9092容器端口以访问容器外的卡夫卡经纪人。 有关详细信息,请参阅docker-compose文档。

我认为问题是你不要在容器外部暴露端口9092。 根据你的dockerps列表,你的9092容器端口被dynamic地映射到主机的端口范围32882-32884。 当您连接到以这种方式configuration的代理时,您会收到包含用于广告的端口9092的元数据。 有了这个元数据生产者试图通过端口9092做其他请求,并失败。