Docker контейнерных сетей - Кафка Производитель - PullRequest
0 голосов
/ 07 мая 2019

Я хотел бы создавать сообщения из контейнера A на тему Kafka в контейнере B, но у меня возникают странные проблемы с сетью этих контейнеров. Есть ли у вас какие-либо идеи о том, как правильно соединить эти контейнеры? Проблема заключается в том, что служба коллектора не может видеть кафку из другого контейнера и не может добавлять в нее сообщения. Более конкретно у меня есть следующие услуги:

докер-compose.yml

version: '3.5'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    ports:
      - "2181:2181"
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
      ADVERTISED_HOST: zookeeper
      ADVERTISED_PORT: 2181
    extra_hosts:
      - "moby:127.0.0.1"
    networks:
      - meetup-net

  kafka:
    image: confluentinc/cp-kafka:latest
    depends_on:
      - zookeeper
    ports:
      - "9092:9092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
    extra_hosts:
      - "moby:127.0.0.1"
    networks:
      - meetup-net

collector:
    image: collector:v1
    environment:
      - kafka-bootstrap-servers=docker_kafka_1.docker_meetup-net
    restart: always
    depends_on:
      - kafka
    networks:
      - meetup-net
networks:
  meetup-net:
    driver: bridge

а с другой стороны у меня есть файл application.conf

streaming {
  window-size = 50
  window-interval = 5

  kafka-bootstrap-servers = ${?kafka-bootstrap-servers}
  kafka-bootstrap-servers = "localhost:9092"

  sink-topic = ${?source-topic}
  sink-topic = "meetup"

  key-value-json-path = ${key-value-json-path}
  key-value-json-path = "./data/keyvalue"

  source-topic-checkpoint-location = ${source-topic-checkpoint-location}
  source-topic-checkpoint-location = "./target/source-topic"

  sink-topic-checkpoint-location = ${sink-topic-checkpoint-location}
  sink-topic-checkpoint-location = "./target/sink-topic"
}

zookeeper.server = ${?zookeeper-server}
zookeeper.server = "localhost:2181"

1 Ответ

2 голосов
/ 07 мая 2019

Вам необходимо правильно установить KAFKA_ADVERTISED_LISTENERS.

На данный момент KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092 означает, что любой клиент, подключающийся к брокеру, получит localhost в качестве адреса брокера, по которому он будет подключаться для последующих запросов. Если клиент не работает на брокере (которого здесь нет), вам необходимо изменить эту конфигурацию. Для запуска в автономной среде Docker это достаточно просто:

KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092

Теперь любое клиентское соединение должно быть kafka:29092. Это также означает, что вы можете подключить клиент , работающий на хосте Docker , к брокеру Kafka, что может быть полезно, например, при работе на ноутбуке и локальном запуске клиента.

Здесь - пример Docker Compose, показывающий это в действии.

Для получения дополнительной информации и справочной информации см. https://rmoff.net/2018/08/02/kafka-listeners-explained/

...