Dockerized Kafka

system


一直想自己搭建一个data analytic platform,考虑到将来Smart Home or IoT的复杂度, 觉得Kafka这么一个 distributed message/streaming platform会大有用途。这里记录一下我用docker搭建kafka的过程。

重点参考的是 http://blog.jaceklaskowski.pl/2015/07/14/apache-kafka-on-docker.html

但是由于版本以及启动脚本的更新, 有一些小地方要tweak一下才能work。

还有我这里搭建的是伪分布式, 因为 kafka 依赖的 zookeeper 我只跑了一个 docker instance。

然后我的OS 是 ubuntu 14.04 server, 直接安装的 docker。我看网上有很多教程是讨论 docker machine 的情况, 这个一般是老版本的 OS X 和 Windows 需要, 依赖这种 virutalbox 在虚拟机里实现docker。最新版的 OS X docker 和 beta版的 docker for Windows 不再需要 docker machine。

Pull Images

docker pull wurstmeister/zookeeper docker pull wurstmeister/kafka 这两条指令就可以了,直接用latest。

Run Zookeeper

docker run --name zookeeper -p 2181:2181 -d wurstmeister/zookeeper

这里 -d 是 后台运行, 然后 publish这个 2181端口

如果你需要查看输出啥的 你可以用 docker attack zookeeper 或者 docker exec -it zookeeper bash 开一个新的 bash

因为这个是命名的 container instance 那么就可以直接 docker start/stop/restart zookeeper

Run Kafka

docker run --name kafka -e KAFKA_ADVERTISED_HOST_NAME=<???> -e KAFKA_ADVERTISED_PORT=9092 -e KAFKA_BROKER_ID=1 -e ZK=zk -p 9092:9092 --link zookeeper:zk -t wurstmeister/kafka

这里其实最主要的就是 KAFKA_ADVERTISED_HOST_NAME 的设置

注意 docker 网络其实是这样的

Docker networking

我随意找了一个示意图。 这个 Default IP 可能不太一样。

➜  ~ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
a8fb33b8c6df        bridge              bridge              local               
afe05260d267        host                host                local               
2aa1d3829dde        none                null                local

➜  ~ ifconfig
docker0   Link encap:Ethernet  HWaddr 02:42:92:e0:ad:44  
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:92ff:fee0:ad44/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:175655 errors:0 dropped:0 overruns:0 frame:0
          TX packets:179836 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:11190397 (11.1 MB)  TX bytes:15251220 (15.2 MB)
          
p2p1      Link encap:Ethernet  HWaddr d4:be:d9:46:e5:27  
          inet addr:192.168.1.15  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::d6be:d9ff:fe46:e527/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:551768 errors:0 dropped:0 overruns:0 frame:0
          TX packets:372680 errors:0 dropped:0 overruns:0 carrier:1
          collisions:0 txqueuelen:1000 
          RX bytes:504281839 (504.2 MB)  TX bytes:30856187 (30.8 MB)

比如我这里, 如果你只想在 docker network 内部访问, 那么设置为 172.17.0.1 就行了, 如果想在docker host的网络中访问那么要设置为 docker host的 IP 这里是 192.168.1.15, 如果想在外网访问, 你肯能需要填写你的gateway的IP 然后还要开放对应的端口才行。

Test

直接参考 http://kafka.apache.org/quickstart

首先建立一个topic

# creat topics
./kafka-topics.sh --create --zookeeper 192.168.1.15:2181 --replication-factor 1 --partitions 1 --topic test

# list topics
./kafka-topics.sh --list --zookeeper 192.168.1.15:2181

然后 起一个 consumer 一个 producer,输入一些内容看看。

➜  bin ./kafka-console-producer.sh --broker-list 192.168.1.15:9092 --topic test
a
b
c
d
e
f
g

➜  bin ./kafka-console-consumer.sh --zookeeper 192.168.1.15:2181 --topic test --from-beginning
a
b
c
d
e
f
g

这样就算初步测试通过了。

Future

接下来, 会去看一看如何用 docker compose 自动化整个部署。

Keep tuned.