在 Ubuntu 服务器上用 Docker 部署 Kafka,选择
bitnami/kafka 镜像配合 KRaft 模式,无需 Zookeeper,单节点即可运行。本文梳理了从安装 Docker 到理解端口配置的完整流程。为什么选 bitnami/kafka#
与官方 apache/kafka 镜像相比,bitnami/kafka 的优势在于:
- 环境变量驱动:所有配置通过环境变量传入,无需手动编辑
server.properties - KRaft 原生支持:开箱即用,一条
docker compose up启动 - 轻量镜像:基于 Debian Slim,体积更小
1. 安装 Docker#
在 Ubuntu 终端依次执行:
# 更新并安装基础依赖
sudo apt update && sudo apt install -y ca-certificates curl gnupg
# 添加 Docker 官方 GPG 密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 添加 Docker 软件源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装 Docker Engine
sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 免 sudo 执行 docker(需重新登录生效)
sudo usermod -aG docker $USER
执行
usermod 后需要重新登录 SSH 或终端会话才能生效。2. 编写 Docker Compose 配置#
创建工作目录并编写 docker-compose.yml:
mkdir -p ~/kafka && cd ~/kafkaservices:
kafka:
image: apache/kafka:latest
container_name: kafka-kraft
ports:
- "9092:9092"
- "9094:9094"
environment:
# 角色定义:既是 Broker 也是 Controller
- KAFKA_NODE_ID=1
- KAFKA_PROCESS_ROLES=broker,controller
- KAFKA_CONTROLLER_QUORUM_VOTERS=1@localhost:9093
# 监听器配置
- KAFKA_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094
- KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,EXTERNAL://localhost:9094
- KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,EXTERNAL:PLAINTEXT
- KAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT
# 自动生成 Cluster ID (KRaft 模式必需)
- KAFKA_OFFLINE_IMAGE=true
# --- 关键修复:单节点必须设置为 1 ---
- KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1
- KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=1
- KAFKA_TRANSACTION_STATE_LOG_MIN_ISR=1
# -----------------------------------启动服务:
docker compose up -d3. 核心配置解读#
这配置创建了几个 Broker?#
答案:1 个
配置中的 PROCESS_ROLES=controller,broker 表示一个节点同时身兼两职:既负责元数据管理(代替了 Zookeeper),也负责消息的读写。这是 KRaft 模式下单节点的典型配置。
三个端口分别做什么?#
| 端口 | Listener 名称 | 用途 |
|---|---|---|
| 9092 | PLAINTEXT | 容器内部 / Docker 网络间通信 |
| 9093 | CONTROLLER | KRaft 控制面通信(本配置仅单节点,内部使用) |
| 9094 | EXTERNAL | 宿主机及外部客户端访问 |
ADVERTISED_LISTENERS 的作用#
Kafka 通过 ADVERTISED_LISTENERS 告诉客户端"你应该连哪个地址"。这是最容易踩坑的地方:
| 访问场景 | 连接地址 | 说明 |
|---|---|---|
| Docker 容器内访问 | kafka:9092 | 使用容器名 + 内部端口 |
| Ubuntu 宿主机访问 | localhost:9094 | 对应 EXTERNAL://localhost:9094 |
| 局域网/公网访问 | 服务器实际IP:9094 | 需修改配置中的 localhost 为真实 IP |
如果需要从其他电脑连接,必须将
EXTERNAL://localhost:9094 改为 EXTERNAL://你的服务器IP:9094,否则客户端拿到的连接地址是 localhost,无法解析。4. 快速验证#
容器启动后,验证 Kafka 是否正常工作:
创建 Topic#
# 容器内创建(使用内部端口 9092)
docker exec -it kafka-kraft kafka-topics.sh \
--bootstrap-server kafka:9092 \
--create --topic demo \
--partitions 1 --replication-factor 1查看 Topic 列表#
docker exec -it kafka-kraft kafka-topics.sh \
--bootstrap-server kafka:9092 \
--list生产与消费消息#
# 生产消息
docker exec -it kafka-kraft kafka-console-producer.sh \
--bootstrap-server kafka:9092 \
--topic demo
# 消费消息(另开一个终端)
docker exec -it kafka-kraft kafka-console-consumer.sh \
--bootstrap-server kafka:9092 \
--topic demo \
--from-beginning5. 外部访问配置(可选)#
如果需要从宿主机或其他机器连接 Kafka,修改 docker-compose.yml 中的 ADVERTISED_LISTENERS:
# 将 localhost 改为服务器实际 IP
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,EXTERNAL://192.168.1.100:9094然后重启容器:
docker compose down && docker compose up -d常用运维命令#
# 查看容器状态
docker ps | grep kafka
# 查看 Kafka 日志
docker logs -f kafka-kraft
# 查看 Topic 详情
docker exec -it kafka-kraft kafka-topics.sh \
--bootstrap-server kafka:9092 \
--describe --topic demo
# 删除 Topic
docker exec -it kafka-kraft kafka-topics.sh \
--bootstrap-server kafka:9092 \
--delete --topic demo总结#
用 bitnami/kafka + KRaft 模式在 Ubuntu 上部署 Kafka 非常简单:
- 安装 Docker
- 编写一个
docker-compose.yml docker compose up -d一键启动
关键在于理解 Listeners 和 Advertised Listeners 的关系——内部用 kafka:9092,外部用 IP:9094,搞清楚这个就不会踩坑。
