Как использовать изображение confluent / cp-kafka в docker compose с выставлением на localhost и именем моего сетевого контейнера kafka?
Не связывайте это как дубликат:
Это не решает мою проблему, потому что методы, которые они используют, обесцениваются 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 ...
Может быть, я просто сталкиваюсь с каким-то самоуверенным образом докера и мне стоит поискать другой образ ...
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 за пределами виртуальной машины.
"столкновение с каким-то самоуверенным образом докера" ... Ну 1) Вы устанавливаете и 9093, и 9092 для рекламируемых слушателей, чего не следует делать. Один и тот же процесс прослушивает только один порт. 2) 0.0.0.0
не проблема. Это означает прослушивание всех интерфейсов внутри контейнера, что ожидается, и, следовательно, до внешнего хоста для перенаправления внешнего трафика в сетевой адаптер Docker. Однако, конечно, вы можете использовать другой образ или установить переменную среды KAFKA_LISTENERS
, чтобы не вводить флаг bash -z "${KAFKA_LISTENERS-}"
.
Когда я их устанавливаю: KAFKA_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT://localhost:9093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT://localhost:9093
Kafka не запускается, я пытаюсь найти документы о переменной KAFKA_LISTENERS
Привет @jemiloii, я обновил свой ответ тем, что вы просили
Мне не нужно устанавливать --net-host. Если я установлю PLAINTEST: // localhost: 9093, я могу получить к нему доступ за пределами контейнера.