当前位置: 首页 > 知识库问答 >
问题:

Kafka Docker-不能从Docker容器外部生产或消费

潘彦
2023-03-14

Kafka在docker容器里工作得很好。我可以使用docker exec-it[container name][kafkascript]并成功地创建主题、生成/使用消息,但是当我使用本地kafka脚本从docker容器外部尝试时,我只能创建和列出主题。生成和使用消息会引发错误:

生产:

~/development/lib/kafka/kafka2.11-0.10.0.0$bin/kafka-console-producer.sh--broker-list$(docker-machine ip kafka):9092--topic test asdf

[2016-09-18 10:13:48,999] ERROR Error when sending message to topic test with key: null, value: 4 bytes with error: (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)
org.apache.kafka.common.errors.TimeoutException: Batch containing 1 record(s) expired due to timeout while requesting metadata from brokers for test-0

消耗:

[2016-09-18 09:57:10,389] WARN Fetching topic metadata with correlation id 0 for topics [Set(test)] from broker [BrokerEndPoint(0,ba762186182f,9092)] failed (kafka.client.ClientUtils$)
java.nio.channels.ClosedChannelException
    at kafka.network.BlockingChannel.send(BlockingChannel.scala:110)
    at kafka.producer.SyncProducer.liftedTree1$1(SyncProducer.scala:80)
    at kafka.producer.SyncProducer.kafka$producer$SyncProducer$$doSend(SyncProducer.scala:79)
    at kafka.producer.SyncProducer.send(SyncProducer.scala:124)
    at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:59)
    at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:94)
    at kafka.consumer.ConsumerFetcherManager$LeaderFinderThread.doWork(ConsumerFetcherManager.scala:66)
    at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:63)
[2016-09-18 09:57:10,392] WARN [console-consumer-34526_3c15c2c24040-1474210630122-9404562b-leader-finder-thread], Failed to find leader for Set([test,0]) (kafka.consumer.ConsumerFetcherManager$LeaderFinderThread)
kafka.common.KafkaException: fetching topic metadata for topics [Set(test)] from broker [ArrayBuffer(BrokerEndPoint(0,ba762186182f,9092))] failed
    at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:73)
    at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:94)
    at kafka.consumer.ConsumerFetcherManager$LeaderFinderThread.doWork(ConsumerFetcherManager.scala:66)
    at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:63)
Caused by: java.nio.channels.ClosedChannelException
    at kafka.network.BlockingChannel.send(BlockingChannel.scala:110)
    at kafka.producer.SyncProducer.liftedTree1$1(SyncProducer.scala:80)
    at kafka.producer.SyncProducer.kafka$producer$SyncProducer$$doSend(SyncProducer.scala:79)
    at kafka.producer.SyncProducer.send(SyncProducer.scala:124)
    at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:59)
    ... 3 more
 docker run -p 2181:2181 -p 9092:9092 --env ADVERTISED_HOST=`docker-machine ip kafka` --env ADVERTISED_PORT=9092 kafka

这是我的DockerFile:

# Kafka and Zookeeper

FROM java:openjdk-8-jre

ENV DEBIAN_FRONTEND noninteractive
ENV SCALA_VERSION 2.11
ENV KAFKA_VERSION 0.10.0.0
ENV KAFKA_HOME /opt/kafka_"$SCALA_VERSION"-"$KAFKA_VERSION"

# Install Kafka, Zookeeper and other needed things
RUN apt-get update && \
    apt-get install -y zookeeper wget supervisor dnsutils && \
    rm -rf /var/lib/apt/lists/* && \
    apt-get clean && \
    wget -q http://apache.mirrors.spacedump.net/kafka/"$KAFKA_VERSION"/kafka_"$SCALA_VERSION"-"$KAFKA_VERSION".tgz -O /tmp/kafka_"$SCALA_VERSION"-"$KAFKA_VERSION".tgz && \
    tar xfz /tmp/kafka_"$SCALA_VERSION"-"$KAFKA_VERSION".tgz -C /opt && \
    rm /tmp/kafka_"$SCALA_VERSION"-"$KAFKA_VERSION".tgz

ADD scripts/start-kafka.sh /usr/bin/start-kafka.sh

# Supervisor config
ADD supervisor/kafka.conf supervisor/zookeeper.conf /etc/supervisor/conf.d/

# 2181 is zookeeper, 9092 is kafka
EXPOSE 2181
EXPOSE 9092

CMD ["supervisord", "-n"]

脚本/start-kafka.sh

共有1个答案

程吕恭
2023-03-14

这对我有效:https://stackoverflow.com/a/37655203/1839580

我的总结:spotify/kafka容器中的advertised_host环境变量需要更改,这取决于您的服务是在容器内部还是外部操作。我使用Docker for Mac,我已经将我的Docker网络设置为桥接.在Docker外部,advertised_host需要设置为localhost;在Docker内部,它被设置为myproject_kafka_1或任何它最终出现在您的系统上的东西。为了解决这个问题,我在MacOS主机文件中添加了一个条目,将127.0.0.1映射到MyProject_Kafka_1。我不喜欢弄乱我的主机文件,但它为我解决了这个问题。

127.0.0.1   localhost
127.0.0.1   myproject_kafka_1
 类似资料:
  • 我现在有两个集装箱zookeeper和kafka在运行。 请注意,我已将容器的端口2181和9092映射到我的主机端口。我通过在浏览器中尝试localhost:2181/9092来验证该映射是否正常,并且在运行容器的终端中打印了一些错误。 然后我在主机上发出以下命令创建了topic: 我读到一些线程在互联网上建议我更新我的主机文件。如果是,我必须在主机文件中放入什么条目?? 另外,一些线程建议我在

  • 我完全能够在这两种情况下配置spring boot,这里的问题是哪一种更健壮,更值得推荐,因为我在spring boot文档中没有找到在生产环境中部署它的推荐方法,我对使用嵌入式容器的关注是: 如果我想将其设置为Windows或Linux服务,那么jar文件是最佳选项吗? 如果我使用jar文件,我将无法重新启动服务器。 也许将来我需要在同一个容器中有更多的应用程序。 如果重新启动计算机,我必须再次

  • 我在docker容器中的服务器上有Postgresql。如何从外部连接到它,即从本地计算机连接到它?我应该应用什么设置来允许它?

  • tl;如果在Docker容器中运行,一个RestController正确回答,另一个则不正确。 该服务有两个API 和。 它们都是通过docker compose运行的。 返回。 返回一个空的200响应。正如预期的那样。 应该返回一个200响应和一个每次调用API时都会增加的数字。可悲的是,事实并非如此。 在本地运行该服务可以提供预期的结果。 maven spotify插件用于从以下创建图像。 我

  • 问题内容: 我建立了一个kafka docker容器并使用docker-compose对其进行编排。 打电话给我下面的putput: 我可以从docker容器内部运行生产者和使用者,但是不能在docker网络外部运行。 例如 : 我在本地主机上运行kafka生产者,出现以下错误: 这是我在github上的kafka docker示例,其中包含上述问题。 那么,有人遇到同样的问题并且可以以任何方式帮

  • 问题内容: 我想阻止从外部直接访问docker容器。我使用haproxy,并且只希望访问端口80、443。 我在iptables中添加了以下规则。但是我仍然可以通过不同的端口访问Docker容器。 这可能是由于DOCKER链 我需要创建什么规则来阻止直接访问? 问题答案: 您可以使用命令创建一个网络来连接应用程序和代理,而不必使用IP表来执行此操作。另外,请勿在任何端口上公开应用程序。您应该公开的