美文网首页
docker-compose→kafka镜像制作,kraft集群

docker-compose→kafka镜像制作,kraft集群

作者: 怎么肥细 | 来源:发表于2023-02-07 10:14 被阅读0次

    为什么我会想自己去写一个镜像
    我开始也是用stars最多的镜像也就是bitnami/kafka,但是我发现这个镜像在做kraft集群的时候有问题,就是它没办法选择配置文件启动,一直用的和zookeeper一起启动的配置文件启动,然后镜像我又没办法控制,所以我干脆就自己写了一个

    vim dockerfile.kafka

    FROM openjdk:8
    LABEL org.opencontainers.image.authors="******@qq.com"
    ENV LANG C.UTF-8
    ENV TZ=Asia/Shanghai
    
    WORKDIR /data/
    
    COPY start-kafka.sh /data
    
    EXPOSE 9092
    
    # kafka镜像版本写死的
    # 有需求可以自己改
    RUN wget https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/3.3.2/kafka_2.13-3.3.2.tgz
    RUN tar zxvf kafka_2.13-3.3.2.tgz
    RUN rm kafka_2.13-3.3.2.tgz
    RUN mv kafka_2.13-3.3.2 kafka
    
    # 给启动脚本增加可执行权限
    RUN chmod +x /data/start-kafka.sh
    # 创建日志目录
    # 启动时会要求你在这个目录下创建一个meta.properties配置文件,并且需要添加一些配置,下面直接映射的
    RUN mkdir -p /data/kafka/kraftlog/kraft-combined-logs
    
    CMD ["bash", "/data/start-kafka.sh"]
    

    vim start-kafka.sh

    # 采用kraft模式启动
    /data/kafka/bin/kafka-server-start.sh -daemon /data/kafka/config/kraft/server.properties
    tail -F /data/kafka/logs/server.log
    

    编辑docker-compose.yaml文件

    vim docker-compose.yaml

    version: "3"
    
    networks:
      es-net:
        external: true
    
    services:
      kafka1:
        build: 
          context: .
          dockerfile: Dockerfile.kafka
        container_name: kafka1
        user: root
        ports:
         - 9192:9092
         - 9193:9093
        volumes:
         # 注意这个挂载的配置文件在下面
         - ./config/kraft1/server.properties:/data/kafka/config/kraft/server.properties
         - ./config/kraft1/meta.properties:/data/kafka/kraftlog/kraft-combined-logs/meta.properties
        networks:
         - es-net
    
      kafka2:
        build: 
          context: .
          dockerfile: Dockerfile.kafka
        container_name: kafka2
        user: root
        ports:
         - 9292:9092
         - 9293:9093
        volumes:
         - ./config/kraft2/server.properties:/data/kafka/config/kraft/server.properties
         - ./config/kraft2/meta.properties:/data/kafka/kraftlog/kraft-combined-logs/meta.properties
        networks:
         - es-net
         
      kafka3:
        build: 
          context: .
          dockerfile: Dockerfile.kafka
        container_name: kafka3
        user: root
        ports:
         - 9392:9092
         - 9393:9093
        volumes:
         - ./config/kraft3/server.properties:/data/kafka/config/kraft/server.properties
         - ./config/kraft3/meta.properties:/data/kafka/kraftlog/kraft-combined-logs/meta.properties
        networks:
         - es-net
    

    接下来是两个配置文件

    • 创建三个容器的配置映射目录

    mkdir -p config/kraft1 config/kraft2 config/kraft3
    cd config/kraft1
    vim server.properties

    • server.properties配置文件
    • 三个配置文件不一样的地方只有下面两个配置
    • broker.id
    • advertised.listeners
      这里我只写一个,其他两个server.properties配置文件把这两个属性改好,放到对应目录就行
      比如: config/kraft2中的配置是 broker.id=2
      而advertised.listeners这个配置则是要写当前容器映射到宿主机的端口,因为ip是不变的嘛
      比如: config/kraft2中的配置是 advertised.listeners=92.168.31.114:9292
      config/kraft3的server.properties同理改
    num.network.threads=3
    num.io.threads=8
    socket.send.buffer.bytes=102400
    socket.receive.buffer.bytes=102400
    socket.request.max.bytes=104857600
    num.partitions=1
    num.recovery.threads.per.data.dir=1
    offsets.topic.replication.factor=1
    transaction.state.log.replication.factor=1
    transaction.state.log.min.isr=1
    log.retention.hours=168
    log.segment.bytes=1073741824
    log.retention.check.interval.ms=300000
    group.initial.rebalance.delay.ms=0
    
    # 指定供外部使用的控制类请求信息
    controller.listener.names=CONTROLLER
    
    # 节点角色
    process.roles=broker,controller
     
    #节点ID,唯一
    broker.id=1
     
    # 集群地址
    controller.quorum.voters=1@kafka1:9093,2@kafka2:9093,3@kafka3:9093
    
    # 定义安全协议
    listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
     
    advertised.listeners=PLAINTEXT://192.168.31.114:9192
    
    listeners=PLAINTEXT://:9092,CONTROLLER://:9093
    inter.broker.listener.name=PLAINTEXT
     
    # 这里我修改了日志文件的路径,默认是在/tmp目录下的
    log.dirs=/data/kafka/kraftlog/kraft-combined-logs
    
    • meta.properties配置文件
    • 三个配置文件不一样的地方只有下面两个配置
    • broker.id
    • node.id
      这里我只写一个,其他两个meta.properties配置文件把这两个属性改好,放到对应目录就行
      这里的broker.id需要和server.properties中的保持一致
      比如: config/kraft2中的配置是 broker.id=2
      node.id也和broker.id保持一样的规则就行,不需要太关注
      比如: config/kraft2中的配置是 node.id=2
      config/kraft3的meta.properties同理改

    vim meta.properties

    version=1
    broker.id=1
    cluster.id=rXyObQbRT2OSzqwLT4tXsw
    node.id=1
    

    cluster.id可以到容器中去生成,现在先启动,不用管
    生成好了更新到配置文件,重启容器即可
    生成命令

    ./kafka/bin/kafka-storage.sh random-uuid

    • 最终的目录结构
      image.png
      image.png
      每个kraft中都有两个配置文件meta.properties和server.properties

    我这里是在kafka目录下执行docker-compose命令
    -d: 后台启动
    --build: dockerfile编译镜像命令

    docker-compose up -d --build

    成果图

    image.png

    测试:

    进入sudo docker exec -it kafka1 /bin/bash
    再开一个窗口进入sudo docker exec -it kafka1 /bin/bash
    简称窗口1,窗口2

    • 窗口1输入
      创建topic:
      ./kafka/bin/kafka-topics.sh --create --topic test --partitions 1 --replication-factor 1 --bootstrap-server 127.0.0.1:9092
      开启消费者:
      ./kafka/bin/kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 --topic test
    • 窗口2输入
      开启生产者:
      ./kafka/bin/kafka-console-producer.sh --broker-list 127.0.0.1:9092 --topic test
      随便输入点


      image.png

    PS: 这个是我花了一整天时间整理出来的,亲测可用

    相关文章

      网友评论

          本文标题:docker-compose→kafka镜像制作,kraft集群

          本文链接:https://www.haomeiwen.com/subject/clvtkdtx.html