为什么我会想自己去写一个镜像
我开始也是用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
-
最终的目录结构
每个kraft中都有两个配置文件meta.properties和server.properties
我这里是在kafka目录下执行docker-compose命令
-d: 后台启动
--build: dockerfile编译镜像命令
docker-compose up -d --build
成果图
测试:
进入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
随便输入点
PS: 这个是我花了一整天时间整理出来的,亲测可用