无法通过Kafka-UI连接本地Kafka集群的问题求助
问题描述
我通过以下命令在本地启动Kafka容器:
$ docker run -p 9092:9092 apache/kafka:3.7.1 $ docker exec -it gifted_wright /bin/bash e8bebba64b30:/$ cd /opt/kafka/bin e8bebba64b30:/opt/kafka/bin$ sh kafka-topics.sh --bootstrap-server localhost:9092 --create --topic my-first-topic --partitions 1 --replication-factor 1 Created topic my-first-topic. e8bebba64b30:/opt/kafka/bin$ sh kafka-topics.sh --bootstrap-server localhost:9092 --list my-first-topic
随后可通过IntelliJ Idea的Kafka插件正常连接该集群。
接着通过以下命令启动Kafka-UI:
$ docker run -it -p 8080:8080 -e DYNAMIC_CONFIG_ENABLED=true ghcr.io/kafbat/kafka-ui
当仅配置bootstrap servers为localhost:9092创建集群时,出现如下错误:
9:44:45,536 INFO [kafka-admin-client-thread | kafbat-ui-admin-1721382278-2] o.a.k.c.NetworkClient: [AdminClient clientId=kafbat-ui-admin-1721382278-2] Node -1 disconnected. 2024-07-19 09:44:45,537 WARN [kafka-admin-client-thread | kafbat-ui-admin-1721382278-2] o.a.k.c.NetworkClient: [AdminClient clientId=kafbat-ui-admin-1721382278-2] Connection to node -1 (localhost/127.0.0.1:9092) could not be established. Broker may not be available.
之后尝试创建端口转发,却出现“名称无法解析”的问题:
$ docker exec -it --user=root nice_wright /bin/sh / # apk add socat fetch https://dl-cdn.alpinelinux.org/alpine/v3.19/main/x86_64/APKINDEX.tar.gz fetch https://dl-cdn.alpinelinux.org/alpine/v3.19/community/x86_64/APKINDEX.tar.gz (1/4) Installing ncurses-terminfo-base (6.4_p20231125-r0) (2/4) Installing libncursesw (6.4_p20231125-r0) (3/4) Installing readline (8.2.1-r2) (4/4) Installing socat (1.8.0.0-r0) Executing busybox-1.36.1-r15.trigger OK: 191 MiB in 26 packages / # socat tcp-listen:9092,fork tcp:host.docker.internal:9092
在UI中点击验证时得到如下错误:
2024/07/19 09:42:59 socat[94] E getaddrinfo("host.docker.internal", "9092", {0x20,0,1,6}, {}): Name does not resolve
请问该如何实现Kafka-UI与Kafka的连接?是否遗漏了关键配置?
解决方案
方法一:使用Docker共享网络(推荐)
这是最稳定的容器间通信方式,无需依赖主机IP。
- 创建自定义Docker网络
docker network create kafka-network
- 重新启动Kafka容器,加入该网络并配置核心参数
docker run -d --name kafka --network kafka-network -p 9092:9092 \ -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:9092 \ -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092,PLAINTEXT_HOST://0.0.0.0:9093 \ -e KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT \ apache/kafka:3.7.1
关键参数说明:
KAFKA_ADVERTISED_LISTENERS:Kafka对外公布的地址,容器内服务用kafka:9092访问,本地主机用localhost:9092访问KAFKA_LISTENERS:Kafka监听的端口,0.0.0.0允许所有IP接入KAFKA_LISTENER_SECURITY_PROTOCOL_MAP:对应监听地址的安全协议类型
- 启动Kafka-UI容器,加入同一个网络
docker run -d --name kafka-ui --network kafka-network -p 8080:8080 \ -e DYNAMIC_CONFIG_ENABLED=true \ ghcr.io/kafbat/kafka-ui
- 在Kafka-UI中配置bootstrap servers为
kafka:9092,即可连接成功。
方法二:直接映射主机IP
适合不想创建自定义网络的场景,需替换命令中的主机IP为你实际的本地IP(如192.168.1.100)。
- 重启Kafka容器,配置对外公布的地址
docker run -d --name kafka -p 9092:9092 \ -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092,PLAINTEXT_HOST://192.168.1.100:9092 \ -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \ apache/kafka:3.7.1
- 启动Kafka-UI容器时,手动映射
host.docker.internal域名
docker run -d --name kafka-ui -p 8080:8080 \ --add-host host.docker.internal:host-gateway \ -e DYNAMIC_CONFIG_ENABLED=true \ ghcr.io/kafbat/kafka-ui
- 在Kafka-UI中配置bootstrap servers为
host.docker.internal:9092,即可连接成功。
失败原因分析
- 直接用
localhost:9092时,Kafka-UI容器内的localhost指向容器自身,而非你的主机,因此无法连接Kafka容器 host.docker.internal无法解析是因为Linux原生Docker默认不支持该域名,需通过--add-host手动映射到主机网关
内容的提问来源于stack exchange,提问作者Klave
相关产品推荐
相关产品推荐

