You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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解析失败:

  1. 所有build块的子项未缩进,YAML要求子元素必须缩进一级
  2. 端口映射使用了中文引号“”,需替换为英文引号""

核心问题: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

配置说明与使用

  1. 设置HOST_IP环境变量:
    • Windows(PowerShell):$env:HOST_IP="你的机器IP"
    • Ubuntu:export HOST_IP="你的机器IP"
  2. 客户端bootstrap server配置:
    • 容器内的Java应用(如job-jays-api等服务):设置为kafka:9092
    • 宿主机上的非容器化Java应用:设置为你的机器IP:9093
  3. 重启服务:执行docker-compose down && docker-compose up -d

额外注意事项

  • 确保防火墙开放9093端口,避免外部访问被拦截
  • 容器内应用无需依赖9093端口,通过kafka-network网络直接访问9092即可

内容的提问来源于stack exchange,提问作者Murad Azimzada

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 04:02:10