使用Docker快速創建一個Kafka實例

0 前言

Kafka做爲近幾年十分流行,雖然它本身定位爲一個分佈式流結構平臺'distributed streaming platform',可是咱們大部分時間仍是當作是一個MQ來使用:P。javascript

恰好最近也在研究Kafka,須要爲準備一下開發環境做爲研究開發測使用。java

Docker也是一個十分流行的虛擬應用容器平臺,可以將主流的開源框架以容器的方式管理起來,經過組合基礎容器,構建出更復雜的應用服務,令構建環境的成本大大下降。例如以前在機器學習的項目裏面,很輕鬆的不影響host環境的狀況下,快速的將conda+tenserflow+keras等機器學習主要的開源框架整合起來。不喜歡的話刪掉image,從新以新版本構建,也是很是快捷的。docker

適應了這個思路,所以此次環境的搭建,也是以Docker+kafka做爲實施的目標,其中的過程,記錄下這篇文章做爲往後的參考及回顧。shell

1 安裝docker及docker-compose

上述官方文檔也描述的比較清晰了,這裏也不在贅述。apache

docker安裝能夠參考bash

docker-compose安裝能夠參考框架

2 尋找docker鏡像

有了Docker這個平臺以後,每當須要有開源環境的的框架須要搭建,均可以第一時間去docker hub上面找一下有沒有對應的官方docker鏡像。搜索了一下發型,Kafka並無提供官方的鏡像,能找到的都是一些社區維護的鏡像包。如:wurstmeister/kafka等。<p>
該鏡像雖然不是官方維護的,可是依然有25M+的docker pull,及接近700的點贊量是docker hub上同類型鏡像最高的評分。因此這次優先選擇這個鏡像做服務的基礎。機器學習

3 定義docker-compose

這裏咱們引入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的官方文檔。

4 打包服務

將路徑切換到與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會沒法得知操做哪一個服務。

5 測試服務

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

相關文章
相關標籤/搜索