У мяне ёсць Swarm на аснове Docker Compose са службай Zookeeper, якая запускаецца нармальна, але служба Kafka не можа запусціцца.
Ён працягвае выкарыстоўваць уласцівасць па змаўчанні KAFKA_ADVERTISED_LISTENERS
:
debezium_kafka.1.5hhrqfp5kqts@stephane-pc | Using ZOOKEEPER_CONNECT=zookeeper:2181
debezium_kafka.1.5hhrqfp5kqts@stephane-pc | Using KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://10.0.83.239:9092
І, вядома, ён не можа знайсці слухачоў, указаных на карце:
debezium_kafka.1.5hhrqfp5kqts@stephane-pc | java.lang.IllegalArgumentException: requirement failed: inter.broker.listener.name must be a listener name defined in advertised.listeners. The valid options based on currently configured listeners are PLAINTEXT
Мой файл docker-compose-dev.yml
змяшчае:
kafka:
image: debezium/kafka:1.2
deploy:
mode: global
ports:
- "9094:9094"
- "9095:9095"
networks:
common:
volumes:
- "~/dev/docker/projects/debezium/volumes/kafka/data:/kafka/data"
- "~/dev/docker/projects/debezium/volumes/kafka/logs:/kafka/logs"
environment:
ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENERS: FROM_DOCKER_NETWORK://kafka:9092,FROM_HOST://kafka:9094
KAFKA_ADVERTISED_LISTENERS: FROM_DOCKER_NETWORK://kafka:9092,FROM_HOST://localhost:9094
KAFKA_ALLOW_PLAINTEXT_LISTENER: "yes"
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,FROM_DOCKER_NETWORK:PLAINTEXT,FROM_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: FROM_DOCKER_NETWORK
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
Я что-то делал неправильно, указав жестко закодированное имя хоста в свойстве KAFKA_LISTENERS
:
KAFKA_LISTENERS: FROM_DOCKER_NETWORK://kafka:9092,FROM_HOST://kafka:9094
После замены имени хоста kafka
на IP-адрес 0.0.0.0
, как в:
KAFKA_LISTENERS: FROM_DOCKER_NETWORK://0.0.0.0:9092,FROM_HOST://0.0.0.0:9094
проблема исчезла, и служба Kafka запустилась.
Обратите внимание, что объявленные прослушиватели сохраняют имя контейнера для доступа к службе Kafka из другого контейнера и имя localhost
для доступа к службе Kafka с хоста Docker:
KAFKA_ADVERTISED_LISTENERS: FROM_DOCKER_NETWORK://kafka:9092,FROM_HOST://localhost:9094
Как объяснено в это руководство значение 0.0.0.0
означает, что прослушиватель прослушивает все интерфейсы. И это руководство говорит о том же.