【问题标题】:Cannot connect docker app to kafka docker container [duplicate]无法将docker应用程序连接到kafka docker容器[重复]
【发布时间】:2022-01-12 09:16:24
【问题描述】:

我正在尝试连接我的 Kafka 容器和我的 docker 镜像,它们都在本地运行 并且不想使用 Kafka 和 zookeeper 图像创建容器。

当我在不对其进行 dockerizing 的情况下运行应用程序时,它运行良好。

运行 dockerize 应用程序后,显示 docker 日志

could not read message dial tcp 172.21.0.3:9092: i/o timeout

在 Kafka 日志中,它正在显示

kafka-zookeeper-1  | 2021-12-07 06:17:15,755 [myid:1] - WARN  [NIOWorkerThread-7:ZooKeeperServer@1411] - Connection request from old client /172.18.0.1:56350; will be dropped if server is in r-o mode

这是用于 kafka 的 docker compose

version: "3"
services:
  zookeeper:
    image: 'bitnami/zookeeper:latest'
    ports:
      - '2181:2181'
    environment:
      - ALLOW_ANONYMOUS_LOGIN=yes
  kafka:
    image: 'bitnami/kafka:latest'
    ports:
      - '9092:9092'
    environment:
      - KAFKA_BROKER_ID=1
      - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092
      - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://127.0.0.1:9092
      - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
      - ALLOW_PLAINTEXT_LISTENER=yes
    depends_on:
      - zookeeper
    volumes:
      - /Users/myuser/docker/volumes/kafka:/var/lib/kafka/data
    

谁能帮忙,我做错了什么?

【问题讨论】:

  • 阅读有关外部和内部客户端的 bitnami 映像自述文件部分。此外,如果您在 Docker 中运行应用程序,则应将其包含在此撰写文件中

标签: docker apache-kafka dockerfile


【解决方案1】:

当我运行应用程序而不对其进行 dockerizing 时,它运行良好。

基本上,您希望您的应用在两种情况下都连接到 Kafka,对吗?

  • 当您在本地(在主机上)运行应用时
  • 以及当您将其作为 dockerized 应用程序运行时。

但是您只为127.0.0.1:9092(主机)宣传了一个侦听器,因此即使 dockerized 客户端(您的应用程序)可以访问 Kafka 容器,它仍然会因为误导性侦听器配置而无法建立连接。

例如,我可以使用它来为两个不同的网络(docker 网络和主机上的 localhost)通告两个不同的侦听器:

KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://broker:29092,PLAINTEXT_HOST://localhost:9092

当我运行我的 dockerized 应用程序时,它可以通过 broker:29092 连接到 Kafka,同样,当我在主机上运行应用程序时,它可以通过 localhost:9092 连接到 Kafka。

This post 更详细地解释了 Kafka 广告监听器的工作原理以及我们应该如何配置它们。它基本上说:

您需要设置 Advertisementd.listeners (或 KAFKA_ADVERTISED_LISTENERS 如果 您正在使用 Docker 映像)到外部地址(主机/IP),以便 客户端可以正确连接到它。否则他们会尝试连接 到内部主机地址——如果无法访问,那么问题就来了 接踵而至。

【讨论】:

    【解决方案2】:

    这是你的答案,

    • 您必须使用主机 IP 地址。不要使用 127.0.0.1 或容器 ip 地址
    • 因为经纪人正在向他们的客户宣传其ADVERTISED_LISTENERS,而客户尝试连接到此地址。
    • 因此,ADVERTISED_LISTENERS 中的 IP 地址必须可从外部容器或其他容器访问。
    • 参考以下示例
    ...
          - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://<hostip>:9092
    ...
    

    【讨论】:

    • 那么为什么我的应用程序不在 dockerized 容器中时会连接到代理?
    • 使用主机 ip 不是“必须的”。使用客户端运行的任何地方的可解析地址。在容器之间,这将是服务名称,而不是特定的 ip。假设应用程序未容器化 并且 Kafka 侦听器端口已转发,广告 localhost 就可以了
    • @RachitKawar,你的问题是错误的。仅在同一主机上运行的应用程序可以连接到代理。在另一台主机上运行的应用程序无法连接到具有广告侦听器为127.0.0.1localhost 的代理。如果 broker 没有 dockerized,可以省略 advertised.listeners config。
    猜你喜欢
    • 2020-02-09
    • 2019-05-24
    • 2021-10-28
    • 2020-01-30
    • 2019-10-23
    • 2020-12-23
    • 2019-07-30
    • 1970-01-01
    • 2020-11-02
    相关资源
    最近更新 更多