docker-compose快速搭建kafka集群(较详细)
详细步骤如下:
1、拉取kafka3.0.0的镜像
docker pull bitnami/kafka:3.0.0
2、编写docker compose的yaml配置文件
需要说明一下,当前的网络使用的是之前已经创建的网络【zk-net】,所以在下面的配置文件中只需要进行网络声明一下,之后的服务即可指定net-work了(若是不声明就会报错)。
对应zookeeper的集群部署:docker-compose快速搭建Zookeeper集群
在/home/dockerfiles目录中创建docker-compose-kafkas.yml文件:
version: '3.1'
# 外部网络声明(否则无法使用之前已经定义好的网络) networks: zk-net: external: true services: kafka1: image: 'bitnami/kafka:3.0.0' container_name: kafka1 hostname: kafka1 networks: - zk-net ports: - '9093:9092' environment: - KAFKA_CFG_ZOOKEEPER_CONNECT=zoo1:2181,zoo2:2182,zoo3:2183/kafka - KAFKA_BROKER_ID=1 - KAFKA_INTER_BROKER_LISTENER_NAME=CLIENT - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CLIENT:PLAINTEXT,EXTERNAL:PLAINTEXT - KAFKA_CFG_ADVERTISED_LISTENERS=CLIENT://kafka1:9092,EXTERNAL://kafka1:9093 - KAFKA_CFG_LISTENERS=CLIENT://:9092,EXTERNAL://:9093 - ALLOW_PLAINTEXT_LISTENER=yes kafka2: image: 'bitnami/kafka:3.0.0' container_name: kafka2 hostname: kafka2 networks: - zk-net ports: - '9094:9092' environment: - KAFKA_CFG_ZOOKEEPER_CONNECT=zoo1:2181,zoo2:2182,zoo3:2183/kafka - KAFKA_BROKER_ID=2 - KAFKA_INTER_BROKER_LISTENER_NAME=CLIENT - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CLIENT:PLAINTEXT,EXTERNAL:PLAINTEXT - KAFKA_CFG_ADVERTISED_LISTENERS=CLIENT://kafka2:9092,EXTERNAL://kafka2:9094 - KAFKA_CFG_LISTENERS=CLIENT://:9092,EXTERNAL://:9094 - ALLOW_PLAINTEXT_LISTENER=yes kafka3: image: 'bitnami/kafka:3.0.0' container_name: kafka3 hostname: kafka3 networks: - zk-net ports: - '9095:9092' environment: - KAFKA_CFG_ZOOKEEPER_CONNECT=zoo1:2181,zoo2:2182,zoo3:2183/kafka - KAFKA_BROKER_ID=3 - KAFKA_INTER_BROKER_LISTENER_NAME=CLIENT - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CLIENT:PLAINTEXT,EXTERNAL:PLAINTEXT - KAFKA_CFG_ADVERTISED_LISTENERS=CLIENT://kafka3:9092,EXTERNAL://kafka3:9095 - KAFKA_CFG_LISTENERS=CLIENT://:9092,EXTERNAL://:9095 - ALLOW_PLAINTEXT_LISTENER=yes
KAFKA_CFG_ZOOKEEPER_CONNECT:zookeeper连接的ip地址可以有多个。
KAFKA_BROKER_ID:broker的全局唯一编号,不能重复
KAFKA_INTER_BROKER_LISTENER_NAME:kafka内部的broker监听名称。
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP:监听的协议集合多个。(这里CLIENT指的是内部,EXTERNAL是外部,之后就不能够使用PLAINTEXT作为协议名了,只能够使用定义的CLIENT、EXTERNAL)。
KAFKA_CFG_ADVERTISED_LISTENERS:修改为服务器ip,在真实生产环境中不能是localhost,监听的服务端口有多个。
KAFKA_CFG_LISTENERS:监听地址。
ALLOW_PLAINTEXT_LISTENER:允许使用PLAINTEXT listener监听器。
注意点:①在KAFKA_CFG_ADVERTISED_LISTENERS配置多个监听者的时候端口是不能一样的。
3、启动kafka集群服务
# -f表示指定某个配置文件名 -d:表示后台启动 docker-compose -f docker-compose-kafkas.yml up -d
如何测试是否已经连接zookeeper呢?
# 进入zookeeper集群中的某一个服务 docker exec -it zoo2 /bin/bash # 进入bin目录 cd bin # 客户端工具连接到服务 ./zkCli.sh -server 127.0.0.1:2181 # 查看对应的kafka结点信息 ls /kafka/brokers/ids
搭建成功如下信息所示:
搭建zookeeper集群以及kafka集群所需内存如下:
若是你的集群中某个服务没有启动起来,可以使用如下查看指定服务日志:
docker logs 服务名
**注意:**停止 Kafka 集群时,一定要等 Kafka 所有节点进程全部停止后再停止 Zookeeper集群。因为 Zookeeper 集群当中记录着 Kafka 集群相关信息,Zookeeper 集群一旦先停止,Kafka 集群就没有办法再获取停止进程的信息,只能手动杀死 Kafka 进程了。
docker-compose快速搭建Zookeeper集群+kafka集群
创建文件:docker-compose-zookeepers-kafkas.yml
注意:为了能够Java连接到容器中的kafka,在每个kafka服务中我没有设置其他协议别名,就是单独使用了一个PLAINTEXT,并且每个服务都各自映射自己端口,而不是之前的8083:8082,8084:8082。
我自己的话也试过定义多个协议名方案不过都不行,只能最终方案选择这个。
准备操作:查看你的公网ip地址或者你的虚拟机ip地址。
拿到这个ip地址后去修改下面配置中对应的ip地址,只有这样你的java程序才能够发送消息成功并接收!
version: '3.1' networks: zk-net: # 网络名 name: 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 hostname: kafka1 networks: - zk-net ports: - '9092:9092' environment: - KAFKA_CFG_ZOOKEEPER_CONNECT=zoo1:2181,zoo2:2182,zoo3:2183/kafka - KAFKA_BROKER_ID=1 - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092 - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.10.105:9092 - ALLOW_PLAINTEXT_LISTENER=yes depends_on: - zoo1 - zoo2 - zoo3 kafka2: image: 'bitnami/kafka:3.0.0' container_name: kafka2 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.10.105:9093 - ALLOW_PLAINTEXT_LISTENER=yes depends_on: - zoo1 - zoo2 - zoo3 kafka3: image: 'bitnami/kafka:3.0.0' container_name: kafka3 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.10.105:9094 - ALLOW_PLAINTEXT_LISTENER=yes depends_on: - zoo1 - zoo2 - zoo3
启动服务命令:
# -f表示指定某个配置文件名 -d:表示后台启动 docker-compose -f docker-compose-zookeepers-kafkas.yml up -d # 查看当前服务 docker ps