1. 为什么需要Docker Compose部署Kafka集群

第一次接触Kafka集群部署时,我像大多数开发者一样选择了手动安装。结果在配置Zookeeper节点时,因为一个端口映射错误折腾了整整两天。后来发现用Docker Compose部署,同样的工作只需要15分钟。这种"真香"体验让我彻底爱上了容器化部署方案。

Kafka作为分布式消息系统,天生就需要多节点协同工作。传统部署方式要重复配置每台服务器,不仅容易出错,后期扩容更是噩梦。而Docker Compose用声明式配置解决这些问题——你把集群拓扑关系写在YAML文件里,剩下的交给容器编排工具处理。

实测下来,用docker-compose部署Kafka集群有三大优势:

  • 环境一致性:所有节点使用相同镜像,避免"我本地能跑线上报错"的经典问题
  • 快速扩容:改个数字就能增加Broker节点,特别适合临时增加处理能力
  • 资源隔离:每个服务独立容器,CPU/内存限制明明白白

2. 部署前的准备工作

2.1 硬件与软件要求

我建议准备至少4GB内存的机器,Kafka和Zookeeper都是内存大户。曾经在2GB的笔记本上测试,启动三个节点就直接OOM了。软件方面只需要安装:

  • Docker 20.10+
  • Docker Compose 2.0+

用这个命令检查版本:

docker --version && docker-compose --version

2.2 网络规划要点

Kafka集群内部通信需要特别注意网络配置。建议提前规划好:

  • 每个Broker的ADVERTISED_LISTENERS地址(通常是主机IP)
  • Zookeeper节点的服务发现机制
  • 端口映射策略(生产环境建议用host模式)

有个坑我踩过:如果在云服务器部署,ADVERTISED_LISTENERS必须配置公网IP,否则外部客户端连不上。这个参数后面会在docker-compose.yml中重点说明。

3. 编写docker-compose.yml文件

3.1 Zookeeper集群配置

先上完整配置,下面逐行解析:

version: '3'
services:
  zookeeper-1:
    image: zookeeper:3.8.0
    hostname: zookeeper-1
    ports:
      - "2181:2181"
    environment:
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=zookeeper-1:2888:3888 server.2=zookeeper-2:2888:3888 server.3=zookeeper-3:2888:3888
    volumes:
      - ./zk-data-1:/data
      - ./zk-logs-1:/datalog

  zookeeper-2:
    image: zookeeper:3.8.0
    hostname: zookeeper-2
    ports:
      - "2182:2181" 
    environment:
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.1=zookeeper-1:2888:3888 server.2=zookeeper-2:2888:3888 server.3=zookeeper-3:2888:3888
    volumes:
      - ./zk-data-2:/data
      - ./zk-logs-2:/datalog

关键配置说明:

  • ZOO_MY_ID:每个节点唯一ID,必须与server.x中的x对应
  • ZOO_SERVERS:集群所有节点地址,格式为server.id=host:port1:port2
  • 数据卷挂载:持久化Zookeeper数据,避免容器重启丢失

3.2 Kafka集群配置

Kafka部分配置更复杂,重点看这些参数:

kafka-1:
  image: bitnami/kafka:3.3.1
  ports:
    - "9092:9092"
  environment:
    KAFKA_BROKER_ID: 1
    KAFKA_CFG_LISTENERS: PLAINTEXT://:9092
    KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://kafka-1:9092
    KAFKA_CFG_ZOOKEEPER_CONNECT: zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181
    ALLOW_PLAINTEXT_LISTENER: "yes"
  depends_on:
    - zookeeper-1
    - zookeeper-2
    - zookeeper-3

特别注意:

  • KAFKA_CFG_ADVERTISED_LISTENERS:客户端连接的地址,如果是远程访问要改成IP
  • depends_on:确保Zookeeper先启动
  • Bitnami镜像比wurstmeister更规范,推荐使用

4. 启动与验证集群

4.1 一键启动命令

在docker-compose.yml所在目录执行:

docker-compose up -d

用这个命令观察启动日志:

docker-compose logs -f kafka-1

4.2 验证集群状态

首先检查Zookeeper节点:

docker exec -it zookeeper-1 zkServer.sh status

然后验证Kafka Broker注册情况:

docker exec -it kafka-1 kafka-broker-api-versions.sh --bootstrap-server localhost:9092

创建测试Topic验证集群功能:

docker exec -it kafka-1 kafka-topics.sh --create --topic test --partitions 3 --replication-factor 2 --bootstrap-server localhost:9092

5. 生产环境优化建议

5.1 性能调优参数

在environment中添加:

KAFKA_CFG_NUM_NETWORK_THREADS: 10
KAFKA_CFG_NUM_IO_THREADS: 16
KAFKA_CFG_SOCKET_SEND_BUFFER_BYTES: 102400
KAFKA_CFG_SOCKET_RECEIVE_BUFFER_BYTES: 102400

5.2 监控方案

推荐搭配Prometheus监控:

kafka-exporter:
  image: danielqsj/kafka-exporter
  ports:
    - "9308:9308"
  environment:
    KAFKA_BROKERS: kafka-1:9092,kafka-2:9092,kafka-3:9092

5.3 常见问题处理

遇到启动失败时检查:

  1. 端口是否被占用
  2. 磁盘空间是否充足
  3. 防火墙规则是否放行
  4. 时间同步服务是否正常

有个特别隐蔽的坑:如果服务器内存不足,Kafka可能启动成功但无法创建Topic。这时候看日志会发现报错"Not enough replicas available",实际是内存不足导致。

更多推荐