Linux 上使用 Docker 部署 Kafka 集群

在 Linux 上使用 Docker 部署 Kafka 集群的步骤如下

1. 准备工作

确保已安装:

Docker

Docker Compose

2. 创建 Docker Compose 文件 (docker-compose.yml)

yaml 复制代码
version: '3.8'

services:
  zookeeper:
    image: wurstmeister/zookeeper
    container_name: zookeeper
    ports:
      - "2181:2181"
    networks:
      - kafka-net
    volumes:
      - ./zookeeper/data:/data
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181

  kafka1:
    image: wurstmeister/kafka
    container_name: kafka1
    ports:
      - "9092:9092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka1:9093,OUTSIDE://宿主机IP:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
      KAFKA_LISTENERS: INSIDE://0.0.0.0:9093,OUTSIDE://0.0.0.0:9092
      KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
    volumes:
      - ./kafka1/data:/kafka
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - kafka-net
    depends_on:
      - zookeeper

  kafka2:
    image: wurstmeister/kafka
    container_name: kafka2
    ports:
      - "9093:9093"
    environment:
      KAFKA_BROKER_ID: 2
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka2:9094,OUTSIDE://宿主机IP:9093
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
      KAFKA_LISTENERS: INSIDE://0.0.0.0:9094,OUTSIDE://0.0.0.0:9093
      KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
    volumes:
      - ./kafka2/data:/kafka
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - kafka-net
    depends_on:
      - zookeeper

  kafka3:
    image: wurstmeister/kafka
    container_name: kafka3
    ports:
      - "9094:9094"
    environment:
      KAFKA_BROKER_ID: 3
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka3:9095,OUTSIDE://宿主机IP:9094
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
      KAFKA_LISTENERS: INSIDE://0.0.0.0:9095,OUTSIDE://0.0.0.0:9094
      KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
    volumes:
      - ./kafka3/data:/kafka
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - kafka-net
    depends_on:
      - zookeeper

networks:
  kafka-net:
    driver: bridge

关键配置说明

  1. 网络架构
yaml 复制代码
networks:
  kafka-net:
    driver: bridge

所有服务使用同一个自定义网络 kafka-net,确保容器间通过服务名称通信

  1. Zookeeper 配置
yaml 复制代码
volumes:
  - ./zookeeper/data:/data  # 数据持久化路径
environment:
  ZOOKEEPER_CLIENT_PORT: 2181
  1. Kafka 节点配置
yaml 复制代码
environment:
  # 监听器配置(核心)
  # 如果外部连接监听消费的话 
  # KAFKA_ADVERTISED_LISTENERS : INSIDE://kafka1:9093,OUTSIDE://localhost:9092需要修改为
  # KAFKA_ADVERTISED_LISTENERS : INSIDE://kafka1:9093,OUTSIDE://宿主机IP:9092
  KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka1:9093,OUTSIDE://宿主机IP:9092
  KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
  KAFKA_LISTENERS: INSIDE://0.0.0.0:9093,OUTSIDE://0.0.0.0:9092
  KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE

  # 其他重要参数
  KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"  # 禁止自动创建主题
  KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3  # 确保高可用
  1. 端口映射规则
节点 节点 宿主机端口 宿主机端口
kafka1 9093 9092 集群内部通信
kafka1 9092 9092 外部客户端访问
kafka2 9094 9093 集群内部通信
kafka2 9093 9093 外部客户端访问
kafka3 9095 9094 集群内部通信
kafka3 9094 9094 外部客户端访问

操作流程

  1. 启动集群
bash 复制代码
mkdir -p {zookeeper,kafka1,kafka2,kafka3}/data
docker-compose up -d
  1. 验证集群状态
bash 复制代码
# 查看 Kafka 日志
docker logs kafka1

# 进入容器检查 brokers
docker exec -it kafka1 bash
/opt/kafka/bin/kafka-broker-api-versions --bootstrap-server kafka1:9093
  1. 创建测试主题
bash 复制代码
docker exec -it kafka1 bash
/opt/kafka/bin/kafka-topics.sh --create \
  --topic test-topic \
  --partitions 3 \
  --replication-factor 3 \
  --bootstrap-server kafka1:9093
  1. 生产消费测试
bash 复制代码
# 生产者(使用外部端口)
docker exec -it kafka1 bash
/opt/kafka/bin/kafka-console-producer.sh \
  --topic test-topic \
  --bootstrap-server localhost:9092

# 消费者(使用另一个节点)
docker exec -it kafka2 bash
/opt/kafka/bin/kafka-console-consumer.sh \
  --topic test-topic \
  --from-beginning \
  --bootstrap-server localhost:9093

常见问题排查

  1. Kafka 节点无法启动
    检查 KAFKA_ADVERTISED_LISTENERS 配置
    验证 Zookeeper 连接:
bash 复制代码
docker exec -it kafka1 bash
nc -zv zookeeper 2181
  1. 外部客户端无法连接
    检查宿主机防火墙设置
    确认使用外部监听器:
bash 复制代码
kafka-topics.sh --list --bootstrap-server localhost:9092
  1. 数据持久化失败
    确保挂载目录有写权限:
bash 复制代码
chmod -R a+rw ./kafka1/data ./kafka2/data ./kafka3/data

高级配置建议

  1. 调整 JVM 参数
    在环境变量中添加:
yaml 复制代码
KAFKA_HEAP_OPTS: "-Xmx2G -Xms2G"
  1. 启用 SSL 加密
yaml 复制代码
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:SSL,OUTSIDE:SSL
KAFKA_SSL_KEYSTORE_LOCATION: /kafka/keystore/kafka.jks
KAFKA_SSL_KEYSTORE_PASSWORD: yourpassword
  1. 集成监控
yaml 复制代码
# 新增 Prometheus 服务
kafka-exporter:
  image: danielqsj/kafka-exporter
  ports:
    - "9308:9308"
  environment:
    KAFKA_BROKERS: "kafka1:9093,kafka2:9094,kafka3:9095"
  networks:
    - kafka-net
相关推荐
N 年 后9 分钟前
单独Docker部署和Docker Compose部署
java·docker·容器
阿巴~阿巴~1 小时前
IPv4地址转换函数详解及C++容器安全删除操作指南
linux·服务器·c++·网络协议·算法·c++容器安全删除操作·ipv4地址转换函数
一瓢一瓢的饮 alanchan1 小时前
Flink原理与实战(java版)#第2章 Flink的入门(第二节Flink简介)
java·大数据·flink·kafka·实时计算·离线计算·流批一体化计算
hoo3431 小时前
【Typora】!Markdown 编辑器详细安装教程,高效上手
linux·编辑器
tkevinjd2 小时前
【无标题】
linux
羑悻的小杀马特2 小时前
JuiceSSH+cpolar解锁手机远程Linux新姿势,无需公网IP,固定地址稳定用
linux·服务器·coplar
HIT_Weston2 小时前
30、【Ubuntu】【远程开发】内网穿透:反向隧道建立(二)
linux·运维·ubuntu
乌萨奇也要立志学C++2 小时前
【Linux】进程间通信(三)System V 共享内存完全指南:原理、系统调用与 C++ 封装实现
linux·c++
Percep_gan2 小时前
在Linux中安装字体
linux·运维·服务器
ZHANG13HAO3 小时前
通过 MQTT 命令控制 RV1106 的 WebRTC 推流启停” 及 “30 分钟无命令自动停止”
linux