簡體   English   中英

從docker主機外部與kafka docker容器交互

[英]Interact with kafka docker container from outside of docker host

我已經構建了一個kafka docker容器並使用docker-compose編排它。

調用docker docker ps我得到以下putput:

CONTAINER ID        IMAGE                          COMMAND                CREATED             STATUS              PORTS                                         NAMES
    5bde6f76246e        hieutrtr/docker-kafka:0.0.1    "/start.sh"            About an hour ago   Up About an hour    7203/tcp, 0.0.0.0:32884->9092/tcp             dockerkafka_kafka_3
    be354f1b8cc0        hieutrtr/docker-ubuntu:devel   "/usr/bin/supervisor   About an hour ago   Up About an hour    22/tcp                                        producer1
    50d3203af90e        hieutrtr/docker-kafka:0.0.1    "/start.sh"            About an hour ago   Up About an hour    7203/tcp, 0.0.0.0:32883->9092/tcp             dockerkafka_kafka_2
    61b285f39615        hieutrtr/docker-kafka:0.0.1    "/start.sh"            2 hours ago         Up 2 hours          7203/tcp, 0.0.0.0:32882->9092/tcp             dockerkafka_kafka_1
    20c9c5ccec05        jplock/zookeeper:3.4.6         "/opt/zookeeper/bin/   2 hours ago         Up 2 hours          2888/tcp, 3888/tcp, 0.0.0.0:32881->2181/tcp   dockerkafka_zookeeper_1

我可以從docker容器中運行生產者和消費者,但它不能從docker網絡外部運行。

例如

我在localhost上運行kafka生成器,出現以下錯誤:

$ kafka_2.9.1-0.8.2.1: bin/kafka-console-producer.sh --topic test --broker-list $DOCKER_HOST:32884
[2015-08-31 06:55:15,450] WARN Property topic is not valid (kafka.utils.VerifiableProperties)
to
[2015-08-31 06:55:20,214] WARN Failed to send producer request with correlation id 2 to broker 1 with data for partitions [test,0] (kafka.producer.async.DefaultEventHandler)
java.nio.channels.ClosedChannelException
    at kafka.network.BlockingChannel.send(BlockingChannel.scala:100)
    at kafka.producer.SyncProducer.liftedTree1$1(SyncProducer.scala:73)
    at kafka.producer.SyncProducer.kafka$producer$SyncProducer$$doSend(SyncProducer.scala:72)
    at kafka.producer.SyncProducer$$anonfun$send$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(SyncProducer.scala:103)
    at kafka.producer.SyncProducer$$anonfun$send$1$$anonfun$apply$mcV$sp$1.apply(SyncProducer.scala:103)
    at kafka.producer.SyncProducer$$anonfun$send$1$$anonfun$apply$mcV$sp$1.apply(SyncProducer.scala:103)

這是我在github上的kafka docker示例,其中包含上述問題。

那么,是否有人遇到同樣的問題並且可以以任何方式幫助我?

附加信息

(只需從ches / kafka派生並修改docker-compose的內容):

在Kafka服務器屬性中,您需要將advertised.host.nameadvertised.port設置為正在運行的容器的ip / port,然后它應該可以工作。

您需要將主機的名稱放在部署docker實例的位置。 您還需要將端口從docker主機(公共)映射到docker容器實例(私有)。

TL; DR在主機上公開端口9092並將其映射到9092容器端口以訪問容器外的kafka代理。 有關詳細信息,請參閱docker-compose文檔。

我認為問題是你沒有在容器外面暴露端口9092。 根據您的docker ps列表,您的9092容器端口動態映射到主機的端口范圍32882-32884。 當您連接到以這種方式配置的代理時,您會收到包含用於廣告的端口9092的元數據。 此元數據生成器嘗試通過端口9092執行其他請求並失敗。

為了記錄,讓我的本地kafka消費者與Docker容器內的遠程代理通信的另一種方法是在我的/ etc / hosts中添加一個條目: docker-host-ip-address docker-kafka-container-hostname

無論如何,Lundahl的解決方案對我來說很好,看起來更干凈。 甚至更干凈的是設置advertised.listeners = host-ipport,因為不推薦使用advertised.host.nameadvertised.port

這是我的兩分錢,因為我很難搞清楚這一點。

我的$ KAFKA_HOME / config / server.properties包含以下內容:

listener.security.protocol.map=INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT

advertised.listeners=INSIDE://${container_ip}:9092,OUTSIDE://${outside_host_ip}:29092

listeners=INSIDE://:9092,OUTSIDE://:29092

inter.broker.listener.name=INSIDE

這創建了兩個連接,一個用於docker內部,另一個用於外部。 您必須為后者選擇一個新端口,在我的情況下為29092,確保此端口由docker公開並映射。

在環境中沒有$ {outside_host_ip}的情況下我還沒有找到解決方案,因此我將主機的ip作為env var提供。

測試:

  1. 輸入Kafka容器並創建一個主題: ./kafka-topics.sh -zookeeper zookeeper:2181 --create --topic dummytopic --partitions 1 --replication-factor 1
  2. 從Kafka容器外部執行: ./kafka-console-producer.sh --broker-list 0.0.0.0:29092 --topic dummytopic並輸入消息

我希望這有助於其他人

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM