J'ai construit un kafka conteneur docker et l'orchestrer en utilisant docker-compose.
Appeler docker ps
J'obtiens le putput suivant:
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
Je peux exécuter un producteur et un consommateur depuis l'intérieur du conteneur Docker, mais cela ne fonctionne pas depuis l'extérieur du réseau Docker.
Par exemple :
J'exécute un producteur kafka sur mon hôte local et l'erreur suivante apparaît:
$ 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)
Ceci est mon kafka exemple de docker sur github qui inclut le problème mentionné.
Alors, est-ce que quelqu'un connaît les mêmes problèmes et peut m'aider de quelque façon que ce soit?
Informations supplémentaires :
(Sortez simplement de ches/kafka et modifiez quelque chose pour docker-compose):
Dans les propriétés du serveur Kafka, vous devez définir advertised.Host.name
et advertised.port
à l'ip/port de votre conteneur en cours d'exécution, puis cela devrait fonctionner.
Vous devez mettre le nom de la machine hôte sur laquelle l'instance de docker a été déployée. Vous devez également mapper les ports de la machine hôte Docker (publique) à l'instance de conteneur Docker (privée).
Voici mes deux cents, car j'ai eu du mal à comprendre celui-ci.
Mon $ KAFKA_HOME/config/server.properties contient les éléments suivants:
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
Cela crée deux connexions, une à utiliser à l'intérieur de Docker et une autre à l'extérieur. Vous devez choisir un nouveau port pour ce dernier, dans mon cas 29092, assurez-vous que ce port est exposé et mappé par docker.
Je n'étais pas encore en mesure de trouver une solution sans $ {outside_Host_ip} dans l'environnement, donc je fournis l'ip de la machine hôte en tant que var env.
Tester:
./kafka-topics.sh -zookeeper zookeeper:2181 --create --topic dummytopic --partitions 1 --replication-factor 1
./kafka-console-producer.sh --broker-list 0.0.0.0:29092 --topic dummytopic
et saisissez un messageJ'espère que cela aide les autres
TL; DR Exposez le port 9092 sur l'hôte et mappez-le au port de conteneur 9092 pour accéder à kafka brokers en dehors du conteneur. Voir docker-compose documentation pour plus de détails.
Je pense que le problème est que vous n'exposez pas le port 9092 à l'extérieur du conteneur. Selon votre docker ps, votre port de conteneur 9092 est mappé dynamiquement à la plage de ports de l'hôte 32882-32884. Lorsque vous vous connectez au courtier configuré de cette façon, vous recevez des métadonnées contenant le port 9092 pour la publicité. Avec cette métadonnée, le producteur essaie de faire d'autres requêtes via le port 9092 et échoue.
Pour mémoire, une autre façon d'obtenir mon client local kafka communiquant avec le courtier distant à l'intérieur d'un conteneur Docker était d'ajouter une entrée dans mon / etc/hosts: docker-Host-ip-address docker-kafka-container-hostname
Quoi qu'il en soit, la solution de Lundahl a bien fonctionné pour moi et semble plus propre. Encore plus propre serait de définir advertised.listeners= Host-ip : port puisque advertised.Host.name et advertised.port sont déconseillés.