马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
用 Docker 部署 Kafka 的完整流程:从 Zookeeper 到收发消息
Kafka 本身依赖 Zookeeper 做元数据管理,原生安装要处理 JDK、配置文件、broker id 一堆细节。用 Docker 容器化之后,这两层都能用官方维护的社区镜像快速拉起来。下面是从零到能收发消息的一整套操作。
前提条件
开始前确认三件事:
- 宿主机已经装好 Docker(Windows 下装 Docker Desktop,Linux 直接装
docker-ce)。
- Docker 服务处于运行状态。
- 网络端口可用:Zookeeper 用 2181,Kafka 用 9092,确认没被其他进程占用。
第一步:安装并运行 Zookeeper
Kafka 2.x 之前必须依赖 Zookeeper,先把它拉起来:
# 拉取镜像
docker pull wurstmeister/zookeeper
# 启动容器,映射 2181 端口
docker run -d --name zookeeper -p 2181:2181 wurstmeister/zookeeper
这条命令会起一个名为 zookeeper 的容器,并把容器的 2181 端口映射到宿主机的 2181。用 docker ps 能看到状态为 Up 就说明起来了。
第二步:启动 Kafka 容器
先拉镜像:
docker pull wurstmeister/kafka
然后启动,重点是几个环境变量:
docker run -d --name kafka \
-p 9092:9092 \
--link zookeeper:zookeeper \
-e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
-e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 \
wurstmeister/kafka
逐个说明:
--name kafka:容器名。
-p 9092:9092:把 Kafka 的端口映射出来。
--link zookeeper:zookeeper:把 Zookeeper 容器链进当前网络,容器内可以直接用 zookeeper 这个主机名访问它。
KAFKA_ZOOKEEPER_CONNECT:Zookeeper 连接串。
KAFKA_ADVERTISED_LISTENERS:advertised listeners,客户端真正用来连的地址,生产环境建议填宿主机 IP 而不是 localhost。
KAFKA_LISTENERS:容器内监听地址。
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR:offset topic 副本数,单机环境必须是 1,填大了会起不来。
如果 Zookeeper 容器名字不同,或者用了自定义网络,--link 和 KAFKA_ZOOKEEPER_CONNECT 的值要跟着改。
第三步:验证是否正常运行
进入 Kafka 容器:
docker exec -it kafka /bin/bash
如果这一步就报错,形如 Error response from daemon: Container xxx is not running,说明容器没起来,按下面的顺序排错。
3.1 查看容器状态
docker ps -a
在列表里找到 zookeeper 和 kafka,看 STATUS 字段。如果显示 Exited,说明容器已经停止,重点查这两个。
3.2 查看容器日志
docker logs 62b9c056c0aa
这里的容器 ID 前缀从 docker ps -a 的输出里复制完整 ID 的前几位。日志 末尾通常能看到容器退出的原因,比如端口被占用、Zookeeper 连不上、内存不足等。
3.3 重新启动容器
把根因解决之后重启:
docker start 62b9c056c0aa
3.4 创建测试主题并收发消息
在容器里执行:
# 创建主题
kafka-topics.sh --create --topic test --partitions 1 --replication-factor 1 --zookeeper zookeeper:2181
# 启动一个生产者,然后在终端里输入任意内容并回车
kafka-console-producer.sh --broker-list localhost:9092 --topic test
# 另开一个终端(同样要进容器)启动消费者
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
如果消费者一侧能看到生产者输入的内容,整条链路就通了。
常见问题速查
- 容器内
bash 不存在:换成 docker exec -it kafka /bin/sh。
- 客户端连不上 9092:九成是
KAFKA_ADVERTISED_LISTENERS 填了 localhost,外部机器解析不到,改成宿主机内网 IP。
- Linux 防火墙挡住端口:用
firewall-cmd --list-ports 检查,放行 9092 和 2181。
qidao123.com企服评测-应用市场 编辑提示 |