连接到在Docker中运行的Kafka

我在本地计算机上设置了一个单节点Kafka

Docker容器,如Confluent文档中所述(步骤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时,连接失败,因为它can't resolve address: 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图像。我使用confluentinc的是不一样的图像。

回答:

免责声明

最终,容器中运行 。您只取决于 它的配置方式 。以及 哪些变量

使它如此。


,而不是wurstmeister/kafka,尽管有类似的配置,但我没有尝试过。如果使用该图像,请阅读其Connectivity

Wiki。

没有什么与wurstmeister映像相反,而是由社区维护的,不是内置于自动CI /

CD版本中的。。。Bitnami的映像同样非常简单,可以在多个云提供商中运行。对于bitnamiKafka图片,请参阅其自述文件

debezium/kafka这里提到它的文档。

注意:不建议使用公告的主机和端口设置。广告听众涵盖了

spotify/kafka已过时和过时。fast-data-dev对于一个解决方案来说很棒,但它it肿

有关补充阅读, docker-

compose网络图,请参阅@rmoff的此博客。

回答

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

您可以通过在自己的容器中运行Kafka客户端代码来解决该问题,但否则,您需要添加更多环境变量以在外部暴露该容器,同时使其仍在Docker网络中运行。

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

-e

KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT

然后在不同的端口上设置两个播发的侦听器。(kafka:9092这里是指Docker容器的名称)。请注意,协议与上面映射的右侧值匹配

-e

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

运行容器时,添加-p 29092:29092用于主机端口的映射

(具有上述设置)

在Docker网络

运行任何Kafka客户端时(包括您可能已在本地安装的CLI工具),可localhost:29092用于引导服务器和localhost:2181Zookeeper

运行应用程序 ,可kafka:9092用于引导服务器和zookeeper:2181Zookeeper

有关完整的Confluent堆栈,请参见示例Compose文件。

附录

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

? =

以上是 连接到在Docker中运行的Kafka 的全部内容, 来源链接: utcz.com/qa/433351.html

回到顶部