Docker部署單節點Kafka


pull 拉取鏡像

wurstmeister/zookeeper Overview

docker pull wurstmeister/zookeeper

wurstmeister/kafka Overview

docker pull wurstmeister/kafka

部署單Broker

定義 docker-compose-single-broker.yml:

version: '3.8'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
  kafka:
    image: wurstmeister/kafka
    depends_on: [ zookeeper ]
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: kafka
      KAFKA_CREATE_TOPICS: "test:1:1"
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - D:\var\run\docker.sock:/var/run/docker.sock

kafka 環境變量:

  • KAFKA_ADVERTISED_HOST_NAME:你可以修改主機名來以匹配docker主機IP。注意:如果要運行多個Broker,請不要使用localhost或127.0.0.1作為主機ip
  • KAFKA_CREATE_TOPICS:kafka-docker在創建期間自動在kafka中創建主題,例如 test:1:1 表示主題test包含1個分區和1個副本。
  • KAFKA_ZOOKEEPER_CONNECT:現在是強制的環境變量,表示kafka的zookeeper connect string。

KAFKA_ADVERTISED_HOST_NAME: 192.168.220.150,類似這種 hostName用ip的,一直出錯,關鍵報錯信息如下:

Error while fetching metadata with correlation id xxx {test=LEADER_NOT_AVAILABLE}

修改為 KAFKA_ADVERTISED_HOST_NAME: kafka,驗證可行!

kafka depends-on:

  • 指定 zookeeper 在 kafka 前面啟動。

kafka volumes 卷映射:

  • 宿主機中的文件路徑:容器中的文件路徑,而我的宿主機是Windows主機。

參考自 Github kafka-docker

GitHub 上的文件 build: . 修改為 image: wurstmeister/kafka,修改前會出現以下錯誤:

failed to solve with frontend dockerfile.v0: failed to read dockerfile: open /var/lib/docker/tmp/buildkit-mount698554617/Dockerfile: no such file or directory
ERROR: Service 'kafka' failed to build : Build failed

啟動與停止命令

首先需要 cd 進入 docker-compose-single-broker.yml 所在目錄:

F:
cd Docker\kafka

啟動命令:

docker-compose -f docker-compose-single-broker.yml up -d

結尾不加 -d 會占用當前命令行窗口。因為按 Ctrl + C 會自動 stop 容器。

停止命令:

docker-compose -f docker-compose-single-broker.yml stop

停止並刪除容器命令:

docker-compose -f docker-compose-single-broker.yml down

測試驗證:

1、使用 docker ps 查看 zookeeper 和 kafka 容器是否已經正常運行:

2、進入 kafka 容器控制台:

docker exec -it kafka_kafka_1 bash

3、進入 kafka 容器中的 bin 目錄:

cd $KAFKA_HOME/bin
pwd

pwd 用來打印當前工作目錄,方便我們確認是否切換成功

4、檢查自動創建的主題 test:

kafka-topics.sh --zookeeper kafka_zookeeper_1:2181 --describe --topic test

5、在一個cmd窗口發布消息:

kafka-console-producer.sh --topic=test --broker-list kafka_kafka_1:9092

6、打開另一個cmd窗口,重復1-3步,訂閱消息:

kafka-console-consumer.sh --bootstrap-server kafka_kafka_1:9092 --from-beginning --topic test

參考文檔

  • Compose file version 3 reference 閱讀
  • Use volumes 閱讀
  • kafka-docker 閱讀
  • docker部署kafka 閱讀
  • Error while fetching metadata with correlation id : {LEADER_NOT_AVAILABLE} 正確處理姿勢 閱讀

關於 broker.id=-1:

參考自 Kafka參數broker.id詳解 閱讀

一開始我以為config/server.properties 中 broker.id=-1 有問題;但是實際上,這是合法的。因為真正的 broker.id 會保存在 log.dir 目錄下的 meta.properties 中。這個文件在kafka啟動時創建。

首先,我們進入 zookeeper 容器,並打開 zookeeper 客戶端:

D:\>docker exec -it kafka_zookeeper_1 bash
root@f4d9db43d301:/opt/zookeeper-3.4.13# bin/zkCli.sh

接着查看結點信息:

[zk: localhost:2181(CONNECTED) 0] ls /brokers/ids
[1001]

我們看到存在一個id為1001的節點。

但是,我們進入 kafka 容器,並查看 server.properties 中的 broker.id 屬性:

F:\Docker\kafka>docker exec -it kafka_kafka_1 bash
bash-5.1# cd $KAFKA_HOME
bash-5.1# cat config/server.properties | grep broker.id
broker.id=-1

那真的表示不對應嗎?答案是否定的。

還是在 kafka 容器中,查看 server.properties 中的 log.dirs 屬性:

bash-5.1# cat config/server.properties | grep log.dirs
log.dirs=/kafka/kafka-logs-8ea8aa68e5a5

順藤摸瓜,查看日志文件夾下的 meta.properties 中的 broker.id 屬性:

bash-5.1# cat /kafka/kafka-logs-8ea8aa68e5a5/meta.properties
#
#Thu Aug 12 08:43:58 GMT 2021
cluster.id=vAGFzDVHRLu_06_1DM03Og
version=0
broker.id=1001

所以,kafka節點的id 以 log文件夾下的 meta.properties 中的 broker.id為准。


免責聲明!

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



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