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

Docker化Kafka跨容器消费无消息问题排查及解决方法

同一主机Docker容器间Kafka生产者与消费者通信问题

问题背景

我正尝试让同一主机上不同Docker容器中的Kafka生产者与消费者实现通信,目前两者都运行在本地开发机器上,最终目标是让Docker化的消费者运行在远程服务器上。

现在的问题是:当消费者运行在独立容器中时,无法接收到任何消息。我期望容器化的消费者能够接收并打印来自生产者的消息。

已验证情况

  • 与生产者同容器的消费者可以接收消息
  • 主机上非容器化的消费者也能接收消息
  • 尝试将两个容器置于同一Docker网络中,但仍无消息接收

Docker化消费者能正常创建并运行,但没有任何消息输出,处于静默状态。

相关配置

生产者及关联服务Docker Compose配置

kafka:
  image: quay.io/debezium/kafka:2.3
  ports:
    - 9092:9092
  environment:
    NODE_ID: 1
    ZOOKEEPER_CONNECT: zookeeper:2181
    KAFKA_LISTENERS: INTERNAL://:29092,EXTERNAL://:9092
    KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka:29092,EXTERNAL://localhost:9092
    KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
    KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
zookeeper:
  image: quay.io/debezium/zookeeper:2.3
  ports:
    - 2181:2181
    - 2888:2888
    - 3888:3888
apicurio:
  image: apicurio/apicurio-registry-mem:2.4.1.Final
  ports:
    - 8080:8080
connect:
  image: quay.io/debezium/connect:2.3
  ports:
    - 8083:8083
  environment:
    BOOTSTRAP_SERVERS: kafka:29092
    GROUP_ID: 1
    CONFIG_STORAGE_TOPIC: my_connect_configs
    OFFSET_STORAGE_TOPIC: my_connect_offsets
    STATUS_STORAGE_TOPIC: my_connect_statuses
    ENABLE_APICURIO_CONVERTERS: true
  links:
    - cdm-db
    - kafka
    - apicurio
  depends_on:
    - cdm-db
    - kafka
cdm-db:
  image: debezium/postgres:13-alpine
  ports:
    - 5433:5432
  volumes:
    - dev-db-data:/var/lib/postgresql/data
  environment:
    POSTGRES_DB: ${DB_NAME}
    POSTGRES_USER: user
    POSTGRES_PASSWORD: password

消费者应用Docker Compose配置

app:
  build:
    context: .
    dockerfile: docker/Dockerfile
  entrypoint: ["sh", "-c", "python -u manage.py runserver 0.0.0.0:8000"]
  volumes:
    - ./static:/srv/static
    - ./media:/srv/media
    - ./app:/srv/app
    - ./import/:/srv/import
  ports:
    - "127.0.0.1:${APP_PORT}:8000"
  extra_hosts:
    - "host.docker.internal:host-gateway"
  depends_on:
    - db
  links:
    - db
    - mq
    - redis
  environment:
    PYTHONUNBUFFERED: 1
  restart: always

消费者进程代码

from kafka.consumer import KafkaConsumer

#BOOTSTRAP_SERVERS="kafka:29092"    <----该配置在消费者与生产者同容器时生效
#BOOTSTRAP_SERVERS="localhost:9092" <----该配置在主机上非容器化消费者时生效
BOOTSTRAP_SERVERS="host.docker.internal:9092" <----该配置用于主机上独立容器的消费者,但创建后无输出

def main():
    print("Starting consumer", BOOTSTRAP_SERVERS)

    try:
        consumer = KafkaConsumer(
            bootstrap_servers=[BOOTSTRAP_SERVERS],
            )
    except Exception as error:
       print("Error creating KafkaConsumer", type(error).__name__, "-", error)
       return -1

    print("consumer created.")
    print(consumer.config)

    consumer.subscribe("dbserver1.public.geography_country")
    try:
        for msg in consumer:
            print("consuming")
            print(msg)
    except Exception as error:
        print("Error consuming", type(error).__name__, "-", error)

    print("done")

if __name__ == "__main__":
    main()

问题解决方法

通过修改Kafka服务的Docker Compose配置解决了问题:

原配置:

KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka:29092,EXTERNAL://localhost:9092 

修改为:

KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka:29092,EXTERNAL://host.docker.internal:9092

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 13:08:12