[英]Kafka access inside and outside docker
我正在嘗試使用 docker-compose 啟動 kafka 服務,它應該可以在 docker 內部和外部訪問。 因此,應該在內部和外部設置合適的廣告商:
version: '3'
services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka
ports:
- "9094:9092"
environment:
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
KAFKA_LISTENERS: INSIDE://:9092,OUTSIDE://127.0.0.1:9094
KAFKA_ADVERTISED_LISTENERS: INSIDE://:9092,OUTSIDE://127.0.0.1:9094
KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
問題是當我嘗試從集群外部連接時,我沒有得到 127.0.0.1 作為節點的名稱,而是內部主機名:
$ kafkacat -L -b 127.0.0.1:9094
Metadata for all topics (from broker -1: 127.0.0.1:9092/bootstrap):
1 brokers:
broker 1001 at 91588ea968d4:9092
28 topics:
...
KAFKA_ADVERTISED_LISTENERS 和 KAFKA_LISTENERS 的目的不是處理這種情況嗎? 我嘗試設置 KAFKA_ADVERTISED_HOST_NAME 但它被忽略了(一份文檔說它已棄用,另一份說它仍然處於活動狀態),但這似乎不是答案,因為我想要兩個不同的廣告主機名用於兩個不同的網絡。
我想老問題仍然存在:如何使 kafka 在 docker-compose 內外工作?
我需要做的是將偵聽器聲明為都綁定到 docker 主機,然后以不同的方式宣傳它們 - 一個到 docker 網絡,一個到主機:
services:
zookeeper:
image: confluentinc/cp-zookeeper
ports:
- "2181:2181"
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_SYNC_LIMIT: 2
kafka:
image: confluentinc/cp-kafka
ports:
- 9094:9094
depends_on:
- zookeeper
environment:
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENERS: INTERNAL://kafka:9092,OUTSIDE://kafka:9094
KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka:9092,OUTSIDE://localhost:9094
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,OUTSIDE:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
您的偵聽器配置看起來正確,問題在於您的 Docker Compose:
ports:
- "9094:9092"
您將9094
(“外部”)映射回9092
(“內部”),因此當您連接時,您正在連接到“內部”偵聽器。 如果您刪除這行配置,那么您的偵聽器設置應該按預期工作。
有關更多信息,請參閱http://rmoff.net/2018/08/02/kafka-listeners-explained/
同意@Robin Moffatt 的回答,即外部端口9094
映射到容器的9092
。
除了從 docker-compose.yml 中刪除該配置外,外部端口9094
還應映射到容器的9094
。
ports:
- "9094:9094"
PS:我無法將此添加為對先前答案的評論,因此將其添加為新答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.