gpt4 book ai didi

Docker/Kafka连接两个不同的容器

转载 作者:行者123 更新时间:2023-12-02 18:52:00 25 4
gpt4 key购买 nike

我正在使用 wurstmeister's docker-kafka在容器中运行 kafka/zookeeper 的项目。我使用 localhost 作为 KAFKA_ADVERTISED_HOST_NAME: localhost docker-compose 容器多变的。

我编写了一个 Java 应用程序,它使用 flink 连接和使用此 Kafka 容器的主题之一。如果我导出一个可运行的 jar 并从我的机器上运行它,它绝对可以正常工作。当我创建以下图像以从另一个 docker 容器运行 jar 时,我收到一个异常(执行后大约 30 秒)Exception in thread "main" org.apache.flink.runtime.client.JobExecutionException: org.apache.kafka.common.errors.TimeoutException: Timeout expired while fetching topic metadata我认为这与我的 Java 程序无法与在另一个容器中运行的 Kafka 服务器通信有关。

这是我的 Java 应用程序的 dockerfile:

# Dockerfile

FROM anapsix/alpine-java

MAINTAINER myself myself

COPY myApp.jar /home/myApp.jar

CMD ["java","-jar","/home/myApp.jar"]

这是 wurstmeister 的 docker kafka 的 docker-compose.yml:

version: "3.5"

networks:
myNetwork:
name: myNetwork
driver: bridge

services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
networks:
- myNetwork
kafka:
build: .
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: localhost
KAFKA_ADVERTISED_PORT: "9092"
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
ALLOW_PLAINTEXT_LISTENER: "yes"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
- myNetwork
auth_analytics:
build:
context: .
dockerfile: auth_dockerfile
depends_on:
- kafka
networks:
- myNetwork

我已经尝试了以上的多个版本。最初我没有设置任何我认为可能是问题的网络,但是,创建网络的上述内容没有任何区别。我尝试将“localhost:9092”作为我的 Java 应用程序中的引导服务器,并在网上阅读“myNetwork:9092”。

我也读过这个FAQ来自 wurstmeister 关于连接性的信息,但我没有发现我的设置有问题。

我也尝试过在不使用 docker-compose 的情况下运行我的 Java 应用程序镜像(我运行 docker-compose 来启动 zookeeper/kafka,然后我在我的 Java 应用程序的镜像上进行了 docker 构建、docker 运行。这没有区别。)

我卡住了。我做错了什么?

最佳答案

您需要正确设置KAFKA_ADVERTISED_LISTENERS。目前它是 localhost 这意味着代理会告诉任何连接的客户端代理在 localhost 上——当客户端尝试连接到它时,它将失败(除非 Kafka 代理实际上在 localhost 上可用,它不会在仅运行您的应用程序的 Docker 容器上)。

解决方案是定义监听器,以便可以从需要它的任何代理和客户位置寻址它们。我的首选方法是 this ,其中一个用于容器内通信,一个用于来自主机的通信:

  KAFKA_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092

您在 Docker 网络上的客户端使用 kafka:29092 进行连接;主机上的客户端连接到 localhost:9092(并确保通过 Docker 将 9092 公开给主机)。

要了解更多相关信息,请参阅 https://rmoff.net/2018/08/02/kafka-listeners-explained/

顺便说一句,我强烈建议以正确的方式解决这个问题;覆盖 /etc/hosts 文件是一种 hack,并不能解决 IMO 的实际问题。

关于Docker/Kafka连接两个不同的容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56576014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com