657 字
3 分钟
Kafka单机Docker部署踩坑与解决方法

Kafka 单机 Docker 部署#

简介#

Kafka 是一个高吞吐量的分布式发布-订阅消息系统,常用于构建实时数据管道和流处理应用。本部署指南将介绍如何使用 Docker 在单机上部署 Kafka,采用 KRaft 模式(无 Zookeeper)。

踩坑#

  • 官方 Bitnami Kafka 镜像默认采用 Zookeeper 模式,不支持 KRaft 模式。因此,我们需要使用旧版镜像bitnamilegacy/kafka:4.0.0,该镜像支持 KRaft 模式。
  • 使用类似 1panel 等容器管理工具特别是在他的应用商店直接搜然后下载那个 kafka 的应用然后部署的时候就会出现:使用正常的客户端在同一局域网下尝试连接时,是正常连接的,但是一旦尝试创建主题或者看别的信息的时候就会显示KafkaJSConnectionError: Connection error: getaddrinfo ENOTFOUND 1Panel-kafka-NOai这种类型的错误。

错误的 docker-compose 配置#

networks:
1panel-network:
external: true
services:
kafka:
container_name: ${CONTAINER_NAME}
deploy:
resources:
limits:
cpus: ${CPUS}
memory: ${MEMORY_LIMIT}
environment:
ALLOW_PLAINTEXT_LISTENER: "yes"
KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://${CONTAINER_NAME}:${PANEL_APP_PORT_HTTP}
KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 0@127.0.0.1:9093
KAFKA_CFG_FETCH_MESSAGE_MAX_BYTES: 524288000
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
KAFKA_CFG_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093
KAFKA_CFG_LOG_RETENTION_MS: 60000
KAFKA_CFG_MAX_REQUEST_SIZE: 524288000
KAFKA_CFG_MESSAGE_MAX_BYTES: 524288000
KAFKA_CFG_NODE_ID: 0
KAFKA_CFG_PARTITION_FETCH_BYTES: 524288000
KAFKA_CFG_PROCESS_ROLES: controller,broker
KAFKA_CFG_REPLICA_FETCH_MAX_BYTES: 524288000
KAFKA_HEAP_OPTS: -Xmx512m -Xms256m
image: bitnamilegacy/kafka:4.0.0
labels:
createdBy: Apps
networks:
- 1panel-network
ports: #怀疑是这里映射不对,暂时没有深究。
- ${HOST_IP}:${PANEL_APP_PORT_HTTP}:9092
restart: always

这个错误非常典型:#

KafkaJSConnectionError: Connection error: getaddrinfo ENOTFOUND 1Panel-kafka-NOai

意思是: Kafka 客户端无法解析主机名 1Panel-kafka-NOai,即 DNS 解析失败。

问题来源#

docker-compose 配置里定义了:

KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://${CONTAINER_NAME}:${PANEL_APP_PORT_HTTP}

这行会告诉 Kafka: “我自己是 ${CONTAINER_NAME} 这个主机名。” Kafka 客户端(KafkaJS)在连接时会去解析这个主机名。如果这个主机名不是容器网络里可以解析的名字,就会报: getaddrinfo ENOTFOUND 1Panel-kafka-NOai

原因总结#

可能原因说明
${CONTAINER_NAME} 在 Kafka 客户端容器或主机上无法解析例如 1Panel-kafka-NOai 不是一个实际的主机名
❌ Kafka 容器的 advertised.listeners 没有配置成可访问的主机名/IP客户端拿到的地址无法访问
❌ 网络 1panel-network 没有连接 Kafka 客户端容器导致容器之间无法通过服务名互相访问

-正确部署的 docker-compose 配置-#

version: "3.8"
services:
kafka:
image: bitnamilegacy/kafka:4.0.0 # 官方Bitnami旧版镜像,支持KRaft
container_name: kafka
restart: always
environment:
# 启用KRaft模式(无Zookeeper)
KAFKA_CFG_PROCESS_ROLES: broker,controller
KAFKA_CFG_NODE_ID: 0
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 0@localhost:9093
KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER
# Kafka监听配置:内部、外部访问
KAFKA_CFG_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093
# advertised.listeners 告诉客户端用哪个地址访问(改成你的机器IP)
KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://192.168.1.166:9092
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
ALLOW_PLAINTEXT_LISTENER: "yes"
# 资源与性能参数(可选)
KAFKA_HEAP_OPTS: "-Xmx512m -Xms256m"
KAFKA_CFG_LOG_RETENTION_HOURS: 24
KAFKA_CFG_MESSAGE_MAX_BYTES: 524288000
KAFKA_CFG_REPLICA_FETCH_MAX_BYTES: 524288000
KAFKA_CFG_FETCH_MESSAGE_MAX_BYTES: 524288000
KAFKA_CFG_MAX_REQUEST_SIZE: 524288000
ports:
- "9092:9092" # 外部访问Kafka
- "9093:9093" # 控制器端口(一般内部使用)
networks:
- kafka-net
networks:
kafka-net:
driver: bridge
Kafka单机Docker部署踩坑与解决方法
https://mizuki.mysqil.com/posts/运维和部署/kafka单机docker部署/
作者
Laoli
发布于
2025-10-17
许可协议
CC BY-NC-SA 4.0
封面
示例歌曲
示例艺术家
封面
示例歌曲
示例艺术家
0:00 / 0:00