使用 Docker Compose 搭建 Kafka 集群

本篇文章主要介绍使用 Docker Compose 搭建 Kafka 集群,实操性比较强。

Kafka在2.8.0版本之前的集群部署中必须依赖Zookeeper,因为它承担了元数据管理、Controller选举、Broker状态监控等核心协调职责;但从2.8.0版本开始,Kafka引入KRaft模式逐步替代Zookeeper,到4.0版本已完全移除该依赖。本次部署的Kafka是比较久的版本。

下面是一个 3 节点 Kafka 集群 + ZooKeeper 的 Docker Compose 配置示例:

1. 目录结构

bash 复制代码
kafka-cluster/
├── docker-compose.yml
└── .env

2. 创建 .env 配置文件

env 复制代码
# Kafka 集群配置
KAFKA_CLUSTER_NAME=my-kafka-cluster
KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181

# Broker 配置
KAFKA_BROKER_ID_1=1
KAFKA_BROKER_ID_2=2
KAFKA_BROKER_ID_3=3

# 端口配置
KAFKA_PORT_1=9092
KAFKA_PORT_2=9093
KAFKA_PORT_3=9094

# 日志目录
KAFKA_LOG_DIRS_1=/var/lib/kafka/data-1
KAFKA_LOG_DIRS_2=/var/lib/kafka/data-2
KAFKA_LOG_DIRS_3=/var/lib/kafka/data-3

3. 创建 docker-compose.yml

yaml 复制代码
version: '3.8'

services:
  zookeeper:
    image: confluentinc/cp-zookeeper:7.5.0
    container_name: zookeeper
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
      ZOOKEEPER_INIT_LIMIT: 5
      ZOOKEEPER_SYNC_LIMIT: 2
    ports:
      - "2181:2181"
    volumes:
      - zookeeper-data:/var/lib/zookeeper/data
    networks:
      - kafka-network

  kafka-1:
    image: confluentinc/cp-kafka:7.5.0
    container_name: kafka-1
    depends_on:
      - zookeeper
    ports:
      - "9092:9092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_NUM_PARTITIONS: 3
      KAFKA_DEFAULT_REPLICATION_FACTOR: 1
      KAFKA_LOG_DIRS: /var/lib/kafka/data-1
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
      KAFKA_LOG_RETENTION_HOURS: 168
    volumes:
      - kafka-data-1:/var/lib/kafka/data-1
    networks:
      - kafka-network

  kafka-2:
    image: confluentinc/cp-kafka:7.5.0
    container_name: kafka-2
    depends_on:
      - zookeeper
    ports:
      - "9093:9093"
    environment:
      KAFKA_BROKER_ID: 2
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9093
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_NUM_PARTITIONS: 3
      KAFKA_DEFAULT_REPLICATION_FACTOR: 1
      KAFKA_LOG_DIRS: /var/lib/kafka/data-2
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
      KAFKA_LOG_RETENTION_HOURS: 168
    volumes:
      - kafka-data-2:/var/lib/kafka/data-2
    networks:
      - kafka-network

  kafka-3:
    image: confluentinc/cp-kafka:7.5.0
    container_name: kafka-3
    depends_on:
      - zookeeper
    ports:
      - "9094:9094"
    environment:
      KAFKA_BROKER_ID: 3
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9094
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_NUM_PARTITIONS: 3
      KAFKA_DEFAULT_REPLICATION_FACTOR: 1
      KAFKA_LOG_DIRS: /var/lib/kafka/data-3
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
      KAFKA_LOG_RETENTION_HOURS: 168
    volumes:
      - kafka-data-3:/var/lib/kafka/data-3
    networks:
      - kafka-network

  kafka-manager:
    image: sheepkiller/kafka-manager:latest
    container_name: kafka-manager
    environment:
      ZK_HOSTS: zookeeper:2181
      APPLICATION_SECRET: "random-secret"
    ports:
      - "9000:9000"
    depends_on:
      - zookeeper
    networks:
      - kafka-network

volumes:
  zookeeper-data:
  kafka-data-1:
  kafka-data-2:
  kafka-data-3:

networks:
  kafka-network:
    driver: bridge

4. 启动集群

bash 复制代码
# 进入目录
cd kafka-cluster

# 启动所有服务
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f

5. 常用命令

测试生产者

bash 复制代码
docker exec -it kafka-1 kafka-console-producer --broker-list localhost:9092 --topic test-topic

测试消费者

bash 复制代码
docker exec -it kafka-1 kafka-console-consumer --bootstrap-server localhost:9092 --topic test-topic --from-beginning

创建 Topic

bash 复制代码
docker exec -it kafka-1 kafka-topics --create --topic my-topic \
  --bootstrap-server localhost:9092 \
  --partitions 3 \
  --replication-factor 2

查看 Topic 列表

bash 复制代码
docker exec -it kafka-1 kafka-topics --list --bootstrap-server localhost:9092

查看集群状态

bash 复制代码
docker exec -it kafka-1 kafka-topics --describe --bootstrap-server localhost:9092

6. 访问 Kafka Manager

启动后访问 http://localhost:9000 可以通过 Web UI 管理 Kafka 集群。

7. 停止集群

bash 复制代码
docker-compose down

# 删除数据卷(完全清理)
docker-compose down -v

注意

  1. 生产环境建议增加副本数(replication-factor >= 2)
  2. 确保服务器内存充足(建议每个 Kafka 容器至少 2GB 内存)
  3. 可以通过 KAFKA_HEAP_OPTS 环境变量调整 JVM 堆内存大小
相关推荐
梦想的颜色9 小时前
【Docker部署插件】:使用 Docker 部署生产级 Kafka 完整版教程
安全·docker·中间件·kafka·消息队列·docker-compose·后端开发
↘"LYong9 小时前
旧版 CentOS 安装 Docker 完整指南(附国内镜像加速)
linux·运维·docker
满意的星月11 小时前
基于微服务和Docker容器技术的PaaS云平台架构设计(微服务架构实施原理)
docker·微服务·架构
sukioe13 小时前
【无标题】
后端·docker·centos
考虑考虑14 小时前
kafka4安装
后端·kafka·自动化运维
HAPPY酷14 小时前
【ROS2】VMware + Docker 运行 Gazebo 崩溃与“假死”排查实录
qt·docker·容器
想你依然心痛18 小时前
嵌入式容器:Docker与BalenaOS在边缘设备上的实践——容器运行时与OTA
运维·docker·容器
不瘦80斤不改名19 小时前
HalfCart:基于LBS的1\.5km本地拼单系统全栈实践与踩坑复盘
python·docker·typescript·pycharm
Tronlong创龙1 天前
SBC-TL3588 单板机 / EPC-TL3588 工控机 Docker 开发手册(二)
docker·开发板·嵌入式开发·硬件开发·工业控制
AI服务老曹1 天前
视觉算法模型管理完整流程:多版本上线、灰度发布与回滚的落地实践
人工智能·docker·音视频