我在本地计算机上设置了一个单节点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
的是不一样的图像。
tl; dr- 最终,容器中运行 的都是相同的 Apache Kafka。您只取决于 它的配置方式 。以及 哪些变量
使它如此。以下使用
confluentinc
docker
images
,而不是wurstmeister/kafka
,尽管有类似的配置,但我没有尝试过。如果使用该图像,请阅读其Connectivity
Wiki。没有什么与
wurstmeister
映像相反,而是由社区维护的,不是内置于自动CI /
CD版本中的。。。Bitnami的映像同样非常简单,可以在多个云提供商中运行。对于bitnami
Kafka图片,请参阅其自述文件
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
用于主机端口的映射
tl; dr (具有上述设置)
在Docker网络 外部
运行任何Kafka客户端时(包括您可能已在本地安装的CLI工具),可localhost:29092
用于引导服务器和localhost:2181
Zookeeper
在Docker网络中 运行应用程序 时 ,可kafka:9092
用于引导服务器和zookeeper:2181
Zookeeper
有关完整的Confluent堆栈,请参见示例Compose文件。
对于对 Kubernetes 部署感兴趣的任何人:https :
//operatorhub.io/? keyword =
Kafka
我在docker compose yml文件中为广告侦听器配置了以下配置 警告O.apache.kafka.clients.networkclient-获取相关id为1的元数据时出错:{foo=leader_not_available} 主机可以从我的机器ping,因为它都在同一个网络中,没有防火墙问题。在docker容器中使用命令时,可以看到相同的主机名。我是不是漏掉了什么?
问题内容: 遵循此示例:https : //docs.docker.com/engine/examples/mongodb/ 当尝试使用以下命令连接到mongoDB时:( 其中ip是boot2docker ip的名称)+ docker ps的端口号: 27017 / tcp 或-P 0.0.0.0:49155->27017/tcp 无论哪种方式,我都会收到以下错误: 警告:无法连接到ip:2701
问题内容: 我在本地计算机上使用docker设置了Single Node Basic Kafka Deployment,如Confluent Kafka文档中所述(步骤2-3)。 另外,我还公开了zookeeper的端口2181和kafka的端口9092,以便能够从在本地计算机上运行的Java客户端连接到它们: 问题:当我尝试从主机连接到kafka时,连接失败,因为它无法解析地址:kafka:90
我为我的基于spring boot的库配置了以下Kafka属性,该库绑定在部署到的的目录中。通过从类路径()加载porperty文件,我能够成功启动spring组件 我通过docker compose运行Kafka和zookeeper,容器分别映射到主机端口和。发布失败,错误为 这是在提供了属性之后。有趣的是 Wildfly服务器错误日志显示应用程序实际上是通过它的容器ID连接到docker容器的
问题内容: 我看到很多人都在为此苦苦挣扎,好像在redis容器映像中可能有一个错误,而其他人似乎在追寻类似的问题。 我在DockerHub上使用标准Redis映像。(https://github.com/dockerfile/redis) 像这样运行它: 进入服务器后,就可以启动服务器,并从容器映像进行Redis ping了。 不幸的是,我无法从主机连接到Redis容器。 我已经尝试设置,例如下面
我是JProfiler的新手。我最近遇到了一个问题。我的Java应用程序在docker中运行,这意味着JVM在docker中运行。但是我的jprofile安装在主机上。我知道janalyiler必须连接到JVM。那么,janalyiler可以连接到在docker中运行的jvm吗?