使用docker-compose安装kafka

使用docker-compose安装kafka和zookeeper

docker-compose.yml的配置

yaml 复制代码
version: '3'

services:
  zookeeper:
    image: 'zookeeper:3.8.0'
    container_name: zookeeper
    restart: always
    ports:
      - "2181:2181"
    environment:
      TZ: Asia/Shanghai
      ALLOW_ANONYMOUS_LOGIN: "yes"

  kafka:
    image: 'bitnami/kafka:3.2.0'
    container_name: kafka
    restart: always
    ports:
      - "9192:9192"  # 确保内外端口一致
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_CFG_LISTENERS: PLAINTEXT://0.0.0.0:9192  # 使用9192端口
      KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://192.168.1.10:9192  # 使用9192端口
      KAFKA_CFG_ZOOKEEPER_CONNECT: zookeeper:2181
      ALLOW_PLAINTEXT_LISTENER: "yes"
      TZ: Asia/Shanghai
    volumes:
      - /work/var/kafka:/bitnami/kafka
    depends_on:
      - zookeeper

关键点解释

  • KAFKA_CFG_LISTENERS :设置为 PLAINTEXT://0.0.0.0:9192,这意味着 Kafka 代理将监听所有网络接口上的 9192 端口。
  • KAFKA_CFG_ADVERTISED_LISTENERS :设置为 PLAINTEXT://192.168.1.10:9192,这意味着 Kafka 会告诉生产者和消费者使用 192.168.1.10 的 IP 地址以及 9192 端口来连接它。
  • Docker 端口映射 :设置为 9192:9192,以确保容器内的 9192 端口映射到主机的 9192 端口,从而与 KAFKA_CFG_ADVERTISED_LISTENERS 中指定的端口保持一致。

确认网络连通性

确保从 192.168.1.7 可以访问 192.168.1.10:9192,你可以通过以下命令测试连通性:

bash 复制代码
telnet 192.168.1.111 9192
# 或者
nc -zv 192.168.1.111 9192

总结

通过上述配置,你可以确保 Kafka 代理监听正确的端口,并且向生产者和消费者广播一个它们可以访问的地址。这样不仅保持了配置的一致性,还减少了潜在的混淆和错误。此外,确保防火墙规则允许两台服务器之间的通信仍然是非常重要的。如果你按照这种方式配置后仍然遇到问题,请检查日志文件以获取更多线索,并确保没有其他网络或安全策略阻止了通信。

Zookeeper 的 docker-compose 配置可以优化,以满足以下需求:

  1. 挂载日志和数据目录:

    • 挂载宿主机的目录到 Zookeeper 容器,便于持久化数据和查看日志。
    • Zookeeper 的数据目录默认是 /data,日志目录是 /datalog。
  2. 配置日志文件大小限制:

    • 使用 zookeeper-log4j.properties 文件配置日志滚动和大小限制。

以下是优化后的配置:


修改后的 docker-compose.yml

yaml 复制代码
version: '3'

services:
  zookeeper:
    image: 'zookeeper:3.8.0'
    container_name: zookeeper
    restart: always
    ports:
      - "2181:2181"  # Zookeeper 默认端口
    environment:
      TZ: Asia/Shanghai
      ALLOW_ANONYMOUS_LOGIN: "yes"
    volumes:
      - /work/var/zookeeper/data:/data     # 数据目录
      - /work/var/zookeeper/datalog:/datalog # 日志目录
      - /work/var/zookeeper/logs:/logs     # 挂载日志目录
      - ./zookeeper-log4j.properties:/conf/log4j.properties # 自定义日志配置

添加日志配置文件

在 docker-compose.yml 的同级目录下,创建一个 zookeeper-log4j.properties 文件,用于配置 Zookeeper 的日志管理:

zookeeper-log4j.properties
properties 复制代码
zookeeper.root.logger=INFO, CONSOLE, ROLLINGFILE
zookeeper.console.threshold=INFO
log4j.rootLogger=${zookeeper.root.logger}

# Console appender
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=${zookeeper.console.threshold}
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [%t] %-5p %c{2} (%F:%L) - %m%n

# Rolling File Appender
log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLINGFILE.File=/logs/zookeeper.log
log4j.appender.ROLLINGFILE.MaxFileSize=10MB    # 每个日志文件最大大小
log4j.appender.ROLLINGFILE.MaxBackupIndex=5   # 保留的日志文件个数
log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} [%t] %-5p %c{2} (%F:%L) - %m%n

说明

  1. 挂载卷说明:

    • /work/var/zookeeper/data:存储 Zookeeper 的快照数据。
    • /work/var/zookeeper/datalog:存储事务日志。
    • /work/var/zookeeper/logs:存储应用日志。
  2. 日志配置文件:

    • zookeeper-log4j.properties 定义了日志输出到控制台和文件。
    • 滚动日志配置了最大文件大小为 10MB,最多保留 5 个旧日志文件。
  3. 查看日志:

    • 使用 docker logs 查看控制台日志:

      bash 复制代码
      docker logs zookeeper
    • 查看挂载的日志文件:

      bash 复制代码
      tail -f /work/var/zookeeper/logs/zookeeper.log
  4. 限制日志大小:

    • 每个日志文件最大 10MB,超过后生成新的日志文件。
    • 最多保留 5 个日志文件,避免日志占用过多磁盘空间。

启动服务

  1. 启动容器:

    bash 复制代码
    docker-compose up -d
  2. 验证:

    • 检查 /work/var/zookeeper/logs/zookeeper.log 文件是否生成。

    • 检查 Zookeeper 是否正常运行:

      bash 复制代码
      docker logs zookeeper

通过上述优化,你可以更方便地管理 Zookeeper 的日志和数据,同时避免日志占用过多磁盘空间。

你可以通过进入 Kafka 容器来使用 Kafka 自带的命令行工具 (kafka-console-producer.sh 和 kafka-console-consumer.sh) 测试消息的发送和消费。以下是步骤:


1. 进入 Kafka 容器

运行以下命令进入 Kafka 容器:

bash 复制代码
docker exec -it kafka /bin/bash

这将打开 Kafka 容器的交互式终端。


2. 测试生产消息

使用 kafka-console-producer.sh 向某个主题发送消息。

示例命令:
bash 复制代码
kafka-console-producer.sh --broker-list localhost:9092 --topic test-topic
操作:
  1. 输入消息,例如:

    复制代码
    Hello Kafka!
    Test message.
  2. 按回车键发送消息。


3. 测试消费消息

使用 kafka-console-consumer.sh 从主题中消费消息。

示例命令:
bash 复制代码
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test-topic --from-beginning
操作:
  • --from-beginning 参数表示从主题的最早消息开始消费。

  • 你应该能看到在生产者中输入的消息,例如:

    复制代码
    Hello Kafka!
    Test message.

4. 创建主题(可选)

如果主题不存在,你可以手动创建一个主题。

创建主题命令:
bash 复制代码
kafka-topics.sh --create --topic test-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
验证主题:

查看当前的主题列表:

bash 复制代码
kafka-topics.sh --list --bootstrap-server localhost:9092

5. 退出容器

完成测试后,可以输入以下命令退出容器:

bash 复制代码
exit

注意事项

  1. 连接配置 :测试命令中的 --broker-list 和 --bootstrap-server 参数必须匹配 Kafka 容器的配置。如果使用 docker-compose.yml 文件中的配置,应该是 localhost:9092 或容器内的默认端口。

  2. 远程测试 :如果从其他服务器(如 192.168.1.7)测试,需要使用 KAFKA_CFG_ADVERTISED_LISTENERS 中配置的地址和端口(如 192.168.1.10:9192)。

  3. 错误排查 :如果消息发送或消费失败,检查 Kafka 和 Zookeeper 的日志:

    bash 复制代码
    docker logs kafka
    docker logs zookeeper

通过以上步骤,你可以快速测试 Kafka 的消息发送和消费功能。

相关推荐
姜鱼问生5 小时前
每次开机手动检查 6 样东西?我写了个 2 秒自检脚本
运维·网络·nginx·docker·容器
wangqiaowq5 小时前
PostgresSQL server Docker 安装部署
运维·docker·容器
程序员阿明6 小时前
docker搭建视频流服务go2rtc,webRTC
docker·容器·webrtc
TTATTC6 小时前
让 16 个 AI 员工在飞书群自我协同:基于 OpenClaw 的多 Agent 敏捷 Squad 拓扑与一人公司实操
docker·开源
TTATTC6 小时前
从分片续传到 SPI 插件化扩展:Free-FS 企业级文件系统核心架构与万能预览技术拆解
docker·开源
JavaPub-rodert7 小时前
Docker 容器为什么 stop 半天停不下来?讲透 PID 1、SIGTERM、SIGKILL、僵尸进程与 tini
运维·docker·容器
我不会起名字3227 小时前
Kafka 分区数到底设几个:吞吐量、顺序性与 rebalance 代价的取舍
kafka·消息队列·调优·分区
EterNity_TiMe_11 小时前
Docker服务越装越多记不住端口?我用Fenrus把NAS里的常用入口整理成一个导航页
运维·人工智能·docker·ai·容器·cpolar
吴声子夜歌12 小时前
Docker入门与实战——libnetwork插件化网络功能
网络·docker·容器
江湖有缘12 小时前
Docker实战 | 使用Docker部署HarborGuard容器安全扫描平台
安全·docker·容器