Kafka访问docker内部和外部

时间:2018-11-11 09:53:32

标签: docker apache-kafka docker-compose

我正在尝试使用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,但是它被忽略了(一个文档说它已被弃用,另一个说它仍然处于活动状态),但这似乎不是答案,因为我想要为两个不同的网络使用两个不同的公告主机名。 / p>

我想仍然存在一个老问题:如何使kafka在docker-compose内部和外部工作?

3 个答案:

答案 0 :(得分:2)

您的侦听器配置看起来正确,问题出在您的Docker Compose:

ports:
  - "9094:9092"

您将9094(“外部”)映射回9092(“内部”),因此,当您连接时,您将连接到“内部”侦听器。如果删除此配置行,则您的侦听器设置应该可以正常工作。

有关更多信息,请参见http://rmoff.net/2018/08/02/kafka-listeners-explained/

答案 1 :(得分:1)

同意@Robin Moffatt的回答,将外部端口9094映射到容器的9092

除了从docker-compose.yml中删除该配置外,外部端口9094还应映射到容器的9094

ports:
  - "9094:9094"

PS:我无法将其添加为先前答案的注释,因此无法将其添加为新答案。

答案 2 :(得分:1)

我需要做的是声明LISTENERS都绑定到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