Docker下kafka學習三部曲之二:本地環境搭建

在上一章《 Docker下kafka學習,三部曲之一:極速體驗kafka》中咱們快速體驗了kafka的消息分發和訂閱功能,可是對環境搭建的印象僅僅是執行了幾個命令和腳本,本章咱們經過實戰來學習如何編寫這些腳本,搭建本地kafka環境;java

本次實踐會製做docker鏡像,所用的材料請在此獲取:https://github.com/zq2599/docker_kafkagit

整個環境涉及到多個容器,咱們先把它們所有列出來,再梳理一下之間的關係,以下圖:程序員

這裏寫圖片描述

kafka sever提供消息服務; message producer的做用是產生執行主題的消息; message consumer的做用是訂閱指定主題的消息並消費掉。github

###zookeeper### zookeeper使用單機版,沒什麼須要定製的,所以直接使用官方鏡像便可,daocloud.io/library/zookeeper:3.3.6docker

###kafka sever### 去hub.docker.com上搜索kafka,沒看到官方標誌的鏡像,仍是本身作一個吧,寫Dockerfile以前先準備兩個材料:kafka安裝包和啓動kafka的shell腳本;shell

kafka安裝包用的是2.9.2-0.8.1版本,在 git@github.com:zq2599/docker_kafka.git中,請clone獲取;tomcat

啓動kafka server的shell腳本內容以下,很簡單,在kafka的bin目錄下執行腳本啓動server便可:bash

#!/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 <zq2599@gmail.com>

#定義工做目錄
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的別名;ui

Dockerfile編寫完成後,和kafka_2.9.2-0.8.1.tgz以及start_server.sh放在同一個目錄下,用控制檯在此目錄下執行:

docker build -t bolingcavalry/kafka:0.0.1 .

鏡像構建成功後,新建一個目錄編寫docker-compose.yml腳本,以下:

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.yml中配置了四個容器:

  1. zookeeper是官方的;
  2. 其餘三個都是用剛剛製做的bolingcavalry/kafka作鏡像生成的;
  3. kafka_server在啓動時執行了start_server.sh腳本把服務啓動起來了;
  4. message_producer和message_consumer都僅僅是將kafka環境安裝好了,以便於經過命令行發送或者訂閱消息,可是這兩個容器自己並未啓動server;
  5. kafka_server,message_producer,message_consumer都經過link參數鏈接到了zookeeper容器,而且message_producer還鏈接到了kafka server,由於發送消息的時候會用到kafka server的ip地址;

如今打開終端,在docker-compose.yml所在目錄下執行<font color="blue">docker-compose up -d</font>,便可啓動全部容器;

至此,本地環境搭建已經成功了,咱們能夠經過命令行體驗kafka的消息發佈訂閱服務,具體的命令能夠參考上一章《 Docker下kafka學習,三部曲之一:極速體驗kafka》

以上就是本地搭建kafka的全過程,下一章咱們開發java應用來體驗kafka的消息發佈訂閱服務。

歡迎關注個人公衆號:程序員欣宸

相關文章
相關標籤/搜索