Docker在很多時候都可以幫助我們快速搭建想要的開發(fā)環(huán)境姜盈,免去了很多安裝配置上的麻煩。在涉及到Apache Kafka的快速demo時,使用Docker Hub上提供的鏡像也是一個很好的選擇锅很。
Kafka & ZooKeeper Docker鏡像
spotify/kafka
在demo時窿冯,很多情況下我們并不追求Kafka與ZooKeeper的區(qū)隔赵抢,來自spotify的kafka鏡像同時包含了kafka與zookeeper剧蹂,因此基本上可以“隨裝隨用”。
但已經(jīng)較長時間沒有維護烦却,Kafka版本仍然停留在0.10宠叼。對需要使用1.0版本的同仁已經(jīng)不適合了。
landoop/fast-data-dev
提供了一整套包括Kafka其爵,ZooKeeper冒冬,Schema Registry,,Kafka-Connect等在內(nèi)的多種開發(fā)工具和Web UI監(jiān)視系統(tǒng)摩渺〖蚩荆基本上是我見過的最強大的開發(fā)環(huán)境。尤其是對于Kafka Connect的支持摇幻,包含了MongoDB横侦,ElasticSearch,Twitter等超過20種Connector绰姻,并且提供了通過REST API提交Connector配置的Web UI枉侧。
基本是我測試Kafka Connect的首選。
wurstmeister/kafka
維護較為頻繁的一個Kafka鏡像狂芋。只包含了Kafka榨馁,因此需要另行提供ZooKeeper,推薦使用同一作者提交的wurstmeister/zookeeper帜矾。
現(xiàn)在已經(jīng)提供較新的1.1.0版本翼虫。
搭建開發(fā)環(huán)境
1 ZooKeeper 1 Kafka
這里以我自己最常用的wurstmeister/kafka為例,使用docker-compose運行一個只有一個ZooKeeper node和一個Kafka broker的開發(fā)環(huán)境:
version: '2'
services:
zoo1:
image: wurstmeister/zookeeper
restart: unless-stopped
hostname: zoo1
ports:
- "2181:2181"
container_name: zookeeper
# kafka version: 1.1.0
# scala version: 2.12
kafka1:
image: wurstmeister/kafka
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: localhost
KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181"
KAFKA_BROKER_ID: 1
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_CREATE_TOPICS: "stream-in:1:1,stream-out:1:1"
depends_on:
- zoo1
container_name: kafka
這里利用了wurstmeister/kafka提供的環(huán)境參數(shù)KAFKA_CREATE_TOPICS
使Kafka運行后自動創(chuàng)建topics屡萤。
1 ZooKeeper 2 Kafka
ZooKeeper的部分與上個例子一樣珍剑,需要調(diào)整的是Kafka部分。
這里將第一個Kafka broker命名為kafka1灭衷,KAFKA_ADVERTISED_HOST_NAME
參數(shù)設為kafka1次慢,KAFKA_ADVERTISED_PORT
設為9092旁涤。
對于第二個broker翔曲,相較第一個broker所有kakfka1的部分改為kafka2,包括service name和coontainer name劈愚。同時KAFKA_BROKER_ID
設為2瞳遍,KAFKA_ADVERTISED_PORT
設為9093。
需要注意的是菌羽,當有不止一個kafka broker時掠械,這里的hostname不能再設為localhost。建議設為本機IP地址。以Mac為例猾蒂,使用ipconfig getifaddr en0
指令來獲取均唉。
具體的docker-compose.yml文件內(nèi)容如下:
# ZooKeeper部分不變
kafka1:
image: wurstmeister/kafka
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: 192.168.1.2
KAFKA_ADVERTISED_PORT: 9092
KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181"
KAFKA_BROKER_ID: 1
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_CREATE_TOPICS: "stream-in:2:1,stream-out:2:1"
depends_on:
- zoo1
container_name: kafka1
kafka2:
image: wurstmeister/kafka
ports:
- "9093:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: {ipconfig getifaddr en0指令的結果}
KAFKA_ADVERTISED_PORT: 9093
KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181"
KAFKA_BROKER_ID: 2
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
depends_on:
- zoo1
container_name: kafka2
與容器內(nèi)的開發(fā)環(huán)境交互
可以使用docker exec
命令直接調(diào)用kafka容器內(nèi)的腳本來進行創(chuàng)建/刪除topic,啟動console producer等等操作肚菠。
如果本地存有與容器內(nèi)相同的Kafka版本文件舔箭,也可以直接使用本地腳本文件。如上述docker-compose.yml文件所示蚊逢,kafka1的hostname即是kafka1层扶,端口為9092,通過kafka1:9092就可以連接到容器內(nèi)的Kafka服務烙荷。
列出所有topics (在本地kafka路徑下)
$ bin/kafka-topics.sh --zookeeper localhost:2181 --list
列出所有Kafka brokers
$ docker exec zookeeper bin/zkCli.sh ls /brokers/ids