web-dev-qa-db-fra.com

Interagir avec kafka conteneur docker depuis l'extérieur de l'hôte docker

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

17
Trung Hiếu Trần

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.

8
Lundahl

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

3
sivakadi

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:

  1. Entrez le conteneur Kafka et créez un sujet: ./kafka-topics.sh -zookeeper zookeeper:2181 --create --topic dummytopic --partitions 1 --replication-factor 1
  2. De l'extérieur du conteneur Kafka faire: ./kafka-console-producer.sh --broker-list 0.0.0.0:29092 --topic dummytopic et saisissez un message

J'espère que cela aide les autres

1
João Matos

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.

0
Oleksandr Galperin

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.

0
manucho