前言
平常在开发的时候经常需要使用某些软件协同进行功能调试,比如说,在做基于Flink CDC的时候,需要将数据从mysql binlog导入到kafka,然后再导入到hudi数据湖。
那么问题就来了,要做这么一件事情,我需要先起一个mysql,一个kafka,一个yarn集群、一个hdfs集群,让整体环境都运行起来了,我才能够使用Flink进行测试和验证。当然,假如你有一个常驻的服务运行上述环境,这些问题就都不是问题了。
但是假如说我们只有一台自己的开发主机,那可能就会比较棘手了。要完成上面的任务,我们可能首先需要在主机上安装虚拟机,然后在虚拟机上安装上述环境,在需要测试的时候,每次都启动虚拟机,然后进入虚拟机再启动各种环境。当然,这是一个可行的方法,但是,可能不是最有效的方法,今天要和大家介绍的是基于镜像构建开发环境的方法。
构建kafka镜像,在docker中运行kafka环境
下面以kafka为例介绍如何构建kafka镜像。
在构建此镜像之前,我们应该有个设想,在写Dockerfile的时候应该使整个项目是完全灵活的,也就是说,至少我们能够在进行极少数修改的情况下完全支持kafka的升级。
下述代码可见:GitHub - xiaozhch5/dockerfile
基于上述原则,我们可以这样子写:
- 将zookeeper以及kafka的版本号抽象为构建参数,在构建时指定
- 提前写好配置文件信息
- 暴露2181以及9092端口
其Dockerfile为:
FROM centos:centos7.9.2009
WORKDIR /data
ARG ZK_VERSION=3.7.1
ARG KAFKA_SCALA_VERSION=2.12
ARG KAFKA_VERSION=2.8.2
COPY start-kafka.sh /data
COPY zoo.cfg /data
COPY server.properties /data
EXPOSE 2181 9092
RUN yum update -y
RUN yum install wget java-1.8.0-openjdk-devel java-1.8.0-openjdk -y
RUN wget https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/${KAFKA_VERSION}/kafka_${KAFKA_SCALA_VERSION}-${KAFKA_VERSION}.tgz
RUN wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-${ZK_VERSION}/apache-zookeeper-${ZK_VERSION}-bin.tar.gz
RUN tar zxvf kafka_${KAFKA_SCALA_VERSION}-${KAFKA_VERSION}.tgz
RUN tar zxvf apache-zookeeper-${ZK_VERSION}-bin.tar.gz
RUN ln -s kafka_${KAFKA_SCALA_VERSION}-${KAFKA_VERSION} kafka
RUN ln -s apache-zookeeper-${ZK_VERSION}-bin zookeeper
RUN cp /data/zoo.cfg /data/zookeeper/conf
RUN cp /data/server.properties /data/kafka/config
RUN mkdir /data/zookeeper/data
RUN mkdir /data/kafka/kafka-logs
CMD ["bash", "/data/start-kafka.sh"]
在上述Dockerfile中,
start-kafka.sh
为kafka组件的启动脚本zoo.cfg
为zookeeper的配置文件server.properties
为kafka的配置文件
上述三个文件需要事先提供并打入到此镜像中,其内容如下:
start-kafka.sh
/data/zookeeper/bin/zkServer.sh start
/data/kafka/bin/kafka-server-start.sh -daemon /data/kafka/config/server.properties
tail -F /data/kafka/logs/server.log
zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
clientPort=2181
server.properties
broker.id=0
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/data/kafka/kafka-logs
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
zookeeper.connect=localhost:2181
zookeeper.connection.timeout.ms=18000
group.initial.rebalance.delay.ms=0
最后将上述Dockerfile、start-kafka.sh、zoo.cfg、server.properties放入同一目录中,执行如下命令进行构建:(默认使用Dockerfile中指定的zookeeper、kafka版本)
docker build . --tag xiaozhch5/kafka:2.8.1 --no-cache=true
构建完成之后即可看到类似如下输出:
C:\bigdata\dockerfile\kafka>docker build . --tag xiaozhch5/kafka:2.8.1 --no-cache=true
[+] Building 98.4s (22/22) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 1.06kB 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/centos:centos7.9.2009 1.2s
=> [ 1/17] FROM docker.io/library/centos:centos7.9.2009@sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 100B 0.0s
=> CACHED [ 2/17] WORKDIR /data 0.0s
=> [ 3/17] COPY start-kafka.sh /data 0.0s
=> [ 4/17] COPY zoo.cfg /data 0.0s
=> [ 5/17] COPY server.properties /data 0.0s
=> [ 6/17] RUN yum update -y 23.1s
=> [ 7/17] RUN yum install wget java-1.8.0-openjdk-devel java-1.8.0-openjdk -y 28.8s
=> [ 8/17] RUN wget https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/2.8.1/kafka_2.12-2.8.1.tgz 16.2s
=> [ 9/17] RUN wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz 7.9s
=> [10/17] RUN tar zxvf kafka_2.12-2.8.1.tgz 1.3s
=> [11/17] RUN tar zxvf apache-zookeeper-3.7.0-bin.tar.gz 14.4s
=> [12/17] RUN ln -s kafka_2.12-2.8.1 kafka 0.5s
=> [13/17] RUN ln -s apache-zookeeper-3.7.0-bin zookeeper 0.6s
=> [14/17] RUN cp /data/zoo.cfg /data/zookeeper/conf 0.6s
=> [15/17] RUN cp /data/server.properties /data/kafka/config 0.7s
=> [16/17] RUN mkdir /data/zookeeper/data 0.6s
=> [17/17] RUN mkdir /data/kafka/kafka-logs 0.6s
=> exporting to image 1.6s
=> => exporting layers 1.6s
=> => writing image sha256:07acb689dbae2445117a823003fbde7df67e3edd5c26c11acaaaa6409a7ea700 0.0s
=> => naming to docker.io/xiaozhch5/kafka:2.8.1
在构建完我们需要的镜像时,就可以使用该镜像运行kafka环境进行开发测试。
基于上述kafka镜像启动容器:
docker run -itd -p 2181:2181 -p 9092:9092 xiaozhch5/kafka:2.8.1
至此,我们就可以基于上述kafka环境进行开发测试。
总结
我们平常开发时,其实会遇到各种各样的环境(组件不同、版本不同等),基于docker启动容器运行我们自己构建的镜像是一个行之有效的方法。