为了账号安全,请及时绑定邮箱和手机立即绑定

从本地计算机连接到在Docker中运行的Kafka

从本地计算机连接到在Docker中运行的Kafka

慕娘9325324 2019-12-06 10:46:40
我在本地计算机上使用docker设置了Single Node Basic Kafka Deployment,如Confluent Kafka文档中所述(步骤2-3)。此外,我还公开了zookeeper的端口2181和kafka的端口9092,以便能够从在本地计算机上运行的Java客户端连接到它们:$ 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();问题:如何从主机连接到在Docker中运行的kafka?注意:我知道从理论上讲我可以进行DNS设置,/etc/hosts但这是一种解决方法-它不应该那样。也有类似的问题在这里,但它是基于ches/kafka图像。我使用confluent的是不一样的图像。
查看完整描述

2 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

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


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


我尝试了bitnamiKafka图像,并使其与这些设置一起使用


归根结底,在容器中运行的都是相同的Apache Kafka。您只取决于它的配置方式。


有关补充阅读和网络图,请参阅@rmoff的此博客。


该Confluent快速入门文档假定所有生产和消费请求都将在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用于主机端口的映射


tl; dr(具有上述设置)


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


在Docker网络中运行应用程序时,可kafka:9092用于引导服务器和zookeeper:2181Zookeeper


查看完整回答
反对 回复 2019-12-06
  • 2 回答
  • 0 关注
  • 1181 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信