使用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.shkafka-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 的消息发送和消费功能。

相关推荐
敲上瘾6 小时前
Linux系统cgroups资源精细化控制基础
linux·测试工具·docker·压力测试·cgroups
伊成8 小时前
Docker 部署 Nginx 完整指南
nginx·docker·容器
落日漫游9 小时前
K8s核心组件全解析
运维·docker·运维开发
江湖有缘13 小时前
【Docker项目实战】使用Docker部署Notepad轻量级记事本
docker·容器·notepad++
yh云想13 小时前
《从入门到精通:Kafka核心原理全解析》
分布式·kafka
武子康14 小时前
大数据-70 Kafka 日志清理:删除、压缩及混合模式最佳实践
大数据·后端·kafka
BTU_YC14 小时前
docker compose部署mysql
mysql·adb·docker
Python私教16 小时前
Docker in Test:用一次性的真实环境,终结“测试永远跑不通”魔咒
运维·docker·容器
UPToZ18 小时前
【Docker】搭建一个高性能的分布式对象存储服务 - MinIO
分布式·docker·容器
我不要放纵1 天前
docker
运维·docker·容器