docker-compose在虚拟机上搭建zookeeper+kafka3.0.0集群

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

注意事项

  1. 文件中KAFKA_CFG_ADVERTISED_LISTENERS属性的IP替换为你自己虚拟机的IP。
  2. 建立docker-compose-zookeepers-kafkas.yml文件,将代码复制进去
  3. 将文件放入虚拟机中,命令行切换到yml文件所在目录
  4. 运行指令:docker-compose -f docker-compose-zookeepers-kafkas.yml up -d
  5. 使用docker ps查看总共六个容器是否启动成功
  6. 验证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之间的连接没有问题
  1. 验证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消费者消费消息

参考博客:

https://blog.csdn.net/cl939974883/article/details/126511784

相关推荐
plusplus16814 分钟前
Kubernetes“城市规划”指南:告别资源拥堵与预算超支,打造高效云原生都市
云原生·容器·kubernetes
m0_515790411 小时前
【深度学习实战(55)】记录一次在新服务器上使用docker的流程
docker
qq_312920112 小时前
K8s存储类(StorageClass)设计与Ceph集成实战
ceph·容器·kubernetes
Nazi62 小时前
kubeadm部署k8s集群环境搭建
云原生·容器·kubernetes
Brilliantee4042 小时前
藏在 K8s 幕后的记忆中枢(etcd)
容器·kubernetes·etcd
草明2 小时前
docker stats 增加一列容器名称的显示
java·开发语言·docker
焯集新人3 小时前
K8S高可用集群
云原生·容器·kubernetes
楚禾Noah4 小时前
【通用常识】YAML 中的高阶语法
运维·docker·容器
东心十12 小时前
Win11安装WSL、Docker Desktop
运维·docker·容器
tb_first15 小时前
k8sday13数据存储(1.5/2)
linux·运维·服务器·云原生·容器·kubernetes