无法将docker应用程序连接到kafka docker容器



我正在尝试连接本地运行的Kafka容器和docker映像并且不想创建一个包含卡夫卡和动物园管理员图像的容器。

当我在运行应用程序时没有对其进行码头化,它运行得很好。

运行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

这是卡夫卡的码头工人

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

有人能帮忙吗?我做错了什么?

当我运行应用程序而没有对其进行码头化时,它运行得很好。

基本上,你希望你的应用程序在这两种情况下都连接到Kafka,对吧?

  • 当您在本地(主机上(运行应用程序时
  • 以及当您将其作为一个码头化应用程序运行时

但您只为127.0.0.1:9092(主机(发布了一个侦听器广告,因此即使一个码头化客户端(您的应用程序(可以访问Kafka容器,它仍然会因为侦听器配置误导而无法建立连接。

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

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

当我运行我的dockerized应用程序时,它可以通过broker:29092连接到Kafka,类似地,当我在主机上运行该应用时,它也可以通过localhost:9092连接到Kavka。

这篇文章更详细地解释了卡夫卡广告中的听众是如何工作的,以及我们应该如何配置他们。它基本上说:

如果您正在使用Docker镜像(到外部地址(host/IP(,以便客户端可以正确连接到它。否则,他们将尝试连接到内部主机地址,如果无法访问,则会出现问题接踵而至

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

最新更新