从docker主机外部与kafka docker容器交互

vyswwuz2  于 2021-06-08  发布在  Kafka
关注(0)|答案(5)|浏览(675)

这个问题在这里已经有答案了

连接Kafka在docker中跑步(3个答案)
9个月前关门了。
我构建了一个kafka docker容器,并使用docker compose对其进行编排。
打电话 docker ps 我得到以下结果:

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

我可以从docker容器内部运行生产者和消费者,但在docker网络外部无法运行。
例如:
我在本地主机上运行了kafka生产者,出现以下错误:

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

这是我在github上的kafka docker示例,其中包含了提到的问题。
那么,有没有人遇到同样的问题,可以用任何方式帮助我?
其他信息:
(只需从ches/kafka那里转出一些东西,然后为docker compose修改一下):

zour9fqk

zour9fqk1#

热释光;dr在主机上暴露端口9092并将其Map到9092容器端口以访问容器外部的kafka代理。有关详细信息,请参阅docker compose文档。
我想问题是你没有把端口9092暴露在集装箱外面。根据docker ps列表,9092容器端口动态Map到主机的端口范围32882-32884。当您连接到以这种方式配置的代理时,您将收到包含用于播发的端口9092的元数据。有了这个元数据生产者试图通过端口9092做其他请求,但失败了。

o2gm4chl

o2gm4chl2#

另外,让本地kafka消费者与docker容器内的远程代理通信的另一种方法是在my/etc/hosts:docker host ip address docker kafka container hostname中添加一个条目
不管怎样,伦达尔的解决方案对我来说很好,而且看起来更干净。更干净的做法是设置advanced.listeners=host ip:port,因为advanced.host.name和advanced.port已被弃用。

nkkqxpd9

nkkqxpd93#

这是我的两分钱,因为我很难弄明白这一分钱。
我的$kafka\u home/config/server.properties包含以下内容:

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

这将创建两个连接,一个用于docker内部,另一个用于外部。你必须为后者选择一个新的端口,在我的例子29092中,确保这个端口由docker公开和Map。
如果环境中没有${outside\u host\u ip},我还无法找到解决方案,因此我将主机的ip作为env var提供。
测试:
进入Kafka容器并创建一个主题: ./kafka-topics.sh -zookeeper zookeeper:2181 --create --topic dummytopic --partitions 1 --replication-factor 1 从Kafka容器外面做: ./kafka-console-producer.sh --broker-list 0.0.0.0:29092 --topic dummytopic 输入一条信息
我希望这能帮助别人

axzmvihb

axzmvihb4#

您需要输入部署docker示例的主机的名称。您还需要将端口从docker主机(public)Map到docker容器示例(private)。

0h4hbjxa

0h4hbjxa5#

在kafka服务器属性中,您需要设置 advertised.host.name 以及 advertised.port 连接到正在运行的容器的ip/端口,然后它就可以工作了。

相关问题