2015-08-31 5 views
9

Ich habe einen kafka docker container erstellt und orchestriere es mit docker-komponieren.Interagieren mit kafka docker Container außerhalb von docker host

docker ps Aufruf erhalte ich die folgende 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 

Ich kann aus dem Inneren des Docker Behälter einem Hersteller und einem Verbraucher laufen, aber es funktioniert nicht von außerhalb des Docker Netzwerk.

Zum Beispiel:

ich einen kafkas Hersteller auf meinem localhost laufen und die folgende Fehlermeldung angezeigt:

$ 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) 

This is my kafka docker example on github, die das genannte Problem enthält.

Also, erlebt jemand die gleichen Probleme und kann mir in irgendeiner Weise helfen?

Zusatzinfo:

(Just Gabel von Ches/kafka und ändern etwas für Docker-compose):

Antwort

3

In den Kafka-Servereigenschaften müssen Sie advertised.host.name und advertised.port auf die IP/Port einstellen von deinem laufenden Container und dann sollte es funktionieren.

+2

ich denke, es ist nicht das Problem. Weil ich noch Thema von meinem localhost verursache. Gibt es etwas über java.rmi ....? –

+2

Das hat bei sehr ähnlichen Symptomen für mich funktioniert. Ich könnte Themen von localhost oder anderen Containern erstellen, aber keine Nachrichten veröffentlichen, bis ich die "advertised.host.name" – Lundahl

+0

was soll wir als advertised.host.name setzen? Mit dem gleichen Problem konfrontiert –

2

Sie müssen den Namen des Hostcomputers angeben, auf dem die Docker-Instanz bereitgestellt wurde. Außerdem müssen Sie Ports vom Docker-Hostcomputer (öffentlich) zur Dockercontainerinstanz (privat) zuordnen.

+0

Stellen Sie auch sicher, dass Sie keine der verwandten Eigenschaften in server.properties setzen – sivakadi

+0

Entschuldigen Treffereingabe zu früh. – sivakadi

+0

'# Die ID des Brokers. Dies muss für jeden Broker auf eine eindeutige Ganzzahl festgelegt werden. broker.id = 0 # Hörer = KLARTEXT: // localhost: 9092 # advertised.listeners = KLARTEXT: // localhost: 9092 # advertised.host.name = localhost # advertised.port = 9092' – sivakadi

0

TL; DR Den Port 9092 auf dem Host anzeigen und dem 9092 Container-Port zuordnen, um auf Kafka-Broker außerhalb des Containers zuzugreifen. Details finden Sie in der Dokumentation docker-compose.

Ich denke, das Problem ist, dass Sie Port 9092 außerhalb Container nicht freilegen. Entsprechend Ihrem docker ps-Listing wird Ihr 9092-Container-Port dynamisch dem Host-Port-Bereich 32882-32884 zugeordnet. Wenn Sie eine Verbindung zum so konfigurierten Broker herstellen, erhalten Sie Metadaten mit Port 9092 für Werbung. Mit diesem Metadaten-Erzeuger versucht der Hersteller, über Port 9092 weitere Anfragen zu stellen und schlägt fehl.

Verwandte Themen