【问题标题】:Run kafka using docker compose and expose a different port instead of default one使用 docker compose 运行 kafka 并公开一个不同的端口而不是默认端口
【发布时间】:2020-04-08 03:48:21
【问题描述】:

我正在尝试使用 docker compose 启动一个 kafka 集群,我正在使用以下配置:

version: '3'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
  kafka:
    image: wurstmeister/kafka
    command: [start-kafka.sh]
    ports:
      - "15092:9092"
    hostname: kafka
    environment:
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENERS: INSIDE://:9092,OUTSIDE://:15092
      KAFKA_ADVERTISED_LISTENERS: INSIDE://:9092,OUTSIDE://:15092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    depends_on:
      - "zookeeper"

两个服务都已启动并正在运行,但是当我尝试使用代理 external-ip:15092 从外部源生成消息时,我收到以下错误:

dial tcp: lookup kafka: no such host

你能帮我弄清楚缺少什么配置吗?

谢谢

【问题讨论】:

  • 无法从外部机器解析名称 kafka。你能显示你正在使用的连接字符串是什么吗?
  • 我正在尝试使用external-ip:15092进行连接

标签: docker apache-kafka docker-compose


【解决方案1】:

您会得到“没有这样的主机”,这甚至发生在端口被使用之前。您需要在同一个 Docker 网络中的另一个容器中运行代码才能解析服务名称

Kafka 不是那样工作的(一个简单的端口转发),无论如何

两个监听器仍然设置为 9092

您需要添加/更改包含 externalIP:15092 的广告侦听器才能使其工作,并且您可以找到多个记录侦听器差异的地方(包括该容器的 wiki 页面)


所以,KAFKA_LISTENERS: INSIDE://:9092 就是你所需要的(或者更恰当地说,是 INSIDE://0.0.0.0:9092

但你需要编辑

KAFKA_ADVERTISED_LISTENERS: INSIDE://:9092,OUTSIDE://<your_external_IP>:15092

【讨论】:

  • 感谢您的回复。你能给我一些关于听众差异文件的例子吗?我不知道是什么问题,我用我现在正在尝试的内容更新了帖子
  • 只要搜索listeners vs advertised listeners ...我已经更新了我的答案
  • @cricket_007 我在 docker 中运行 druid,现在当我在 docker 中运行 kafka [github.com/wurstmeister/kafka-docker] bit 它有自己的 zooker,我如何指定 kafka 和 druid 需要使用同一个 zookeeper。
  • 你会 1) 使用相同的 docker-compose 文件 2) 指向zookeeper:2181
【解决方案2】:

这是一个暴露不同端口的配置:

version: '3'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    container_name: zookeeper
    ports:
      - "49815:2181"
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000

  broker:
    image: wurstmeister/kafka
    container_name: broker
    ports:
      - "49816:9092"
    depends_on:
      - zookeeper
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,INTERNAL:PLAINTEXT
      KAFKA_LISTENERS: PLAINTEXT://broker:9092,INTERNAL://broker:29092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:49816,INTERNAL://broker:29092
      KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL

关键点:

  • 您的外部源需要连接到 Docker 公开的地址 (localhost:49816) 并使用端口 9092 绑定到代理。因此,您需要为外部连接设置 KAFKA_ADVERTISED_LISTENERS 的值。
  • 代理应该监听9092以通过Docker端口绑定从外部获取连接。所以需要在KAFKA_LISTENERS中设置PLAINTEXT://broker:9092为外部监听器。
  • 您仍然需要侦听容器间连接以使 Brokers 和 Zookeeper 正常工作,因此您需要将 KAFKA_LISTENERSKAFKA_ADVERTISED_LISTENERS 设置为在 Docker 内部可见的内部端点 INTERNAL://broker:29092

这是完整的配置链接:https://docs.confluent.io/platform/current/installation/configuration/broker-configs.html#brokerconfigs_listeners(它适用于 Confluence 映像,但与 wurstmeister 相同)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    相关资源
    最近更新 更多