使用 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 堆内存大小
相关推荐
weixin_468466851 小时前
Jellyfin 家庭媒体中心从零搭建指南
服务器·docker·容器·自动化·jellyfin·媒体中心
得物技术1 小时前
HorizonVault 技术深潜:如何在 HDD 上做出 100GB/s+ 级大吞吐分布式存储|得物技术
大数据·后端·kafka
qq_452396232 小时前
第五篇:《Docker 容器生命周期管理》
运维·docker·容器
ai产品老杨2 小时前
统一视频接入与多品牌利旧:基于 Docker 与 GB28181/RTSP 的边缘计算 AI 视频中台架构设计与源码交付实践
人工智能·docker·音视频
蜀道山老天师2 小时前
Docker 进阶:数据持久化与容器网络互联(数据卷、挂载目录、端口映射、自定义网络)
运维·网络·docker·云原生·容器
IT策士2 小时前
Docker 从 0 到 1 再到 Kubernetes 实战:第6篇 容器生命周期管理
docker·容器·kubernetes
zhz52142 小时前
Docker 部署 MongoDB / MySQL / PostgreSQL 安全加固实录:TLS 双向认证、双因素鉴别与审计
mysql·mongodb·docker·postgresql·等保
AI服务老曹2 小时前
源码交付与低代码解耦:基于 Docker 的边缘计算 AI 视频管理平台二次开发深度实战(兼容 GB28181/RTSP)
人工智能·docker·媒体
IT策士3 小时前
Docker 从 0 到 1 再到 Kubernetes 实战:第1篇 为什么要从 Docker 学到 Kubernetes?系列导读与环境准备
docker·容器·kubernetes