Docker化Java应用无法连接Kafka容器问题求助
问题描述
我正尝试在Windows和Ubuntu环境中部署Docker化服务,但遇到Java应用无法连接Docker容器内Kafka Broker的问题。我的docker-compose.yml配置如下:
services: zookeeper: image: confluentinc/cp-zookeeper:latest container_name: zookeeper environment: ZOOKEEPER_CLIENT_PORT: 2181 ZOOKEEPER_TICK_TIME: 2000 ports: - "2181:2181" networks: - kafka-network kafka: image: confluentinc/cp-kafka:latest container_name: kafka environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 ports: - "9092:9092" depends_on: - zookeeper networks: - kafka-network volumes: - kafka-data:/var/lib/kafka/data # New volume for Kafka data - kafka-streams-state:/var/lib/kafka/streams # New volume for Kafka Streams state job-jays-api: build: context: ../ dockerfile: Dockerfile container_name: job-jays-api ports: - "8080:8080" networks: - kafka-network applicant-job-matcher: build: context: ../applicant_job_matcher dockerfile: Dockerfile container_name: applicant-job-matcher depends_on: - job-jays-api networks: - kafka-network preference-updater: build: context: ../preference_updater dockerfile: Dockerfile container_name: preference-updater depends_on: - job-jays-api networks: - kafka-network notification-sender: build: context: ../notification_sender dockerfile: Dockerfile container_name: notification-sender depends_on: - job-jays-api networks: - kafka-network networks: kafka-network: driver: bridge volumes: kafka-data: kafka-streams-state:
我已尝试将bootstrap server设置为kafka、localhost、机器IP,但均无效。此前在Ubuntu系统直接安装Kafka,且Spring Boot应用非容器化时可正常连接。
解决方案
先修正docker-compose.yml语法问题
原配置存在两处语法错误,会导致Docker解析失败:
- 所有
build块的子项未缩进,YAML要求子元素必须缩进一级 - 端口映射使用了中文引号
“”,需替换为英文引号""
核心问题:Kafka监听地址配置错误
当前Kafka仅配置了容器内部可访问的地址,无法同时满足容器内、宿主机外部客户端的连接需求,需调整监听配置:
修改Kafka服务的环境变量
更新docker-compose.yml中kafka服务的environment和ports部分:
kafka: image: confluentinc/cp-kafka:latest container_name: kafka environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 # 配置双监听:容器内部用9092,外部用9093 KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,PLAINTEXT_HOST://0.0.0.0:9093 # 告知不同客户端对应的连接地址 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://${HOST_IP}:9093 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 ports: - "9092:9092" - "9093:9093" # 新增外部访问端口 depends_on: - zookeeper networks: - kafka-network volumes: - kafka-data:/var/lib/kafka/data - kafka-streams-state:/var/lib/kafka/streams
配置说明与使用
- 设置HOST_IP环境变量:
- Windows(PowerShell):
$env:HOST_IP="你的机器IP" - Ubuntu:
export HOST_IP="你的机器IP"
- Windows(PowerShell):
- 客户端bootstrap server配置:
- 容器内的Java应用(如job-jays-api等服务):设置为
kafka:9092 - 宿主机上的非容器化Java应用:设置为
你的机器IP:9093
- 容器内的Java应用(如job-jays-api等服务):设置为
- 重启服务:执行
docker-compose down && docker-compose up -d
额外注意事项
- 确保防火墙开放9093端口,避免外部访问被拦截
- 容器内应用无需依赖9093端口,通过kafka-network网络直接访问9092即可
内容的提问来源于stack exchange,提问作者Murad Azimzada
相关产品推荐
相关产品推荐

