如何让Docker内部及外部均可访问Bitnami Kafka容器?
Kafka Docker 跨环境连接问题解决
当前 docker-compose.yml 配置
version: "3" services: kafka: image: 'bitnami/kafka:latest' ports: - '9092:9092' environment: - KAFKA_ENABLE_KRAFT=yes - KAFKA_CFG_BROKER_ID=1 - KAFKA_CFG_PROCESS_ROLES=broker,controller - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT:/:9092 - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@:9093 - ALLOW_PLAINTEXT_LISTENER=yes
问题现象
- Docker内部其他容器通过
kafka:9092可正常连接Kafka服务 - 本地主机用
telnet localhost 9092能建立连接,但本地运行的Kafka消费者用localhost:9092连接时,抛出错误:java.net.UnknownHostException: 1ffc30995c50: nodename nor servname provided, or not known(其中1ffc30995c50是Kafka容器的ID/主机名)
解决方案:配置多监听器适配不同客户端
Kafka支持通过多监听器配置,实现对Docker内部和本地外部客户端返回不同的连接地址,具体修改docker-compose.yml如下:
version: "3" services: kafka: image: 'bitnami/kafka:latest' ports: - '9092:9092' - '9094:9094' # 新增外部访问端口映射 environment: - KAFKA_ENABLE_KRAFT=yes - KAFKA_CFG_BROKER_ID=1 - KAFKA_CFG_PROCESS_ROLES=broker,controller - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER # 配置三个监听器:内部容器用PLAINTEXT,本地外部用PLAINTEXT_HOST,控制器用CONTROLLER - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,PLAINTEXT_HOST://:9094,CONTROLLER://:9093 # 映射各监听器的安全协议 - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT # 公告地址分别对应两种客户端:内部用服务名kafka,外部用localhost - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:9094 # 修正控制器集群地址为服务名,避免容器ID变化导致问题 - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka:9093 - ALLOW_PLAINTEXT_LISTENER=yes
配置说明与使用方式
- 配置要点:新增
PLAINTEXT_HOST监听器专门处理本地外部请求,通过ADVERTISED_LISTENERS分别为两种客户端返回对应的可访问地址,同时将控制器地址改为容器服务名,避免容器重启后ID变更引发的解析问题。 - 使用方式:
- Docker内部其他容器:继续使用
kafka:9092连接Kafka - 本地主机的Kafka消费者:改用
localhost:9094连接
- Docker内部其他容器:继续使用
内容的提问来源于stack exchange,提问作者kev
相关产品推荐
相关产品推荐

