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 上的文件
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為准。
