1. 概述
以docker-compose的方式搭建zookeeper+kafka3的集群,比起用docker命令的方式更加简单,还能保留配置信息。不会docker-compose没关系,按照我下面的操作步骤即可。集群的结构是三个zookeeper节点加上三个kafka节点,zookeeper镜像的版本是3.8.0,kafka的版本为3.0.0。在安装前默认你已经安装好了docker和docker-compose。本文参考引用博客中的安装过程,原博主的docker-compose文件有一点小瑕疵,在重启虚拟机以后,kafka节点不会自动重启,需要我们自己手动启动容器。我在原博主的基础上补充上了这一点,现在你即使重启虚拟机,docker容器会自动启动。
2. 代码
powershell
version: '3.1'
networks:
zk-net: # 网络名
driver: bridge
services:
# zookeeper集群
zoo1:
image: zookeeper:3.8.0
container_name: zoo1 # 容器名称
restart: always # 开机自启
hostname: zoo1 # 主机名
ports:
- 2181:2181 # 端口号
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
networks:
- zk-net
zoo2:
image: zookeeper:3.8.0
container_name: zoo2
restart: always
hostname: zoo2
ports:
- 2182:2181
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
networks:
- zk-net
zoo3:
image: zookeeper:3.8.0
container_name: zoo3
restart: always
hostname: zoo3
ports:
- 2183:2181
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
networks:
- zk-net
# kafka集群
kafka1:
image: 'bitnami/kafka:3.0.0'
container_name: kafka1
restart: always
hostname: kafka1
networks:
- zk-net
ports:
- '9092:9092'
environment:
- KAFKA_CFG_ZOOKEEPER_CONNECT=zoo1:2181,zoo2:2182,zoo3:2183/kafka # 连接zookeeper集群
- KAFKA_BROKER_ID=1 # 设置kafka的brokerid
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092 # 当前kafka节点暴露出的端口号
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.11.111:9092 # 外部访问的路径
- ALLOW_PLAINTEXT_LISTENER=yes
depends_on:
- zoo1
- zoo2
- zoo3
kafka2:
image: 'bitnami/kafka:3.0.0'
container_name: kafka2
restart: always
hostname: kafka2
networks:
- zk-net
ports:
- '9093:9093'
environment:
- KAFKA_CFG_ZOOKEEPER_CONNECT=zoo1:2181,zoo2:2182,zoo3:2183/kafka
- KAFKA_BROKER_ID=2
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9093
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.11.111:9093
- ALLOW_PLAINTEXT_LISTENER=yes
depends_on:
- zoo1
- zoo2
- zoo3
kafka3:
image: 'bitnami/kafka:3.0.0'
container_name: kafka3
restart: always
hostname: kafka3
networks:
- zk-net
ports:
- '9094:9094'
environment:
- KAFKA_CFG_ZOOKEEPER_CONNECT=zoo1:2181,zoo2:2182,zoo3:2183/kafka
- KAFKA_BROKER_ID=3
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9094
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.11.111:9094
- ALLOW_PLAINTEXT_LISTENER=yes
depends_on:
- zoo1
- zoo2
- zoo3
注意事项
- 文件中KAFKA_CFG_ADVERTISED_LISTENERS属性的IP替换为你自己虚拟机的IP。
- 建立docker-compose-zookeepers-kafkas.yml文件,将代码复制进去
- 将文件放入虚拟机中,命令行切换到yml文件所在目录
- 运行指令:docker-compose -f docker-compose-zookeepers-kafkas.yml up -d
- 使用docker ps查看总共六个容器是否启动成功
- 验证zookeeper安装成功
powershell
# 随便进入一个zk容器
docker exec -it zoo1 /bin/bash
# 进入到zk的bin目录
cd /apache-zookeeper-3.8.0-bin/
cd bin
# 连接到 ZooKeeper 服务器并执行各种操作。
./zkCli.sh -server 127.0.0.1:2181
# 输入
ls /kafka/brokers/ids
# 结果输出[1, 2, 3]说明kafka与zk之间的连接没有问题
- 验证kafka安装成功
shell
# 1. 建立两个客户端
# 2. 客户端1进入kafka1服务(生产者)
docker exec -it kafka1 /bin/bash
# 创建一个主题Topic,起名为first,指明3个分区和3个副本
# 分区可以超过3,副本不能超过3
kafka-topics.sh --bootstrap-server localhost:9092 --create --partitions 3 --replication-factor 3 --topic first
# 生产者发送消息到主题
kafka-console-producer.sh --bootstrap-server localhost:9092 --topic first
# 3. 客户端2进入kafka2服务(消费者)
docker exec -it kafka2 /bin/bash
# 消费者先查看主题列表
kafka-topics.sh --bootstrap-server localhost:9093 --list
# 使用消费者脚本,开始监听消息,相当于进入消费者模式
kafka-console-consumer.sh --bootstrap-server localhost:9093 --topic first
# 4. 客户端1生产者发消息,客户端2消费者消费消息
参考博客: