docker-compose→kafka镜像制作,kraft集群容器编排一键启动

为什么我会想自己去写一个镜像
我开始也是用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: 这个是我花了一整天时间整理出来的,亲测可用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容