Kafka Docker - 不能从码头集装箱外生产或消费

时间:2016-09-18 15:53:06

标签: docker apache-kafka spotify apache-zookeeper

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

生产

~/development/lib/kafka/kafka_2.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

消费:

~/development/lib/kafka/kafka_2.11-0.10.0.0$ bin/kafka-console-consumer.sh --zookeeper $(docker-machine ip kafka):2181 --topic test --from-beginning

[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

我正在使用spotify / docker-kafka,但我将其升级到0.10.0.0并使用jshark中设置advertised.listeners的一些建议。我在Mac上运行。我创建了一个名为kafka的泊坞机。这是我的码头运行:

 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"]

scripts/start-kafka.sh

3 个答案:

答案 0 :(得分:5)

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

我的摘要:<?php Modal::begin([ "id" => "ajaxCrudModal", "footer" => "", // always need it for jquery plugin 'size' => Modal::SIZE_DEFAULT, 'options' => [ 'class' => 'slide', 'tabindex' => false // important for Select2 to work properly ], ]) ?> <?php Modal::end(); ?> 容器中的ADVERTISED_HOST环境变量需要更改,具体取决于您的服务是在容器内部还是外部运行。我使用Docker for Mac,我的docker网络设置为桥接。在Docker之外,spotify/kafka需要设置为localhost,在docker内部,它被设置为ADVERTISED_HOST或者它最终在你的系统上。为了解决这个问题,我添加并输入了将myproject_kafka_1映射到127.0.0.1的MacOS主机文件。我不喜欢弄乱我的主机文件,但它为我解决了这个问题。

myproject_kafka_1

答案 1 :(得分:0)

Cleaner将设置advertised.listeners=host-ip:port,因为advertised.host.nameadvertised.port在Kafka server.properties文件中已弃用。

如果将host-ip设置为0.0.0.0,则会从任何地方收听请求。但这是不安全的。

答案 2 :(得分:0)

直到将以下条目添加到server.properties之前,我无法从其容器外部与Kafka进行交互:

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

我发布了更完整的答案here。希望其他人不会像我那样花那么多时间。