0

0

连接到在 Docker 中运行的 Kafka

PHPz

PHPz

发布时间:2024-02-14 23:42:08

|

1385人浏览过

|

来源于stackoverflow

转载

连接到在 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 的图像,这是不一样的。

解决方法

tl;dr - 从容器到主机的简单端口转发将不起作用...主机文件(例如 *NIX 系统上的 /etc/hosts )不应修改以解决 Kafka 网络问题,因为此解决方案不可移植。

1) 您想要连接到哪个确切的 IP/主机名 + 端口?确保该值在代理上设置为 advertished.listeners (不是 advertished.host.nameadvertished.port,因为这些已被弃用)。如果您看到诸如 Connection to node -1 (localhost/127.0.0.1:9092) 之类的错误,则意味着您的应用程序容器尝试连接到自身。您的应用程序容器是否也在运行 Kafka 代理进程?可能不是。

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

3) 如果从主机而不是另一个容器运行进程,要验证端口是否在主机上正确映射,请确保 docker ps 显示 kafka 容器是从 0.0.0.0 映射的:<host_port> -> <advertished_listener_port> /tcp.如果尝试从 Docker 网络外部运行客户端,则端口必须匹配。两个容器之间不需要端口转发;使用链接/docker网络

下面的答案使用 confluenceinc docker 镜像来解决所提出的问题,不是 wurstmeister/kafka。如果您设置了 KAFKA_ADVERTISED_HOST_NAME 变量,请将其删除(这是一个已弃用的属性)

以下部分尝试汇总使用其他图像所需的所有详细信息。对于其他常用的 Kafka 镜像,都是在容器中运行的 Apache Kafka
您只依赖于它的配置方式。以及哪些变量导致了这种情况。

wurstmeister/kafka

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

请参阅有关监听器配置的自述文件部分 a>,另外阅读他们的 Connectivity wiki

bitnami/kafka

如果您想要一个小容器,请尝试这些。这些图像比 Confluence 小得多,并且比 wurstmeister 维护得更好。 参考他们的监听器配置的自述文件

debezium/kafka

此处提到了相关文档此处

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

其他

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

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

PaperFake
PaperFake

AI写论文

下载

回答

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 作为 Zookeeper,就像任何其他 Docker 服务通信一样(不不需要任何端口转发)

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

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

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

相关问题

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

附录

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

相关文章

Kafka Eagle可视化工具
Kafka Eagle可视化工具

Kafka Eagle是一款结合了目前大数据Kafka监控工具的特点,重新研发的一块开源免费的Kafka集群优秀的监控工具。它可以非常方便的监控生产环境中的offset、lag变化、partition分布、owner等,有需要的小伙伴快来保存下载体验吧!

下载

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
kafka消费者组有什么作用
kafka消费者组有什么作用

kafka消费者组的作用:1、负载均衡;2、容错性;3、广播模式;4、灵活性;5、自动故障转移和领导者选举;6、动态扩展性;7、顺序保证;8、数据压缩;9、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

175

2024.01.12

kafka消费组的作用是什么
kafka消费组的作用是什么

kafka消费组的作用:1、负载均衡;2、容错性;3、灵活性;4、高可用性;5、扩展性;6、顺序保证;7、数据压缩;8、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

159

2024.02.23

rabbitmq和kafka有什么区别
rabbitmq和kafka有什么区别

rabbitmq和kafka的区别:1、语言与平台;2、消息传递模型;3、可靠性;4、性能与吞吐量;5、集群与负载均衡;6、消费模型;7、用途与场景;8、社区与生态系统;9、监控与管理;10、其他特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

207

2024.02.23

Java 流式处理与 Apache Kafka 实战
Java 流式处理与 Apache Kafka 实战

本专题专注讲解 Java 在流式数据处理与消息队列系统中的应用,系统讲解 Apache Kafka 的基础概念、生产者与消费者模型、Kafka Streams 与 KSQL 流式处理框架、实时数据分析与监控,结合实际业务场景,帮助开发者构建 高吞吐量、低延迟的实时数据流管道,实现高效的数据流转与处理。

177

2026.02.04

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

409

2023.09.04

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

605

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.07.18

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号