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鏡像說明文檔