Kafka做为近几年十分流行,虽然它本身定位为一个分布式流结构平台'distributed streaming platform',可是咱们大部分时间仍是当作是一个MQ来使用:P。javascript
恰好最近也在研究Kafka,须要为准备一下开发环境做为研究开发测使用。java
Docker也是一个十分流行的虚拟应用容器平台,可以将主流的开源框架以容器的方式管理起来,经过组合基础容器,构建出更复杂的应用服务,令构建环境的成本大大下降。例如以前在机器学习的项目里面,很轻松的不影响host环境的状况下,快速的将conda+tenserflow+keras等机器学习主要的开源框架整合起来。不喜欢的话删掉image,从新以新版本构建,也是很是快捷的。docker
适应了这个思路,所以此次环境的搭建,也是以Docker+kafka做为实施的目标,其中的过程,记录下这篇文章做为往后的参考及回顾。shell
上述官方文档也描述的比较清晰了,这里也不在赘述。apache
docker安装能够参考bash
docker-compose安装能够参考框架
有了Docker这个平台以后,每当须要有开源环境的的框架须要搭建,均可以第一时间去docker hub上面找一下有没有对应的官方docker镜像。搜索了一下发型,Kafka并无提供官方的镜像,能找到的都是一些社区维护的镜像包。如:wurstmeister/kafka等。<p>
该镜像虽然不是官方维护的,可是依然有25M+的docker pull,及接近700的点赞量是docker hub上同类型镜像最高的评分。因此这次优先选择这个镜像做服务的基础。机器学习
这里咱们引入docker-compose的概念,对于docker-compose咱们,能够这么理解:docker-Compose = n * docker container = a complex service。tcp
因为Kafka的基于集群的高可用特性是建基于Zookeeper(称zk)之上的,所以构建可用的Kafka镜像,是须要依赖于zk基础的。所以须要用到docker-compose,将不一样的容器组合成为一个完整的的服务。<p>构建创建一个多个container组合的服务,须要独立的docker-compose.yml文件。分布式
version: '3' <!-- docker-compose的兼容版本,能够按实际的docker的大版本号配置 --> services: <!--定义zk层服务--> zookeeper: image: wurstmeister/zookeeper ports: - "2181:2181" <!--定义Kafka层--> kafka: image: wurstmeister/kafka <!--优先使用基础镜像,而不是本地Dockerfile的从新构建方式,实际状况能够与build配置项二选一,所以下面一行注释掉--> <!--build: .--> depends_on: [ zookeeper ] ports: - "9092:9092" environment: KAFKA_ADVERTISED_HOST_NAME: 47.106.143.76 KAFKA_CREATE_TOPICS: "test:1:1" KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 volumes: - /var/run/docker.sock:/var/run/docker.sock
按照上面的docker-compose.yml文件,能够将zk和Kafka整合为一个服务包,这里的基础思路是,可以有基础镜像的,优先使用基础镜像,不然才使用dockerfile的从新构建方式。
docker-compose.yml的对容器进行更进一步的自定义方式,能够参考docker-compose的官方文档。
将路径切换到与docker-compose.yml文件一致的目录下,将定义好的服务打包:
[root@somehost kafka]# docker-compose build zookeeper uses an image, skipping kafka uses an image, skipping
以后就能够使用docker-compose up -d命令将启动
[root@somehost kafka]# docker-compose up -d Starting kafka_kafka_1 ... done Starting kafka_zookeeper_1 ... done [root@somehost kafka]#
相似的中止服务能够使用docker-compose stop命令。
须要注意的是,docker-compose所操做的服务,都是须要根据当前目录下的docker-compose.yml文件所定义,没找到这个定义,docker-compose会没法得知操做哪一个服务。
Docker的服务起来以后,咱们就能够测试服务,这里咱们能够使用docker自带的cli工具进行基本的测试,后续有机会咱们再使用API调用方式测试服务。
首先咱们须要检查已经启动的容器
[root@somehost kafka]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2c3e1aacdd56 wurstmeister/kafka "start-kafka.sh" 2 hours ago Up 2 minutes 0.0.0.0:9092->9092/tcp kafka_kafka_1 20cd04496a9c wurstmeister/zookeeper "/bin/sh -c '/usr/sb…" 2 days ago Up 2 minutes 22/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp kafka_zookeeper_1 [root@somehost kafka]#
从上面能够看到Kafka的container id为2c3e1aacdd56,咱们能够采用下述命令行的方式进入该容器中:
docker exec -it {container id} /bin/bash
[root@somehost kafka]# docker exec -it 2c3e1aacdd56 /bin/bash bash-4.4# bash-4.4# ls -al total 72 drwxr-xr-x 1 root root 4096 Jul 13 02:00 . drwxr-xr-x 1 root root 4096 Jul 13 02:00 .. -rwxr-xr-x 1 root root 0 Jul 13 02:00 .dockerenv drwxr-xr-x 1 root root 4096 Apr 15 16:03 bin drwxr-xr-x 5 root root 340 Jul 13 03:29 dev drwxr-xr-x 1 root root 4096 Jul 13 02:00 etc drwxr-xr-x 2 root root 4096 Jan 9 2018 home drwxr-xr-x 5 root root 4096 Jul 13 02:00 kafka drwxr-xr-x 1 root root 4096 Apr 15 16:03 lib drwxr-xr-x 2 root root 4096 Apr 15 16:03 lib64 drwxr-xr-x 5 root root 4096 Jan 9 2018 media drwxr-xr-x 2 root root 4096 Jan 9 2018 mnt drwxr-xr-x 1 root root 4096 Apr 15 16:03 opt dr-xr-xr-x 101 root root 0 Jul 13 03:29 proc drwx------ 2 root root 4096 Jan 9 2018 root drwxr-xr-x 1 root root 4096 Jul 13 02:00 run drwxr-xr-x 1 root root 4096 Apr 15 16:03 sbin drwxr-xr-x 2 root root 4096 Jan 9 2018 srv dr-xr-xr-x 13 root root 0 Jul 13 03:29 sys drwxrwxrwt 1 root root 4096 Jul 13 03:29 tmp drwxr-xr-x 1 root root 4096 Apr 15 16:03 usr drwxr-xr-x 1 root root 4096 Apr 15 16:03 var bash-4.4#
如上,就能够看见kafka容器里面的内容了。
再执行Kafka-cli的测试工具
<!--配置环境变量--> bash-4.4# export ZK=zookeeper:2181 bash-4.4# echo $ZK zookeeper:2181 <!--运行Kafka提供的CLI系列工具--> bash-4.4# $KAFKA_HOME/bin/kafka-topics.sh --create --topic topic --partitions 4 --zookeeper $ZK --replication-factor 1 Created topic "topic".
至此,一个docker完整的ZK+Kafka容器服务就开启了,虽然离生产节点还有些距离,可是已经能够在上面创建完整的应用开发了。有机会再聊。
Kafka说明文档
docker说明文档
docker-compose说明文档
wurstmeister/kafka docker镜像说明文档