目录
问题内容
解决方法
都是在容器中运行的 wurstmeister/kafkaApache
其他
回答
客户端位于同一台机器上,而不是在容器中
另一台机器上的客户端
同一主机上容器中的客户端(或另一个代理)
相关问题
附录
首页 后端开发 Golang 连接到在 Docker 中运行的 Kafka

连接到在 Docker 中运行的 Kafka

Feb 14, 2024 pm 11:42 PM
网络问题 overflow

连接到在 Docker 中运行的 Kafka

在当今的软件开发领域,容器化技术成为了一种越来越流行的部署方式。而Docker作为最受欢迎的容器化解决方案之一,为开发者提供了便捷的环境隔离和部署方式。对于使用Kafka作为消息队列系统的开发者来说,将Kafka与Docker结合起来,可以更加灵活和高效地进行开发和部署。在本篇文章中,php小编西瓜将为大家介绍如何在Docker中运行Kafka,让您轻松享受容器化带来的便利。

问题内容

我在本地计算机上设置了一个单节点 kafka docker 容器,如 confluence 文档中所述(步骤 2-3)。

此外,我还公开了 zookeeper 的端口 2181 和 kafka 的端口 9092,以便我能够从本地计算机上运行的客户端连接到它们:

$ docker run -d \
    -p 2181:2181 \
    --net=confluent \
    --name=zookeeper \
    -e zookeeper_client_port=2181 \
    confluentinc/cp-zookeeper:4.1.0

$ docker run -d \
    --net=confluent \
    --name=kafka \
    -p 9092:9092 \
    -e kafka_zookeeper_connect=zookeeper:2181 \
    -e kafka_advertised_listeners=plaintext://kafka:9092 \
    -e kafka_offsets_topic_replication_factor=1 \
    confluentinc/cp-kafka:4.1.0
登录后复制

问题:当我尝试从主机连接到 kafka 时,连接失败,因为 无法解析地址:kafka:9092

这是我的 java 代码:

properties props = new properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("client.id", "kafkaexampleproducer");
props.put("key.serializer", longserializer.class.getname());
props.put("value.serializer", stringserializer.class.getname());
kafkaproducer<long, string> producer = new kafkaproducer<>(props);
producerrecord<long, string> record = new producerrecord<>("foo", 1l, "test 1");
producer.send(record).get();
producer.flush();
登录后复制

例外:

java.io.IOException: Can't resolve address: kafka:9092
    at org.apache.kafka.common.network.Selector.doConnect(Selector.java:235) ~[kafka-clients-2.0.0.jar:na]
    at org.apache.kafka.common.network.Selector.connect(Selector.java:214) ~[kafka-clients-2.0.0.jar:na]
    at org.apache.kafka.clients.NetworkClient.initiateConnect(NetworkClient.java:864) [kafka-clients-2.0.0.jar:na]
    at org.apache.kafka.clients.NetworkClient.ready(NetworkClient.java:265) [kafka-clients-2.0.0.jar:na]
    at org.apache.kafka.clients.producer.internals.Sender.sendProducerData(Sender.java:266) [kafka-clients-2.0.0.jar:na]
    at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:238) [kafka-clients-2.0.0.jar:na]
    at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:176) [kafka-clients-2.0.0.jar:na]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_144]
Caused by: java.nio.channels.UnresolvedAddressException: null
    at sun.nio.ch.Net.checkAddress(Net.java:101) ~[na:1.8.0_144]
    at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:622) ~[na:1.8.0_144]
    at org.apache.kafka.common.network.Selector.doConnect(Selector.java:233) ~[kafka-clients-2.0.0.jar:na]
    ... 7 common frames omitted
登录后复制

问题:如何连接到在 docker 中运行的 kafka?我的代码是从主机运行的,而不是 docker。

注意:我知道理论上我可以尝试 dns 设置和 /etc/hosts 但这是一种解决方法 - 不应该是这样的。

这里也有类似的问题,但它是基于 ches/kafka 图像。我使用基于 confluenceinc 的图像,这是不一样的。ches/kafka 图像。我使用基于 confluenceinc 的图像,这是不一样的。

解决方法

tl;dr - 从容器到主机的简单端口转发将不起作用...主机文件(例如 *NIX 系统上的 /etc/hosts

解决方法

advertished.listeners (不是 advertished.host.nameadvertished.port,因为这些已被弃用)。如果您看到诸如 Connection to node -1 (localhost/127.0.0.1:9092)

tl;dr

- 从容器到主机的简单端口转发将bootstrap.servers 一部分列出的服务器实际上是可解析的。例如 ping IP/主机名,使用 netcat 检查端口...如果您的客户端位于容器中,则需要从容器执行此操作,而不是(仅)从主机执行此操作。如果容器没有立即崩溃以访问其 shell,请使用 docker exec不起作用

...主机文件(例如 *NIX 系统上的

)不应修改以解决 Kafka 网络问题,因为此解决方案不可移植。docker ps 显示 kafka 容器是从 0.0.0.0 映射的:<host_port> -> <advertished_listener_port> /tcp

1) 您想要连接到哪个确切的 IP/主机名 + 端口?确保该值在代理上设置为

之类的错误,则意味着您的应用程序容器尝试连接到自身。您的应用程序容器是否也在运行 Kafka 代理进程?可能不是。confluenceinc docker 镜像来解决所提出的问题,不是 wurstmeister/kafka。如果您设置了 KAFKA_ADVERTISED_HOST_NAME

2) 确保作为

3) 如果从主机而不是另一个容器运行进程,要验证端口是否在主机上正确映射,请确保 .如果尝试从 Docker 网络外部运行客户端,则端口必须匹配。两个容器之间不需要端口转发;使用链接/docker网络
下面的答案使用 confluenceinc docker 镜像来解决所提出的问题,不是 。如果您设置了 KAFKA_ADVERTISED_HOST_NAME 变量,请将其删除(这是一个已弃用的属性)

以下部分尝试汇总使用其他图像所需的所有详细信息。对于其他常用的 Kafka 镜像,

都是在容器中运行的 wurstmeister/kafkaApache

Kafka

您只依赖于

它的配置方式。以及 a>哪些变量导致了这种情况。

bitnami/kafka

自 2023 年 10 月起,DockerHub 中不再存在此内容。无论如何,2022 年之后就不再维护了。

wurstmeister请参阅有关监听器配置的自述文件部分,另外

阅读他们的 Connectivity wiki

debezium/kafka

如果您想要一个小容器,请尝试这些。这些图像比 Confluence 小得多,并且比

维护得更好。 🎜参考他们的监听器配置的自述文件🎜。🎜 🎜🎜🎜 🎜此处提到了相关文档🎜此处🎜。🎜

注意:已弃用公布的主机和端口设置。广告听众涵盖了两者。与 Confluence 容器类似,Debezium 可以使用 KAFKA_ 前缀的代理设置来更新其属性。

其他

  • ubuntu/kafka 要求您通过 Docker 映像参数添加 --overrideadvertising.listeners=kafka:9092...我发现它不如环境变量可移植,因此不推荐
  • spotify/kafka 已弃用且已过时。
  • fast-data-devlensesio/box 非常适合一体化解决方案,具有架构注册表、Kafka Connect 等,但如果您想要 Kafka,则显得臃肿。另外,这是一种在一个容器中运行多个服务的 Docker 反模式
  • 您自己的 Dockerfile - 为什么?这些其他的东西是否不完整?从拉取请求开始,而不是从头开始。

有关补充阅读、功能齐全 docker-compose 和网络图,请参阅 此博客作者:@rmoff

回答

Confluence 快速入门 (Docker) 文档 假定所有生产和消费请求将在 Docker 网络内进行。

您可以通过在自己的容器中运行 Kafka 客户端代码(使用 Docker 网桥)来解决连接到 kafka:9092 的问题,但否则您需要添加更多环境变量以将容器公开到外部,同时仍然让它在 Docker 网络中工作。

首先添加 PLAINTEXT_HOST:PLAINTEXT 的协议映射,它将侦听器协议映射到 Kafka 协议

密钥:KAFKA_LISTENER_SECURITY_PROTOCOL_MAP
值: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT

然后在不同的端口上设置两个通告的侦听器。 (这里的 kafka 指的是 docker 容器名称;它也可能被命名为 broker,因此请仔细检查您的服务 + 主机名)。

键:KAFKA_ADVERTISED_LISTENERS
值:PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092

请注意,此处的协议与上面协议映射设置的左侧值相匹配

运行容器时,添加 -p 29092:29092 进行主机端口映射,并通告 PLAINTEXT_HOST 监听器。

所以...(使用上述设置

如果仍然不起作用,可以将 KAFKA_LISTENERS 设置为包含 <PROTOCOL>://0.0.0.0:<PORT>,其中两个选项都与广告设置和 Docker 转发的端口匹配

客户端位于同一台机器上,而不是在容器中

广告本地主机和关联的端口将允许您在容器外部进行连接,正如您所期望的那样。

换句话说,当在 Docker 网络之外运行任何 Kafka 客户端(包括您可能在本地安装的 CLI 工具)时,请使用 localhost:29092 作为引导服务器,使用 localhost:2181 作为 Zookeeper(需要 Docker)端口转发)

另一台机器上的客户端

如果尝试从外部服务器连接,您需要公布主机的外部主机名/IP(例如 192.168.x.y以及/代替 localhost
简单地通过端口转发来通告 localhost 是行不通的,因为 Kafka 协议仍将继续通告您配置的侦听器。

如果不在同一个本地网络中,此设置需要 Docker 端口转发路由器端口转发(以及防火墙/安全组更改),例如,您的容器在云中运行,并且您想要从本地计算机与其交互。

同一主机上容器中的客户端(或另一个代理)

这是最不容易出错的配置;您可以直接使用 DNS 服务名称。

在 Docker 网络中运行应用程序时,使用 kafka:9092 (请参阅上面广告的 PLAINTEXT 侦听器配置)作为引导服务器,使用 zookeeper:2181 (请参阅上面广告的 PLAINTEXT 侦听器配置)作为引导服务器,使用 zookeeper:2181 作为 Zookeeper,就像任何其他 Docker 服务通信一样(不不需要任何端口转发)

如果您使用单独的 docker run 命令或 Compose 文件,则需要使用 compose networks 部分或 docker network --create 手动定义共享 network

参见完整 Confluence 堆栈的示例 Compose 文件针对单个经纪商的更简单的

如果使用多个代理,那么它们需要使用唯一的主机名+广告侦听器。 查看示例一个>

相关问题

从 Docker (ksqlDB) 连接到主机上的 Kafka

附录

对于任何对 Kubernetes 部署感兴趣的人:

以上是连接到在 Docker 中运行的 Kafka的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
<🎜>掩盖:探险33-如何获得完美的色度催化剂
2 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1676
14
CakePHP 教程
1429
52
Laravel 教程
1333
25
PHP教程
1278
29
C# 教程
1257
24
H5页面制作是前端开发吗 H5页面制作是前端开发吗 Apr 05, 2025 pm 11:42 PM

是的,H5页面制作是前端开发的重要实现方式,涉及HTML、CSS和JavaScript等核心技术。开发者通过巧妙结合这些技术,例如使用&lt;canvas&gt;标签绘制图形或使用JavaScript控制交互行为,构建出动态且功能强大的H5页面。

oracle打不开怎么办 oracle打不开怎么办 Apr 11, 2025 pm 10:06 PM

Oracle 打不开的解决办法包括:1. 启动数据库服务;2. 启动监听器;3. 检查端口冲突;4. 正确设置环境变量;5. 确保防火墙或防病毒软件未阻止连接;6. 检查服务器是否已关闭;7. 使用 RMAN 恢复损坏的文件;8. 检查 TNS 服务名称是否正确;9. 检查网络连接;10. 重新安装 Oracle 软件。

为什么inline-block元素会出现错位现象?如何解决这个问题? 为什么inline-block元素会出现错位现象?如何解决这个问题? Apr 04, 2025 pm 10:39 PM

关于inline-block元素错位显示的原因及解决方案在编写网页布局时,我们常常会遇到一些看似奇怪的显示问题。比...

如何解读Debian Sniffer的输出结果 如何解读Debian Sniffer的输出结果 Apr 12, 2025 pm 11:00 PM

DebianSniffer是一个网络嗅探工具,用于捕获和分析网络数据包时间戳(Timestamp):显示数据包捕获的时间,通常以秒为单位。源IP地址(SourceIP):发送数据包的设备的网络地址。目标IP地址(DestinationIP):接收数据包的设备的网络地址。源端口(SourcePort):发送数据包的设备使用的端口号。目标端口(Destinatio

如何使用CSS的clip-path属性实现分段器的45度曲线效果? 如何使用CSS的clip-path属性实现分段器的45度曲线效果? Apr 04, 2025 pm 11:45 PM

如何实现分段器的45度曲线效果?在实现分段器的过程中,如何让点击左侧按钮时右侧边框变成45度曲线,而点�...

如何通过CSS自定义resize符号并使其与背景色统一? 如何通过CSS自定义resize符号并使其与背景色统一? Apr 05, 2025 pm 02:30 PM

CSS自定义resize符号的方法与背景色统一在日常开发中,我们经常会遇到需要自定义用户界面细节的情况,比如调...

如何通过JavaScript或CSS控制浏览器打印设置中的页首和页尾? 如何通过JavaScript或CSS控制浏览器打印设置中的页首和页尾? Apr 05, 2025 pm 10:39 PM

如何使用JavaScript或CSS控制浏览器打印设置中的页首和页尾在浏览器的打印设置中,有一个选项可以控制是否显�...

在移动端如何兼容多行溢出省略? 在移动端如何兼容多行溢出省略? Apr 05, 2025 pm 10:36 PM

移动端多行溢出省略在不同设备上的兼容问题在使用Vue2.0开发移动端应用时,常常会遇到需要对文本进行多行溢...

See all articles