Docker容器内Spring应用连接Kafka失败:无法建立节点连接
问题:Docker容器中Spring应用无法连接Kafka Topic
我尝试在Docker容器中运行Spring应用,希望应用能与Kafka Topic通信,但执行时出现错误:
Connection to node 1001 (localhost/127.0.0.1:9092) could not be established. Broker may not be available.
请问我哪里配置出错了?
相关配置信息
Dockerfile
FROM openjdk:11-jre-slim #WORKDIR /usr/local/java SHELL ["bash", "-c"] ADD target/integration-service-exec.jar app.jar ADD entrypoint.sh entrypoint.sh RUN chmod +x /entrypoint.sh RUN touch /app.jar # Install prerequisites RUN apt-get update && apt-get install -y curl jq wget RUN wget -O dd-java-agent.jar 'https://search.maven.org/classic/remote_content?g=com.datadoghq&a=dd-java-agent&v=0.103.0' EXPOSE 8080 ENTRYPOINT ["/entrypoint.sh"]
docker-compose.yml
version: '3.8' services: zookeeper: image: wurstmeister/zookeeper container_name: integration-service.zookeeper ports: - "2181:2181" environment: ZOOKEEPER_CLIENT_PORT: 2181 ZOOKEEPER_TICK_TIME: 2000 kafka: image: wurstmeister/kafka container_name: integration-service.kafka ports: - "9092:9092" - "9094:9094" depends_on: - zookeeper environment: KAFKA_ZOOKEEPER_CONNECT: integration-service.zookeeper:2181 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 KAFKA_LISTENERS: INTERNAL://0.0.0.0:9094,OUTSIDE://0.0.0.0:9092 KAFKA_ADVERTISED_LISTENERS: INTERNAL://integration-service.kafka:9094,OUTSIDE://localhost:9092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,OUTSIDE:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL redis: image: bitnami/redis:latest ports: - 6379:6379 environment: - ALLOW_EMPTY_PASSWORD=yes application: container_name: app build: context: . dockerfile: Dockerfile depends_on: - kafka - redis
Spring Boot配置文件application.yml
spring.cloud.stream: binders: kafkasip: type: kafka environment: spring.cloud.stream.kafka.binder: autoCreateTopics: true autoAddPartitions: true healthTimeout: 10 requiredAcks: 1 minPartitionCount: 1 replicationFactor: 1 configuration: auto.offset.reset: earliest headerMapperBeanName: customHeaderMapper brokers: 0.0.0.0:9094 # tried also with :localhost:9092 but same error....
问题分析与解决
核心问题是Spring应用容器内的Kafka连接地址配置错误:
- 在Docker Compose网络中,容器之间通过服务名/容器名通信,
localhost在容器内指向自身而非宿主机,0.0.0.0是监听地址而非可连接的目标地址,这两个都无法正确指向Kafka容器。 - 你的Kafka容器名是
integration-service.kafka,内部监听端口是9094(对应INTERNALlistener),这才是Spring应用在Docker网络中应该使用的连接地址。
修改步骤
修改application.yml中的brokers配置,将其改为:
brokers: integration-service.kafka:9094
额外注意事项
depends_on仅保证容器启动顺序,不确保Kafka服务完全就绪。如果仍有连接问题,可以在应用启动脚本中添加等待逻辑,比如通过nc命令检查Kafka端口是否可用后再启动应用。
内容的提问来源于stack exchange,提问作者user1671106
相关产品推荐
相关产品推荐

