2016-09-18 4 views
1

Kafka funktioniert gut in den Docker Container. Ich kann docker exec -it [container name] [kafkascript] verwenden und erfolgreich Themen erstellen, Nachrichten erstellen/konsumieren, aber wenn ich außerhalb des Andock-Containers mit lokalen Kafka-Skripten versuche, kann ich nur Themen erstellen und auflisten. Erzeuger- und Verbraucher Nachrichten wirft Fehler:Kafka Docker - Kann nicht produzieren oder außerhalb von Docker Container

Herstellung:

~/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 

Konsumieren:

~/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 

Ich verwende spotify/docker-kafka, aber ich habe es auf 0.10.0.0 aktualisiert und einige Vorschläge von jshark verwendet, die advertised.listeners einrichtet. Ich laufe auf einem Mac. Ich habe eine Docker-Maschine namens Kafka erstellt. Hier ist mein Docker Lauf:

docker run -p 2181:2181 -p 9092:9092 --env ADVERTISED_HOST=`docker-machine ip kafka` --env ADVERTISED_PORT=9092 kafka 

hier mein dockerfile ist:

# 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

Antwort

4

Dieser arbeitete für mich: https://stackoverflow.com/a/37655203/1839580

Meine Zusammenfassung: Die ADVERTISED_HOST Umgebungsvariable in der Spotify/Der Kafka-Container muss sich ändern, je nachdem, ob der Service innerhalb oder außerhalb des Containers ausgeführt wird. Ich benutze Docker für Mac und ich habe mein Docker-Netzwerk auf überbrückt. Außerhalb von Docker musste der ADVERTISED_HOST auf localhost gesetzt werden, innerhalb von docker wurde er auf myproject_kafka_1 oder was auch immer es auf dem System ist eingestellt. Um das Problem zu beheben, habe ich meine MacOS-Host-Dateien, die 127.0.0.1 zugeordnet haben, zu myproject_kafka_1 hinzugefügt. Ich mag es nicht, mich mit meiner Host-Datei zu beschäftigen, aber es hat dieses Problem für mich behoben.

127.0.0.1 localhost 
127.0.0.1 myproject_kafka_1 
Verwandte Themen