Docker Kafka 客户端到 Docker Kafka 代理的连接被拒绝

dev*_*v01 4 .net apache-kafka docker docker-compose

正如标题所述,我在让我的 docker 客户端连接到 docker 代理时遇到问题

错误:

%3|1647161877.851|FAIL|fc24c271e73f#producer-1| [thrd:localhost:9092/bootstrap]: localhost:9092/bootstrap: Connect to ipv4#127.0.0.1:9092 failed: Connection refused (after 0ms in state CONNECT, 1 identical error(s) suppressed)
2022-03-13T08:57:57.851241551Z %3|1647161877.851|ERROR|fc24c271e73f#producer-1| [thrd:app]: fc24c271e73f#producer-1: localhost:9092/bootstrap: Connect to ipv4#127.0.0.1:9092 failed: Connection refused (after 0ms in state CONNECT, 1 identical error(s) suppressed)
Run Code Online (Sandbox Code Playgroud)

服务器设置:指南第 1 步中的社区 docker-compose.yml:

https://docs.confluence.io/platform/current/quickstart/ce-docker-quickstart.html

客户端设置:

.NET Confluent.Kafka producer
Run Code Online (Sandbox Code Playgroud)

到目前为止的程序:
我最初认为这将是 docker 容器中的 localhost 和使用 docker 选项的问题:

--net=host
Run Code Online (Sandbox Code Playgroud)

也解决了这个问题。然而,这会产生删除已发布端口的副作用,而且不好。

然后我尝试使用

--add-host host.docker.internal:host-gateway
Run Code Online (Sandbox Code Playgroud)

我在另一篇文章中找到了它(不记得是哪一篇了),但这不起作用。我最初认为它有问题,因为 --net=host 可以工作,但是当我用 SignalR 示例项目尝试它时,它立即工作了。

我遇到过多篇建议更改的帖子

KAFKA_ADVERTISED_LISTENERS
Run Code Online (Sandbox Code Playgroud)

然而,我发现主机转发不起作用并且对此进行更改会产生影响,这很奇怪。我已经尝试了多种组合,无论是本地主机的代理 IP 到 0.0.0.0 等(我在不同帖子中找到的东西),但没有成功。

为了更好地了解正在发生的事情,我发现了这篇文章:

https://www.confluence.io/blog/kafka-client-cannot-connect-to-broker-on-aws-on-docker-etc/

这解释了连接到经纪人所涉及的两步过程。查看我通过 /bootstrap 收到的错误,它似乎在初始连接上已经失败。然而,这应该表明当前的问题不在于 KAFKA_ADVERTISED_LISTENERS 但我的假设可能是错误的。

这篇文章确实有一个 docker 到 docker 的场景,但这是使用自定义网桥完成的,我不想为此使用它。

有人对我应该做什么有任何想法吗?也许知道要进行的确切更改以及在何处进行。

cri*_*007 5

您的代码似乎正在尝试连接到端口 9092。

PLAINTEXT://broker:29092是您想要连接的侦听器,假设您自己的代码也位于容器中。

如果不是,那么您可以localhost:9092在没有主机网络的情况下使用,但您需要有这些变量

KAFKA_LISTENERS: PLAINTEXT://broker:29092,PLAINTEXT_HOST://0.0.0.0:9092 
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker:29092,PLAINTEXT_HOST://localhost:9092 
Run Code Online (Sandbox Code Playgroud)

使用自定义网桥完成

Compose 默认创建自己的网桥,除非您单独定义一个网桥并将所有服务链接到它。

不想为此使用。

--net=host除非您在实际工作的Linux 主机上运行代码,否则您将需要一个桥接器。那么你应该能够使用localhost:9092.

不过,如果您了解侦听器的工作原理,则不需要主机网络

具有删除已发布端口的副作用

不完全是。容器暴露的端口应该自动暴露在主机上