подключиться к контейнеру kafka от localhost - PullRequest
0 голосов
/ 03 мая 2018

Я новичок в докерах.

Я должен создать контейнер Кафки в котором будет потребительский контейнер, задача которого - потреблять и сохранять в mongodb.

мой docker-compose выглядит так:

version: '2'
services:
  consumer:
    image: springio/kafka-consumer
    depends_on:
      - kafka
      - mongodb
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
  kafka:
    image: wurstmeister/kafka
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: kafka
      KAFKA_CREATE_TOPICS: "test:1:1"
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
  mongodb:
    image: mongo
    container_name: "mongodb"
    environment:
      - MONGO_DATA_DIR=/data/db
      - MONGO_LOG_DIR=/dev/null
    volumes:
      - ./data/db:/data/db
    ports:
        - 27017:27017

Насколько я понимаю, я не мог использовать KAFKA_ADVERTISED_HOST_NAME в качестве 'localhost', потому что тогда потребительский контейнер не сможет достичь его (так как он попытается подключиться к своему собственному контейнеру localhost). Поэтому я называю это «кафка».

Теперь я хочу запустить производителя (не контейнера) на моей хост-машине (той же машине, на которой работают контейнеры).

Проблема в том, что как только я изменил KAFKA_ADVERTISED_HOST_NAME, чтобы он отличался от localhost, я не могу произвести kafka от производителя хост-машины.

  1. Почему я не могу производить кафку? Я подумал, когда я указал порты: 9092: 9092, я фактически экспортировал этот порт на хост-компьютер, я не прав?

  2. Как лучше всего добраться до кафки с хост-машины без использования дополнительного контейнера для производителя?

Буду признателен за любую помощь !!

EDIT:

Когда я пытаюсь создать сообщение, используя kafka-console -roduction, только когда KAFKA_ADVERTISED_HOST_NAME не является 'localhost', я получаю следующее сообщение:

ОШИБКА Ошибка при отправке сообщения в тему теста с ключом: ноль, значение: 3 байта с ошибкой: (Org.apache.kafka.clients.producer.internals.ErrorLoggingCallback) org.apache.kafka.common.errors.TimeoutException: срок истекает 1 запись (и) для теста 0: прошло 1503 мс с момента создания партии плюс время задержки

1 Ответ

0 голосов
/ 07 мая 2018

У меня была такая же проблема, kafka не знает имя хоста kafka, если вы не укажете его, и, следовательно, вы будете вынуждены использовать localhost или ip из механизма докера.

Вы можете решить эту проблему, добавив запись hostname: kafka в ваш docker-compose.yml, то есть:

  kafka:
    image: wurstmeister/kafka
    ports:
      - "9092:9092"
    hostname: kafka
    environment:
      KAFKA_ADVERTISED_HOST_NAME: kafka
      KAFKA_CREATE_TOPICS: "test:1:1"
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

Здесь есть пример проекта, настроенный таким образом. Затем, если вы хотите, вы можете добавить то же имя в файл хоста вашего компьютера и сопоставить его с ip вашего докера (по умолчанию windows 10.0.75.1). Однако этот дополнительный шаг не требуется для служб в вашем docker-compose, чтобы правильно найти kafka.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...