配置docker-compose端口与主机名解决kafka-python连接Kafka报错问题
问题根因
app-python服务错误配置了端口映射:ports: - "9093:9093"属于冗余配置,python服务作为Kafka客户端仅需主动发起连接,不需要暴露、映射任何Kafka相关端口,该配置还会导致宿主机端口冲突。- Kafka服务同时配置了
KAFKA_ADVERTISED_HOST_NAME和KAFKA_ADVERTISED_LISTENERS,wurstmeister/kafka镜像会优先读取前者参数覆盖监听器配置,导致内部网络监听器不生效。 - 默认的
depends_on仅控制容器启动顺序,不会等待Kafka broker完全初始化完成就启动python容器,容易出现初始化阶段连接失败的问题。
修复步骤
1. 调整docker-compose.yml配置
删除冗余的端口配置、冲突的Kafka参数,增加服务健康检查保证启动顺序符合依赖要求,修改后完整配置如下:
version: '3' services: zookeeper: image: wurstmeister/zookeeper ports: - "2181:2181" healthcheck: test: ["CMD", "zkServer.sh", "status"] interval: 5s timeout: 5s retries: 3 kafka: image: wurstmeister/kafka ports: - "9092:9092" expose: - "9093" environment: KAFKA_CREATE_TOPICS: "client-pusher:1:1" KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka:9093,OUTSIDE://localhost:9092 KAFKA_LISTENERS: INSIDE://0.0.0.0:9093,OUTSIDE://0.0.0.0:9092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE volumes: - /var/run/docker.sock:/var/run/docker.sock depends_on: zookeeper: condition: service_healthy healthcheck: test: ["CMD-SHELL", "kafka-topics.sh --list --zookeeper zookeeper:2181 || exit 1"] interval: 5s timeout: 10s retries: 5 app-python: build: . depends_on: kafka: condition: service_healthy
2. 优化consumer.py连接配置
增加Kafka客户端重试参数,避免初始化阶段临时不可用导致的报错:
consumer = KafkaConsumer( 'client-pusher', bootstrap_servers=['kafka:9093'], auto_offset_reset='earliest', enable_auto_commit=True, group_id='my-group-id', value_deserializer=lambda x: json.loads(x.decode('utf-8')), # 新增重试相关配置 api_version_auto_timeout_ms=30000, retries=10 )
3. 重启服务验证
先清理历史残留容器和卷,避免旧配置影响:docker-compose down -v
重新构建启动服务:docker-compose up --build
内容的提问来源于stack exchange,提问作者John Kealy
相关产品推荐
相关产品推荐

