使用docker-compose部署Kafka集群


  之前寫過Kafka集群的部署,不過那是基於宿主機的,地址:Kafka基礎教程(二):Kafka安裝

  和Zookeeper一樣,有時想簡單的連接Kafka用一下,那就需要開好幾台虛擬機,如果Zookeeper部署在其他地方,那還得多開幾台,用完還得關掉,否則太占內存,而且這樣操作甚是繁瑣。

  於是我想了一下,可以使用docker來搭建一個簡單的Zookeeper和Kafak集群,上一篇說了Zookeeper集群的docker實現(使用docker或者docker-compose部署Zookeeper集群),現在說說使用Kafka集群的docker實現。

  首先,我們需要安裝docker(參考:docker簡單安裝

  接下來我們需要鏡像,不幸的是,Kafka沒有官方鏡像,那我們可以自己做一個,或者使用已經做好的鏡像,比如dockerhub上Star最多的wurstmeister/kafka:

  

  由於Kafka需要Zookeeper,如果直接使用docker命令行來操作,那也是一個麻煩事,所以我采用了docker-compose來實現,雖然看GitHub上的教程(點擊跳轉),不過還是遇到了很多坑。

  先將鏡像pull下來:  

    # Zookeeper
    sudo docker pull wurstmeister/zookeeper
    # Kafka
    sudo docker pull wurstmeister/kafka

  然后創建一個空目錄,創建一個 docker-compose.yml ,根據GitHub上的教程,如果只啟動單節點,那么 docker-compose.yml 內容如下:      

# yaml 配
version: '2'
services:
    zookeeper:
        image: wurstmeister/zookeeper
        restart: always
        ports:
            - 2181:2181
    kafka:
        image: wurstmeister/kafka
        restart: always
        depends_on:
            - zookeeper
        ports:
            - 9092:9092
        environment:
            KAFKA_ADVERTISED_HOST_NAME: kafka
            KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181/kafka
            KAFKA_LISTENERS: PLAINTEXT://:9092
            KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.209.128:9092
            KAFKA_BROKER_ID: 1
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock

  如果是要一個kafka集群,那么 docker-compose.yml 內容如下:  

# yaml 配
version: '2'
services:
    zookeeper:
        image: wurstmeister/zookeeper
        restart: always
        ports:
            - 2181:2181
    kafka1:
        image: wurstmeister/kafka
        restart: always
        depends_on:
            - zookeeper
        ports:
            - 9093:9093
        environment:
            KAFKA_ADVERTISED_HOST_NAME: kafka1
            KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181/kafka
            KAFKA_LISTENERS: PLAINTEXT://:9093
            KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.209.128:9093
            KAFKA_BROKER_ID: 1
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
    kafka2:
        image: wurstmeister/kafka
        restart: always
        depends_on:
            - zookeeper
        ports:
            - 9094:9094
        environment:
            KAFKA_ADVERTISED_HOST_NAME: kafka2
            KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181/kafka
            KAFKA_LISTENERS: PLAINTEXT://:9094
            KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.209.128:9094
            KAFKA_BROKER_ID: 2
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
    kafka3:
        image: wurstmeister/kafka
        restart: always
        depends_on:
            - zookeeper
        ports:
            - 9095:9095
        environment:
            KAFKA_ADVERTISED_HOST_NAME: kafka3
            KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181/kafka
            KAFKA_LISTENERS: PLAINTEXT://:9095
            KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.209.128:9095
            KAFKA_BROKER_ID: 3
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock

  另外,還有幾個環境變量需要說明一下:  

    KAFKA_ADVERTISED_HOST_NAME:廣播主機名稱,一般用IP指定
    KAFKA_ZOOKEEPER_CONNECT:Zookeeper連接地址,格式:zoo1:port1,zoo2:port2:/path
    KAFKA_LISTENERS:Kafka啟動所使用的的協議及端口
    KAFKA_ADVERTISED_LISTENERS:Kafka廣播地址及端口,也就是告訴客戶端,使用什么地址和端口能連接到Kafka,這個很重要,如果不指定,宿主機以外的客戶端將無法連接到Kafka,比如我這里因為容器與宿主機做了端口映射,所以廣播地址采用的是宿主機的地址及端口,告訴客戶端只要連接到宿主機的指定端口就行了
    KAFKA_BROKER_ID:指定BrokerId,如果不指定,將會自己生成

  接着創建容器並啟動:  

    # 創建並啟動容器,可以使用 -f 參數指定docker-compose.yml文件
    sudo docker-compose up -d
    # 查看狀態
    sudo docker-compose ps
    # 停止並刪除容器,可以使用 -f 參數指定docker-compose.yml文件
    sudo docker-compose down

  查看狀態,雖然集群啟動了,但是記得連接要使用宿主機的地址和端口來連接。  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM