Как использовать изображение confluent / cp-kafka в docker compose с рекламой на localhost и именем моего сетевого контейнера kafka?

Как использовать изображение confluent / cp-kafka в docker compose с выставлением на localhost и именем моего сетевого контейнера kafka?

Не связывайте это как дубликат:

  1. Подключиться к контейнеру docker kafka с localhost и другого контейнера docker
  2. Невозможно отправить сообщение в кафку из службы, запущенной в докере

Это не решает мою проблему, потому что методы, которые они используют, обесцениваются confluent / cp-kafka, и я хочу подключиться к localhost и в сети докеров.

В скрипте configure на confluent / cp-kafka они выполняют эту надоедливую задачу:

# By default, LISTENERS is derived from ADVERTISED_LISTENERS by replacing
# hosts with 0.0.0.0. This is good default as it ensures that the broker
# process listens on all ports.
if [[ -z "${KAFKA_LISTENERS-}" ]]
then
  export KAFKA_LISTENERS
  KAFKA_LISTENERS=$(cub listeners "$KAFKA_ADVERTISED_LISTENERS")
fi

Он всегда устанавливает все, что я даю KAFKA_ADVERTISED_LISTENERS, равным 0.0.0.0! Используя сеть докеров, выполняя

KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9093,PLAINTEXT://kafka:9093

Я ожидаю, что слушателями будут либо localhost:9092, либо 0.0.0.0:9092, и некоторый ip-адрес докера PLAINTEXT://172.17.0.1:9093 (независимо от того, что kafka разрешает в сети докеров)

В настоящее время я могу заставить работать только одно или другое. Таким образом, при использовании localhost он работает только в хост-системе, контейнеры докеров не могут получить к нему доступ. Используя kafka, он работает только в сети докеров, никакие хост-приложения не могут получить к нему доступ. Я хочу, чтобы он работал с обоими. Я использую docker compose, чтобы запустить zookeeper, kafka, redis и мое приложение. У меня есть другие приложения, которые запускаются без докера.

Обновлять Поэтому, когда я устанавливаю PLAINTEXT://localhost:9092, я могу получить доступ к запущенному докеру kafka за пределами докера.

Когда я устанавливаю PLAINTEXT://kafka:9092, я не могу получить доступ к запущенному докеру kafka за пределами докера.

Это ожидается, но сделав это: PLAINTEXT://localhost:9092,PLAINTEXT://kafka:9093 Я ожидал бы получить доступ к запущенному докеру kafka, как внутри, так и вне докера. Образ confluent / cp-kafka уничтожает localhost и kafka. Устанавливая их оба на 0.0.0.0, а затем выкидывая ошибку, я установил 2 разных порта на один и тот же ip ...

Может быть, я просто сталкиваюсь с каким-то самоуверенным образом докера и мне стоит поискать другой образ ...

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
3
0
619
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Maybe I'm just clashing into some opinionated docker image and should look for a different image...

Изображение в порядке. Вы можете прочитать это объяснение слушателей.

tl; dr - вы не хотите (и не должны?) Использовать один и тот же "протокол" слушателя в разных сетях.

Используйте advertised.listeners, нет необходимости редактировать listeners

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

Когда PLAINTEXT://localhost:9093 загружается внутри контейнера, вам нужно добавить сопоставления портов для 9093, которые должны быть понятными, и вы подключаетесь к localhost:9093, и он должен работать.

Затем, если у вас также был PLAINTEXT://kafka:9092, он будет работать только в сетевом оверлее Docker Compose, а не за пределами ваших DNS-серверов, потому что именно так работает сеть Docker. Вы должны иметь возможность запускать другие приложения как часть этой сети Docker с флагом --network или связывать контейнеры с помощью Docker Compose

Имейте в виду, что если вы работаете на Mac, рекомендуемый способ (согласно документации Confluent) - запускать эти контейнеры на Docker Machine, на виртуальной машине, где вы можете правильно управлять сопоставлением внешних портов, используя флаг --net=host Docker. . Однако, используя приведенный выше блог, все это отлично работает на Mac за пределами виртуальной машины.

Мне не нужно устанавливать --net-host. Если я установлю PLAINTEST: // localhost: 9093, я могу получить к нему доступ за пределами контейнера.

jemiloii 01.05.2018 23:38

"столкновение с каким-то самоуверенным образом докера" ... Ну 1) Вы устанавливаете и 9093, и 9092 для рекламируемых слушателей, чего не следует делать. Один и тот же процесс прослушивает только один порт. 2) 0.0.0.0 не проблема. Это означает прослушивание всех интерфейсов внутри контейнера, что ожидается, и, следовательно, до внешнего хоста для перенаправления внешнего трафика в сетевой адаптер Docker. Однако, конечно, вы можете использовать другой образ или установить переменную среды KAFKA_LISTENERS, чтобы не вводить флаг bash -z "${KAFKA_LISTENERS-}".

OneCricketeer 02.05.2018 01:16

Когда я их устанавливаю: KAFKA_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT://localhost:9093KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT://localhost:9093 Kafka не запускается, я пытаюсь найти документы о переменной KAFKA_LISTENERS

jemiloii 02.05.2018 17:13

Привет @jemiloii, я обновил свой ответ тем, что вы просили

OneCricketeer 09.01.2019 21:40

Другие вопросы по теме