Quiero usar confluent/kafka y confluent/zookeeper y ejecutarlos en un solo servidor Ubuntu.
Estoy usando las siguientes configuraciones:
docker run -e ZOOKEEPER_CLIENT_PORT=2181 --name zookeeper confluent/zookeeper
docker run --name kafka -e KAFKA_ADVERTISED_HOST_NAME=kafka -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 -e KAFKA_CREATE_TOPICS=testtopic:1:1 confluent/kafka
Sin embargo, esto da como resultado: No se puede conectar con zookeeper: 2181
Tengo otros contenedores a los que me gustaría conectarme, ¿cómo puedo acceder a zookeeper a través de zookeeper:2181 y kafka a través de kafka:9092?
Hay varias maneras de hacer esto. Pero antes de analizarlo, hay dos problemas en su enfoque que debe comprender.
zookeper cuando usa docker run ya que cada uno de los contenedores se ejecuta en un aislamiento de red diferentekafka puede iniciarse e intentar conectarse a zookeeper pero zookeeper aún no está listoPuedes hacer muchas cosas para arreglar las cosas.
use --net=host para ejecutar ambos en la red host
use docker network create <name> y luego use --net=<name> mientras lanza ambos contenedores
O puede ejecutar su contenedor kafka en la red de contenedores zookeeper .
use --net=container:zookeeper cuando inicie el contenedor kafka . Esto asegurará que el anfitrión del zookeeper del zoológico sea accesible. Esto no se recomienda como tal, a menos que tenga una razón de peso para hacerlo. Porque tan pronto como el contenedor zookeeper se caiga, también lo hará la red de su contenedor kafka . Pero para que se entienda, he puesto esta opción aquí.
O puede mantener un espacio entre el inicio de zookeeper y kafka , para asegurarse de que cuando kafka inicie zookeeper esté en funcionamiento
Otra opción es usar --restart=on-failure flag con docker run. Esto asegurará que el contenedor se reinicie en caso de falla e intentará volver a conectarse a zookeeper y, con suerte, ese tiempo se zookeeper .
En lugar de usar docker run , siempre preferiría docker-compose para ejecutar dichos contenedores vinculados. Puede hacerlo creando un archivo docker-compose.yml simple y luego ejecutándolo con docker-compsoe up
version: "3.4" services: zookeeper: image: confluent/zookeeper environment: - ZOOKEEPER_CLIENT_PORT=2181 kafka: image: confluent/kafka environment: - KAFKA_ADVERTISED_HOST_NAME=kafka - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 - KAFKA_CREATE_TOPICS=testtopic:1:1 depends_on: - zookeeper restart: on-failureSin embargo, estoy ejecutando en Mac, esto funciona bien. Dado que la red 'host' no funciona en mac, solo creo una red llamada kafka_net y coloco los contenedores allí.
version: "3.4" services: zookeeper: image: confluent/zookeeper environment: - ZOOKEEPER_CLIENT_PORT=2181 networks: - kafka_net kafka: image: confluent/kafka environment: - KAFKA_ADVERTISED_HOST_NAME=kafka - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 depends_on: - zookeeper networks: - kafka_net restart: on-failure networks: kafka_net: driver: "bridge"Para asegurarse de que todo funcione:
Inicie sesión en el contenedor del cuidador del zoológico y luego
zookeeper-shell localhost:2181 => You should see something like 'Welcome to ZooKeeper!' after all the big chunk of textInicie sesión en el contenedor kafka y luego
kafka-topics --zookeeper zookeeper:2181 --list # empty list kafka-topics --zookeeper zookeeper:2181 --create --topic first_topic --replication-factor 1 --partitions 1 kafka-topics --zookeeper zookeeper:2181 --list # you will see the first_topic kafka-console-producer --broker-list localhost:9092 --topic first_topic # type some text and ctrl + c kafka-console-consumer --bootstrap-server localhost:9092 --zookeeper zookeeper:2181 --topic first_topic --from-beginning # you will see the stuff you typed first_topicSi sigue dando problemas, eche un vistazo a los ejemplos oficiales. https://github.com/confluentinc/cp-docker-images/tree/5.2.2-post/examples y aún dando problemas para publicarlo, le dará una mano.
Docker inicia contenedores en una red aislada, llamada default bridge menos que especifique la red explícitamente.
Puede tener éxito de diferentes maneras, aquí hay 2 más fáciles:
Coloque contenedores en la misma red puente definida por el usuario
# create net docker network create foo docker run --network=foo -e ZOOKEEPER_CLIENT_PORT=2181 --name zookeeper confluent/zookeeper docker run --network=foo --name kafka -e KAFKA_ADVERTISED_HOST_NAME=kafka -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 -e KAFKA_CREATE_TOPICS=testtopic:1:1 confluent/kafkaExponga los puertos y conéctese a través de localhost
docker run -p 2181:2181 -e ZOOKEEPER_CLIENT_PORT=2181 --name zookeeper confluent/zookeeper docker run --name kafka -e KAFKA_ADVERTISED_HOST_NAME=kafka -e KAFKA_ZOOKEEPER_CONNECT=host.docker.internal:2181 -e KAFKA_CREATE_TOPICS=testtopic:1:1 confluent/kafka Nota: en el segundo enfoque, debe usar host.docker.internal como nombre de host y exponer (publicar) el puerto 2181 para el primer contenedor para que esté disponible en localhost