在上一章《 Docker 下 kafka 学习, 三部曲之一: 极速体验 kafka》中我们快速体验了 kafka 的消息分发和订阅功能, 但是对环境搭建的印象仅仅是执行了几个命令和脚本, 本章我们通过实战来学习如何编写这些脚本, 搭建本地 kafka 环境;
本次实践会制作 docker 镜像, 所用的材料请在此获取: https://github.com/zq2599/docker_kafka
整个环境涉及到多个容器, 我们先把它们全部列出来, 再梳理一下之间的关系, 如下图:
kafka sever 提供消息服务;
message producer 的作用是产生执行主题的消息;
message consumer 的作用是订阅指定主题的消息并消费掉.
zookeeper
zookeeper 使用单机版, 没什么需要定制的, 因此直接使用官方镜像即可, daocloud.io/library/zookeeper:3.3.6
kafka sever
去 hub.docker.com 上搜索 kafka, 没看到官方标志的镜像, 还是自己做一个吧, 写 Dockerfile 之前先准备两个材料: kafka 安装包和启动 kafka 的 shell 脚本;
kafka 安装包用的是 2.9.2-0.8.1 版本, 在
[email protected]:zq2599/docker_kafka.Git 中, 请 clone 获取;
启动 kafka server 的 shell 脚本内容如下, 很简单, 在 kafka 的 bin 目录下执行脚本启动 server 即可:
- #!/bin/bash
- $WORK_PATH/$KAFKA_PACKAGE_NAME/bin/kafka-server-start.sh $WORK_PATH/$KAFKA_PACKAGE_NAME/config/server.properties
接下来可以编写 Dockerfile 了, 如下:
- # Docker image of kafka
- # VERSION 0.0.1
- # Author: bolingcavalry
- # 基础镜像使用 tomcat, 这样可以免于设置 java 环境
- FROM daocloud.io/library/tomcat:7.0.77-jre8
- # 作者
- MAINTAINER BolingCavalry <[email protected]>
- # 定义工作目录
- ENV WORK_PATH /usr/local/work
- # 定义 kafka 文件夹名称
- ENV KAFKA_PACKAGE_NAME kafka_2.9.2-0.8.1
- # 创建工作目录
- RUN mkdir -p $WORK_PATH
- # 把启动 server 的 shell 复制到工作目录
- COPY ./start_server.sh $WORK_PATH/
- # 把 kafka 压缩文件复制到工作目录
- COPY ./$KAFKA_PACKAGE_NAME.tgz $WORK_PATH/
- # 解压缩
- RUN tar -xvf $WORK_PATH/$KAFKA_PACKAGE_NAME.tgz -C $WORK_PATH/
- # 删除压缩文件
- RUN rm $WORK_PATH/$KAFKA_PACKAGE_NAME.tgz
- # 执行 sed 命令修改文件, 将连接 zk 的 ip 改为 link 参数对应的 zookeeper 容器的别名
- RUN sed -i 's/zookeeper.connect=localhost:2181/zookeeper.connect=zkhost:2181/g' $WORK_PATH/$KAFKA_PACKAGE_NAME/config/server.properties
- # 给 shell 赋予执行权限
- RUN chmod a+x $WORK_PATH/start_server.sh
如脚本所示, 操作并不复杂, 复制解压 kafka 安装包, 启动 shell 脚本, 再把配置文件中 zookeeper 的 ip 改成 link 时 zookeeper 的别名;
Dockerfile 编写完成后, 和 kafka_2.9.2-0.8.1.tgz 以及 start_server.sh 放在同一个目录下, 用控制台在此目录下执行:
docker build -t bolingcavalry/kafka:0.0.1 .
镜像构建成功后, 新建一个目录编写 docker-compose.YAML 脚本, 如下:
- version: '2'
- services:
- zk_server:
- image: daocloud.io/library/zookeeper:3.3.6
- restart: always
- kafka_server:
- image: bolingcavalry/kafka:0.0.1
- links:
- - zk_server:zkhost
- command: /bin/sh -c '/usr/local/work/start_server.sh'
- restart: always
- message_producer:
- image: bolingcavalry/kafka:0.0.1
- links:
- - zk_server:zkhost
- - kafka_server:kafkahost
- restart: always
- message_consumer:
- image: bolingcavalry/kafka:0.0.1
- links:
- - zk_server:zkhost
- restart: always
docker-compose.YAML 中配置了四个容器:
zookeeper 是官方的;
其他三个都是用刚刚制作的 bolingcavalry/kafka 做镜像生成的;
kafka_server 在启动时执行了 start_server.sh 脚本把服务启动起来了;
message_producer 和 message_consumer 都仅仅是将 kafka 环境安装好了, 以便于通过命令行发送或者订阅消息, 但是这两个容器本身并未启动 server;
kafka_server,message_producer,message_consumer 都通过 link 参数连接到了 zookeeper 容器, 并且 message_producer 还连接到了 kafka server, 因为发送消息的时候会用到 kafka server 的 ip 地址;
现在打开终端, 在 docker-compose.YAML 所在目录下执行 docker-compose up -d, 即可启动所有容器;
至此, 本地环境搭建已经成功了, 我们可以通过命令行体验 kafka 的消息发布订阅服务, 具体的命令可以参考上一章《 Docker 下 kafka 学习, 三部曲之一: 极速体验 kafka》.
以上就是本地搭建 kafka 的全过程, 下一章我们开发 java 应用来体验 kafka 的消息发布订阅服务.
来源: http://www.bubuko.com/infodetail-3202632.html