我正在尝试连接本地运行的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
...