使用docker-compose安装kafka
使用docker-compose安装kafka和zookeeper
docker-compose.yml的配置
version: '3'services:zookeeper:image: 'zookeeper:3.8.0'container_name: zookeeperrestart: alwaysports:- "2181:2181"environment:TZ: Asia/ShanghaiALLOW_ANONYMOUS_LOGIN: "yes"kafka:image: 'bitnami/kafka:3.2.0'container_name: kafkarestart: alwaysports:- "9192:9192" # 确保内外端口一致environment:KAFKA_BROKER_ID: 1KAFKA_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:2181ALLOW_PLAINTEXT_LISTENER: "yes"TZ: Asia/Shanghaivolumes:- /work/var/kafka:/bitnami/kafkadepends_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
,你可以通过以下命令测试连通性:
telnet 192.168.1.111 9192
# 或者
nc -zv 192.168.1.111 9192
总结
通过上述配置,你可以确保 Kafka 代理监听正确的端口,并且向生产者和消费者广播一个它们可以访问的地址。这样不仅保持了配置的一致性,还减少了潜在的混淆和错误。此外,确保防火墙规则允许两台服务器之间的通信仍然是非常重要的。如果你按照这种方式配置后仍然遇到问题,请检查日志文件以获取更多线索,并确保没有其他网络或安全策略阻止了通信。
Zookeeper 的 docker-compose
配置可以优化,以满足以下需求:
-
挂载日志和数据目录:
- 挂载宿主机的目录到 Zookeeper 容器,便于持久化数据和查看日志。
- Zookeeper 的数据目录默认是
/data
,日志目录是/datalog
。
-
配置日志文件大小限制:
- 使用
zookeeper-log4j.properties
文件配置日志滚动和大小限制。
- 使用
以下是优化后的配置:
修改后的 docker-compose.yml
version: '3'services:zookeeper:image: 'zookeeper:3.8.0'container_name: zookeeperrestart: alwaysports:- "2181:2181" # Zookeeper 默认端口environment:TZ: Asia/ShanghaiALLOW_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
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
说明
-
挂载卷说明:
/work/var/zookeeper/data
:存储 Zookeeper 的快照数据。/work/var/zookeeper/datalog
:存储事务日志。/work/var/zookeeper/logs
:存储应用日志。
-
日志配置文件:
zookeeper-log4j.properties
定义了日志输出到控制台和文件。- 滚动日志配置了最大文件大小为 10MB,最多保留 5 个旧日志文件。
-
查看日志:
- 使用
docker logs
查看控制台日志:docker logs zookeeper
- 查看挂载的日志文件:
tail -f /work/var/zookeeper/logs/zookeeper.log
- 使用
-
限制日志大小:
- 每个日志文件最大 10MB,超过后生成新的日志文件。
- 最多保留 5 个日志文件,避免日志占用过多磁盘空间。
启动服务
-
启动容器:
docker-compose up -d
-
验证:
- 检查
/work/var/zookeeper/logs/zookeeper.log
文件是否生成。 - 检查 Zookeeper 是否正常运行:
docker logs zookeeper
- 检查
通过上述优化,你可以更方便地管理 Zookeeper 的日志和数据,同时避免日志占用过多磁盘空间。
你可以通过进入 Kafka 容器来使用 Kafka 自带的命令行工具 (kafka-console-producer.sh
和 kafka-console-consumer.sh
) 测试消息的发送和消费。以下是步骤:
1. 进入 Kafka 容器
运行以下命令进入 Kafka 容器:
docker exec -it kafka /bin/bash
这将打开 Kafka 容器的交互式终端。
2. 测试生产消息
使用 kafka-console-producer.sh
向某个主题发送消息。
示例命令:
kafka-console-producer.sh --broker-list localhost:9092 --topic test-topic
操作:
- 输入消息,例如:
Hello Kafka! Test message.
- 按回车键发送消息。
3. 测试消费消息
使用 kafka-console-consumer.sh
从主题中消费消息。
示例命令:
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test-topic --from-beginning
操作:
--from-beginning
参数表示从主题的最早消息开始消费。- 你应该能看到在生产者中输入的消息,例如:
Hello Kafka! Test message.
4. 创建主题(可选)
如果主题不存在,你可以手动创建一个主题。
创建主题命令:
kafka-topics.sh --create --topic test-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
验证主题:
查看当前的主题列表:
kafka-topics.sh --list --bootstrap-server localhost:9092
5. 退出容器
完成测试后,可以输入以下命令退出容器:
exit
注意事项
- 连接配置:测试命令中的
--broker-list
和--bootstrap-server
参数必须匹配 Kafka 容器的配置。如果使用docker-compose.yml
文件中的配置,应该是localhost:9092
或容器内的默认端口。 - 远程测试:如果从其他服务器(如 192.168.1.7)测试,需要使用
KAFKA_CFG_ADVERTISED_LISTENERS
中配置的地址和端口(如192.168.1.10:9192
)。 - 错误排查:如果消息发送或消费失败,检查 Kafka 和 Zookeeper 的日志:
docker logs kafka docker logs zookeeper
通过以上步骤,你可以快速测试 Kafka 的消息发送和消费功能。