前言
kafka3.3.1版本的kraft已经标记为生产就绪了。抛弃了zookeeper,部署起来也会方便一些,但是在通过docker部署的时候遇到了一些问题,在这里记录一下。
Docker镜像构建
官方quickstartdemo中讲如果使用kraft,需要先对存储路径进行格式化。这个在构建镜像过程中遇到了问题。因为之前构建镜像的时候没有遇到过这种需要先初始化再构建的情况。研究后发现,可以通过脚本初始化。
创建docker-entrypoint.sh脚本。如果执行脚本的时候指定init参数就初始化存储路径,否则不初始化。
#!/bin/bash
if [ "$1" = 'init' ]; then
KAFKA_CLUSTER_ID="$(bin/kafka-storage.sh random-uuid)"
bin/kafka-storage.sh format -t $KAFKA_CLUSTER_ID -c config/kraft/server.properties
echo "formated ..."
fi
bin/kafka-server-start.sh config/kraft/server.properties
编写dockerfile,将上述脚本拷贝到镜像中
FROM openjdk:8
MAINTAINER aspirin
ENV LANG=C.UTF-8
ENV TZ=Asia/Shanghai
COPY kafka_2.12-3.3.1.tgz /opt
RUN cd /opt && tar -zxvf kafka_2.12-3.3.1.tgz -C /opt
RUN rm -rf kafka_2.12-3.3.1.tgz
COPY docker-entrypoint.sh /opt/kafka_2.12-3.3.1
WORKDIR /opt/kafka_2.12-3.3.1
ENTRYPOINT ["/bin/bash", "docker-entrypoint.sh" ]
构建镜像
docker build -t ss/kafka:2.12-3.3.1 .
这样在首次启动镜像的适合指定init参数,之后不再指定参数即可解决。
Docker容器外无法访问已经启动kafka容器,但是容器内可以
在server.properties配置文件中,kafka有两个参数,advertised.listeners和listeners。可以查看官方文档说明。当然不看也罢,越看越迷糊。
大概意思就是说listeners参数是内网通信用的,但是像docker这种可以理解为是通过外网通信了,这时候不止需要配置listeners,还需要配置advertised.listeners,这个是外网通信用的,可以理解为这个参数是对内网地址的代理。这个参数需要写docker宿主机的ip地址,端口写启动docker容器时候映射的端口。
说的有点绕,先上配置看一下:
listeners=PLAINTEXT://0.0.0.0:9092,CONTROLLER://:9093
advertised.listeners=PLAINTEXT://192.168.2.3:9092
第一行配置值为0.0.0.0:9092,这个地址可写localhost(试过了不可以是localhost)也可以写回环地址0.0.0.0
第二行的配置值,192.168.2.3这个ip是docker容器宿主机的ip。9092需要跟第一行保持一致。因为kafka是启动在9092端口上的,如果改成1092,肯定不对,因为1092这个端口就没有被程序使用。这里写了9092,docker容器创建时候映射的也是这个端口,而且需要保持一致。
疑问:docker容器创建的时候将9092映射成其他的可以吗?没有尝试过,应该是不可以。有兴趣可以尝试一下,如果非要修改端口建议将上述所有9092同时修改为其他端口。文章来源:https://www.toymoban.com/news/detail-404640.html
可以看到我下面容器启动映射的端口也是9092.文章来源地址https://www.toymoban.com/news/detail-404640.html
afae7c849595 ss/kafka:2.12-3.3.1 "/bin/bash docker-en…" About a minute ago Up About a minute 0.0.0.0:9092->9092/tcp, :::9092->9092/tcp kafka331
到了这里,关于Kafka3.3.1 docker镜像构建及使用说明的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!