跳过正文

Ubuntu_kafka

· loading · loading ·
lixxix
作者
lixxix
关注科技,编程改变生活!
在 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 ~/kafka
services:
  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 -d

3. 核心配置解读
#

这配置创建了几个 Broker?
#

答案:1 个

配置中的 PROCESS_ROLES=controller,broker 表示一个节点同时身兼两职:既负责元数据管理(代替了 Zookeeper),也负责消息的读写。这是 KRaft 模式下单节点的典型配置。

三个端口分别做什么?
#

端口Listener 名称用途
9092PLAINTEXT容器内部 / Docker 网络间通信
9093CONTROLLERKRaft 控制面通信(本配置仅单节点,内部使用)
9094EXTERNAL宿主机及外部客户端访问

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-beginning

5. 外部访问配置(可选)
#

如果需要从宿主机或其他机器连接 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 非常简单:

  1. 安装 Docker
  2. 编写一个 docker-compose.yml
  3. docker compose up -d 一键启动

关键在于理解 ListenersAdvertised Listeners 的关系——内部用 kafka:9092,外部用 IP:9094,搞清楚这个就不会踩坑。