Слушайте один и тот же порт через несколько контейнеров Docker

Я вызвал службу обмена сообщениями Kafka, в которой брокер Kafka настроен в докере и находится на порту 9092. Порт хоста 9092 сопоставлен с портом контейнера 9092. Теперь я пытаюсь вызвать потребителя, который слушает порт хоста 9092 для использования Сообщения. Я пытаюсь настроить потребительский контейнер после того, как все брокеры будут использовать docker compose.

Я получаю ошибку, когда пытаюсь вызвать потребителя, порт 9092 уже выделен

Пожалуйста, помогите мне понять, верен ли мой подход. Если это правильно, что я могу сделать, чтобы решить эту проблему


person Darshu Bc    schedule 10.04.2019    source источник
comment
Если кто-то подключается к порту хоста 9092, в какой контейнер вы хотите сопоставить этот запрос? Пожалуйста, включите любые файлы compose или команды запуска докера, которые вы используете.   -  person BMitch    schedule 10.04.2019
comment
Вы сказали, что сопоставляете порт хоста 9092 с портом контейнера 9092. Если вы уже это сделали, то, конечно, порт 9092 уже выделен. Вы не сможете вызвать другой контейнер (или любой другой процесс), привязанный к этому порту.   -  person larsks    schedule 10.04.2019
comment
Есть ли причина, по которой вы не позволяете случайному выбору порта хоста для предотвращения коллизии?   -  person Michael    schedule 11.04.2019


Ответы (1)


KAFKA_ADVERTISED_LISTENERS необходимо указать как переменную среды с localhost:<port>.

По умолчанию прослушиватель Kafka будет прослушивать порт 9092, и когда производитель / потребитель подключается к брокеру, он будет анонсировать список брокеров как часть запроса метаданных с host:9092.

Здесь вы запускаете его в Docker, поэтому хост в списке метаданных брокера будет доступен только в сети Docker.

Чтобы это работало, нам нужно заставить брокера Kafka прослушивать другой порт, добавить его в advertised.listeners, а также добавить сопоставление портов для нового порта.

ports:
- "29092:29092"
environment: 
- KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
- KAFKA_LISTENERS=INTERNAL://0.0.0.0:9092,EXTERNAL://0.0.0.0:29092
- KAFKA_ADVERTISED_LISTENERS=EXTERNAL://localhost:29092,INTERNAL://kafka0:9092
- KAFKA_INTER_BROKER_LISTENER_NAME=INTERNAL
- KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
person A developer    schedule 11.04.2019
comment
См. Также rmoff.net/2018/08/02/kafka-listeners-explained для дальнейших объяснений. - person Robin Moffatt; 11.04.2019