Docker 容器中的 Kafka - 外部和内部连接

问题描述

我有一种情况,Kafka 使用网络中的特定 IP 地址在 docker 容器中运行。使用以下命令创建网络

sudo docker network create --subnet=172.19.0.0/16  --gateway 172.19.0.1 --ip-range=172.19.0.1/24 my_net

Kafka 容器使用以下方式启动

docker run -d --name kafkanode --net my_net --hostname=kafkahost01 kafka_zook:212-358 -p 2181:2181 -p 9092:9092 tail -f /dev/null

我在同一主机内有来自不同容器的生产者。 Kafka 的 server.properties 类似下面的简单配置适用于同一主机和不同容器中的生产者。

listeners=PLAINTEXT://:9092
advertised.listeners=PLAINTEXT://kafkahost01:9092

但是,在我们的例子中,我们将有生产者,他们也将从该机器外部发送消息。

enter image description here

不幸的是,我无法从 docker 主机外部连接。有人可以帮我配置吗?

我们使用的是 Kafka 2.12-2.6.0 动物园管理员 -- 3.5.8

使用以下值编辑的服务器属性

 listeners=INTERNAL://0.0.0.0:29092,EXTERNAL://0.0.0.0:9092 
 listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT 
 advertised.listeners=INTERNAL://kafkahost01:29092,EXTERNAL://10.20.30.40:9092 
 inter.broker.listener.name=INTERNAL 

谢谢 巴拉吉

解决方法

这里有一个配置了内部和外部侦听器的 docker-compose 示例。试用。 (用你想要的 IP 或 DNS 替换 localhost)

version: '3.7'
services:
  zookeeper:
    image: zookeeper:3.5.8
    hostname: zookeeper
    volumes:
      - zookeeper-data:/data
      - zookeeper-datalog:/datalog

  kafka:
    image: wurstmeister/kafka:2.13-2.6.0
    hostname: kafka
    depends_on:
    - zookeeper
    ports:
    - 9093:9093
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ADVERTISED_LISTENERS: INSIDE://:9092,OUTSIDE://localhost:9093
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
      KAFKA_LISTENERS: INSIDE://:9092,OUTSIDE://:9093
      KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
    volumes:
      - kafka:/kafka


volumes:
  zookeeper-data:
  zookeeper-datalog:
  kafka:

在同一网络中运行生产者:

# note: I just placed my docker-compose.yml in example dir,thats the reason for the example_default network
$ docker run -it --rm \
--name producer \
--network example_default \
wurstmeister/kafka:2.13-2.6.0 bash
bash-4.4# /opt/kafka/bin/kafka-console-producer.sh --bootstrap-server kafka:9092 --topic 
example
>some
>test

并使用 kaf 从外部 docker 消费:

$ cat ~/.kaf/config
current-cluster: single
clusteroverride: ""
clusters:
- name: single
  version: 2.7.0
  brokers:
  - localhost:9093
  SASL: null
  TLS: null
  security-protocol: PLAINTEXT
  schema-registry-url: ""
$ kaf nodes
ID    ADDRESS          
1     localhost:9093
$ kaf consume example -f --raw 
some
test

希望这个例子可以帮助你定义你自己的设置。