Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

399
Vistas
Docker/Kafka conectan dos contenedores diferentes

Estoy usando el proyecto docker-kafka de wurstmeister para ejecutar kafka/zookeeper en un contenedor. Compongo los contenedores usando localhost como la variable KAFKA_ADVERTISED_HOST_NAME: localhost .

He escrito una aplicación Java que usa flink para conectarse y consumir uno de los temas de este contenedor de Kafka. Si exporto un jar ejecutable y lo ejecuto desde mi máquina, funciona absolutamente bien. Cuando creo la siguiente imagen para ejecutar el archivo jar desde otro contenedor acoplable, recibo una excepción (aproximadamente 30 segundos después de la ejecución) Exception in thread "main" org.apache.flink.runtime.client.JobExecutionException: org.apache.kafka.common.errors.TimeoutException: Timeout expired while fetching topic metadata , lo que creo que tiene que ver con que mi programa Java no pueda comunicarse con el servidor Kafka que se ejecuta en el otro contenedor.

Aquí está el dockerfile de mi aplicación Java:

 # Dockerfile FROM anapsix/alpine-java MAINTAINER myself myself COPY myApp.jar /home/myApp.jar CMD ["java","-jar","/home/myApp.jar"]

Y aquí está el docker-compose.yml para docker kafka de wurstmeister:

 version: "3.5" networks: myNetwork: name: myNetwork driver: bridge services: zookeeper: image: wurstmeister/zookeeper ports: - "2181:2181" networks: - myNetwork kafka: build: . ports: - "9092:9092" environment: KAFKA_ADVERTISED_HOST_NAME: localhost KAFKA_ADVERTISED_PORT: "9092" KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true" ALLOW_PLAINTEXT_LISTENER: "yes" volumes: - /var/run/docker.sock:/var/run/docker.sock networks: - myNetwork auth_analytics: build: context: . dockerfile: auth_dockerfile depends_on: - kafka networks: - myNetwork

He probado varias versiones de lo anterior. Inicialmente no configuré ninguna red y pensé que podría ser el problema, sin embargo, lo anterior que crea una red no hace ninguna diferencia. Probé "localhost:9092" como servidor de arranque en mi aplicación Java y "myNetwork:9092" mientras leía en línea.

También leí estas preguntas frecuentes de wurstmeister sobre la conectividad, pero no veo ningún problema con mi configuración.

También intenté ejecutar la imagen de mi aplicación Java sin usar docker-compose (ejecuté docker-compose para iniciar zookeeper/kafka y luego hice una compilación de docker, ejecuté docker en la imagen para mi aplicación Java. Esto no hizo ninguna diferencia .)

Estoy atascado. ¿Qué estoy haciendo mal?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Debe configurar KAFKA_ADVERTISED_LISTENERS correctamente. Por el momento, es localhost , lo que significa que el agente le informará a cualquier cliente que se conecte que el agente está en localhost , y cuando el cliente intente conectarse a eso, fallará (a menos que el agente Kafka esté realmente disponible en localhost , lo cual no estará en un contenedor Docker solo ejecutando su aplicación).

La solución es definir oyentes de modo que puedan ser abordados desde cualquier ubicación de corredor y cliente que lo necesite. Mi enfoque preferido es este , donde tiene uno para la comunicación dentro del contenedor y otro para la comunicación desde el host:

 KAFKA_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092

Sus clientes en la red Docker usan kafka:29092 para conectarse; los clientes en la máquina host se conectan en localhost: 9092 (y asegúrese de exponer 9092 a través de Docker a la máquina host).

Para comprender más sobre esto, consulte https://rmoff.net/2018/08/02/kafka-listeners-explained/

Por cierto, recomendaría encarecidamente arreglar esto de la manera adecuada; anular el /etc/hosts es un truco que no aborda el problema real de la OMI.

over 4 years ago · Santiago Trujillo Denunciar

0

KAFKA_ADVERTISED_HOST_NAME: localhost

es lo que su cliente recibirá como cadena de conexión a Kafka. Significa que el contenedor con su aplicación intentará llegar a Kafka en localhost donde localhost es la pila de red local para el contenedor con su aplicación.

Para resolver ese problema, debe usar kafka host como su KAFKA_ADVERTISED_HOST_NAME y servidores de arranque, lo que permitirá que su contenedor se conecte a kafka dentro de los acopladores, pero romperá la configuración cuando intente conectarse a Kafka ejecutando en su PC java -jar...

Para solucionar ese problema, haga una entrada en su archivo de hosts en su PC con mapeo kafka -> localhost.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda