【问题标题】:Unable to run console consumer using a Kafka broker inside a Docker container无法使用 Docker 容器内的 Kafka 代理运行控制台使用者
【发布时间】:2020-05-31 22:45:17
【问题描述】:

我在 Docker 容器中运行 Kafka 代理时遇到问题。

我已经下载并解压了 Kafka 2.12-2.4.1 的 tar 存档。

我可以从命令行运行 Zookeeper 和 Kafka 代理,成功地生产和消费消息。当我使用 Zookeeper 构建 docker 容器时,我可以使用从命令行运行的 Kafka 代理运行它,再次成功生成和使用消息。当我将代理放入 docker 容器时,消费者和生产者找不到要连接的代理。

我已经检查以确保 Zookeeper 有一个连接的代理:下面的 zookeeper “dump”命令

回声转储 | nc 本地主机 2181

返回

会话跟踪器转储: 会话集 (3)/(1): 0 于 2020 年 5 月 28 日星期四 09:53:33 GMT 到期: 0 于 2020 年 5 月 28 日星期四 09:53:36 GMT 到期: 1 将于 2020 年 5 月 28 日星期四 09:53:39 GMT 到期: 0x10002dfed700008 临时节点转储: 与 Ephemerals 的会话(1): 0x10002dfed700008: /控制器 /brokers/ids/0 连接转储: 连接套件 (2)/(2): 0 于 2020 年 5 月 28 日星期四 09:53:37 GMT 到期: 2 将于 2020 年 5 月 28 日星期四 09:53:47 GMT 到期: ip: /172.18.0.1:55656 sessionId: 0x0 ip: /172.18.0.5:48474 sessionId: 0x10002dfed700008

在未经训练的人看来,Zookeeper 似乎有一个注册代理。

我可以通过命令成功列出主题

kafka-topics.sh --list --zookeeper localhost:2181

当我运行命令时

netstat -plnt

我可以看到我在端口 2181 和 9092 上有监听器,如下所示

tcp6 0 0 :::9092 :::* LISTEN 54661/docker-proxy tcp6 0 0 :::2181 :::* LISTEN 47872/docker-proxy

但是,当我尝试使用命令连接消费者时

kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic aaaa

我收到错误

WARN [Consumer clientId=consumer-console-consumer-8228-1, groupId=console-consumer-8228] 引导代理 localhost:9092 (id: -1 rack: null) 断开连接 (org.apache.kafka.clients.网络客户端)

这似乎表明客户无法联系经纪人。

我在代理配置文件中尝试了几种不同的监听器和广告监听器,将它们设置为 localhost 和 127.0.0.1,但无济于事。

我确定我遗漏了一些简单的东西:有人可以帮忙吗?

【问题讨论】:

  • 不是很清楚,你有 2 个容器,你尝试使用 localhost 作为地址从一个容器连接到另一个容器吗?
  • 您是否正在构建自己的 Docker 容器以供自己学习?因为如果你想做的只是在 Docker 上运行 Kafka + Zookeeper,那么已经存在非常好的工具:hub.docker.com/r/confluentinc/cp-kafka
  • 还有你从​​哪里运行你的消费者?您的主机,还是其他 Docker 容器?
  • 我有两个容器,我正在尝试从一个容器连接到另一个容器,我将其作为一个学习练习,并且我正在从我的主机运行消费者 - 尽管我尝试运行它来自另一个 Docker 容器,结果相同。
  • 为了进一步解释,我有两个容器,一个运行 Zookeeper,另一个运行代理。

标签: docker apache-kafka kafka-consumer-api


【解决方案1】:

确保配置以下内容:

KAFKA_LISTENERS: LISTENER_INTERNAL://kafka-host:29092,LISTENER_EXTERNAL://kafka-host:9092
KAFKA_ADVERTISED_LISTENERS: LISTENER_INTERNAL://kafka-host:29092,LISTENER_EXTERNAL://localhost:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: LISTENER_INTERNAL:PLAINTEXT,LISTENER_EXTERNAL:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: LISTENER_INTERNAL

  • 现在所有在 Docker 网络中运行的客户端都应该使用

    LISTENER_INTERNAL://kafka-host:29092
    
  • Docker 网络之外的所有客户端都应该使用

    LISTENER_EXTERNAL://kafka-host:9092
    

如需更全面的指南,请阅读@RobinMoffatt article

【讨论】:

  • 谢谢,Giorgos,但从文章看来,这些值是用于预构建容器的(我认为是 Confluent?):我正在构建自己的,所以我需要在配置文件。
  • 所以,我尝试了这个,结果完全相同。我可以在 docker 内部运行消费者和生产者,这些都可以工作,但我无法从 docker 外部的 bash 会话进行连接。
  • @GraemeBurton 你为kafka-host 使用了什么值?
  • 我将内部主机设置为server,将外部主机设置为localhost。不过,我认为您走在正确的轨道上 - 我发现 this article 很有帮助 - 我会实施它。
【解决方案2】:

所以,我已经解决了这个问题,我现在有一个工作的 Docker/Kafka 环境:我有一个运行在 docker 中的 zookeeper、一个代理和一个消费者,我可以从运行在 docker 中的生产者和消费者生成消息从命令行运行。

正如@GiorgosMyrianthous 所怀疑的那样,问题出在听众和广告听众身上。我在 Kafka 代理属性文件中输入了以下值

listeners=PLAINTEXT://:29092,PLAINTEXT_HOST://:9092 advertised.listeners=PLAINTEXT://server:29092,PLAINTEXT_HOST://localhost:9092 listener.security.protocol.map=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT

我启动了容器,端口 9092 暴露给外界。

我在引导服务器设置为 server:29092 的情况下运行 Docker 消费者。

我运行 Docker 生产者,并将引导服务器设置为 server:29092

我在引导服务器设置为localhost:9092 的情况下运行了命令行生产者。

在任一生产者中键入的消息出现在消费者中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多