【问题标题】:Listen to a same port via multiple Docker containers通过多个 Docker 容器监听同一个端口
【发布时间】:2019-09-01 04:49:12
【问题描述】:

我提出了一个 Kafka 消息传递服务,其中 Kafka 代理设置在 docker 中并位于端口 9092 上。主机端口 9092 映射到容器端口 9092。现在我正在尝试启动一个侦听主机端口的消费者9092 消费消息。在所有代理都使用 docker compose 启动后,我正在尝试设置使用者容器。

我遇到错误,当我尝试启动消费者时,端口 9092 已分配

请有人帮助我了解我的方法是否正确。如果它是正确的,我该怎么做才能解决这个问题

【问题讨论】:

  • 如果有人连接到主机端口 9092,您希望该请求映射到哪个容器?请包含您使用的任何 compose 文件或 docker run 命令。
  • 您说您将主机端口 9092 映射到容器端口 9092。如果您已经这样做了,那么当然端口 9092 已经分配了。您将无法启动绑定到此端口的另一个容器(或任何其他进程)。
  • 有什么理由不让主机端口随机选择以防止冲突?

标签: docker apache-kafka docker-compose kafka-consumer-api docker-networking


【解决方案1】:

KAFKA_ADVERTISED_LISTENERS需要用localhost:<port>指定为环境变量。

默认情况下,Kafka 侦听器将侦听 9092 端口,并且当生产者/消费者连接到代理时,它将通过 host:9092 将代理列表作为元数据请求的一部分进行通告。

您在 Docker 中运行它,因此代理元数据列表中的主机只能在 Docker 网络内访问。

为了让它工作,我们需要让 Kafka 代理监听另一个端口,将其添加到 advertised.listeners 并为新端口添加端口映射。

ports:
- "29092:29092"
environment: 
- KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
- KAFKA_LISTENERS=INTERNAL://0.0.0.0:9092,EXTERNAL://0.0.0.0:29092
- KAFKA_ADVERTISED_LISTENERS=EXTERNAL://localhost:29092,INTERNAL://kafka0:9092
- KAFKA_INTER_BROKER_LISTENER_NAME=INTERNAL
- KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT

【讨论】:

猜你喜欢
  • 2020-11-28
  • 2013-06-17
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 2013-12-26
  • 1970-01-01
相关资源
最近更新 更多