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
相关推荐
多多*3 小时前
Java设计模式 简单工厂模式 工厂方法模式 抽象工厂模式 模版工厂模式 模式对比
java·linux·运维·服务器·stm32·单片机·嵌入式硬件
白夜易寒4 小时前
Docker学习之私有仓库(day10)
学习·docker·容器
南鸳6104 小时前
Linux常见操作命令(2)
linux·运维·服务器
fengwuJ5 小时前
Linux安装Idea
linux·ubuntu·debian·intellij-idea
西北大程序猿5 小时前
linux进程信号 ─── linux第27课
linux·运维·服务器·信号处理
涛ing5 小时前
【Git “fetch“ 命令详解】
linux·c语言·c++·人工智能·git·vscode·svn
想躺在地上晒成地瓜干6 小时前
树莓派超全系列文档--(18)树莓派配置音频
linux·音视频·树莓派·raspberrypi·树莓派教程
java1234_小锋6 小时前
Kafka中的消息是如何存储的?
分布式·kafka
老友@6 小时前
Kafka 深度解析:高性能设计、部署模式、容灾机制与 KRaft 新模式
分布式·kafka·kraft·高性能·容灾机制
余子桃6 小时前
Kafka的安装与使用(windows下python使用等)
分布式·kafka