在Docker上運行Apache Kafka

jopen 9年前發布 | 82K 次閱讀 Docker

在研究Apache Kafka和Docker時,作者發現Docker是一個非常神奇的技術,它將開發過程簡化的如此完美。又因為有wurstmeister/kafka和 wurstmeister/zookeeper這兩個鏡像,運行Apache Kafka和使用Docker是那樣的輕松,還有比這更讓人覺得興奮的事情么!讓我們完全從安裝、維護機器和軟件中解脫出來。

一直很想鼓搗Apache Kafka,但由于我想鼓搗的事太多,Kafka一直沒能得到臨幸。直到最近,有人要我嘗試下這個“中間人”,看看這東西是否能滿足一個項目的需求----其實是兩個項目。可以想下我當時的表情。

我編譯了Apache Kafka的源代碼,將其連接到了Spark Streaming并嘗試回答StackOverflow上的一些問題(在使用Scala的Flink中怎樣使用Kafka?怎樣用jmxtrans見識Kafka中間人?),更不用說閱讀繁多的相關文章和看視頻。我對什么場景最適合用Apache Kafka有了清醒地認識。

在和Codilime里的團隊開發DeepSense.io平臺時,我們只用Ansible自動化部署。我們也嘗試過DockerVagrant,都是為了簡化DeepSense.io的部署。

這時就涉及到了兩個需求:為了三個項目而研究Apache Kafka和Docker(包括其他工具)!很神奇,不是么?我終于發現了Docker可以讓開發產品和部署變得多么簡單。只有親眼所見時,我才意識到 Docker竟能如此簡化我的開發過程。現在我會把一切Docker化。得知wurstmeister/kafkawurstmeister/zookeeper鏡像時,我不可能更幸福了。運行Apache Kafka和使用Docker最終變得如此輕松愉悅。

然后我就想我應該分享這份熱愛,不僅我,所有人都可以從中受益。

由于我在Mac OS X上,所以用Docker運行Apache Kafka的步驟依賴于boot2docker----一款輕量級Linux,供一些不原生支持Docker的平臺,比如前面提到的Mac OS X以及Windows。

你將會用到wurstmeister/kafkawurstmeister/zookeeper兩個鏡像。

你可以在后臺或前臺獨立于鏡像運行容器。視你的Unix技術而言,也就是一兩個終端的事。這里就對Apache Kafka和Apache Zookeeper各使用一個終端。我會在另一篇博客中解釋Apache Zookeeper的作用。

下面是用Docker運行Apache Kafka的步驟,假設你已經裝好了boot2docker和docker。

?  ~  boot2docker version
Boot2Docker-cli version: v1.7.1
Git commit: 8fdc6f5

?  ~  docker --version Docker version 1.7.1, build 786b29d</pre>
我很喜歡homebrew,強烈推薦給Mac OS X的用戶。很多程序包只需brew install一下就能用,包括docker和boot2docker。

在兩個鏡像上運行Kafka

1,(僅適用Mac OS X和Windows用戶)執行boot2docker up在Mac OS上啟動微型Linux內核。

?  ~  boot2docker up
Waiting for VM and Docker daemon to start...
.o
Started.
Writing /Users/jacek/.boot2docker/certs/boot2docker-vm/ca.pem
Writing /Users/jacek/.boot2docker/certs/boot2docker-vm/cert.pem
Writing /Users/jacek/.boot2docker/certs/boot2docker-vm/key.pem

To connect the Docker client to the Docker daemon, please set:  export DOCKER_HOST=tcp://192.168.59.104:2376  export DOCKER_CERT_PATH=/Users/jacek/.boot2docker/certs/boot2docker-vm  export DOCKER_TLS_VERIFY=1 </pre>
2,(僅適用Mac OS X和Windows用戶)執行$(boot2docker shellinit)設置好終端,讓docker知道微型Linux內核運行在哪兒(通過boot2docker)。為了設置上面的export,你必須在所有打開的運行Docker終端中重復這一步驟。如果你遇到docker命令的通信問題,記著這一步。

?  ~  $(boot2docker shellinit)
Writing /Users/jacek/.boot2docker/certs/boot2docker-vm/ca.pem
Writing /Users/jacek/.boot2docker/certs/boot2docker-vm/cert.pem
Writing /Users/jacek/.boot2docker/certs/boot2docker-vm/key.pem 

3,執行docker ps確保為Docker配置好了終端。

?  ~  docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES 

這時還沒有容器運行。一旦首先啟動Zookeeper的容器就會有變化,接著是Kafka。

4,在Docker Hub上創建賬號并運行docker login保存證書。你不必重復通過docker pull從Docker鏡像的公用中心下載鏡像,把Docker Hub看作存儲Docker鏡像的GitHub。參考文檔使用Docker Hub獲得最新信息。

5,執行docker pull wurstmeister/kafka從Docker Hub下載Zookeeper鏡像(可能需要幾分鐘)

?  ~  docker pull wurstmeister/zookeeper
Pulling repository wurstmeister/zookeeper
a3075a3d32da: Download complete
...
840840289a0d: Download complete
e7381f1a45cf: Download complete
5a6fc057f418: Download complete
Status: Downloaded newer image for wurstmeister/zookeeper:latest

你會看到各層的哈希打印在控制臺里,符合預期。

6,執行docker pull wurstmeister/kafka從Docker Hub下載Kafka鏡像(可能需要幾分鐘)

?  ~  docker pull wurstmeister/kafka
latest: Pulling from wurstmeister/kafka
428b411c28f0: Pull complete
...
422705fe88c8: Pull complete
02bb7ca441d8: Pull complete
0f9a08061516: Pull complete
24fc32f98556: Already exists
Digest: sha256:06150c136dcfe6e4fbbf37731a2119ea17a953c75902e52775b5511b3572aa1f
Status: Downloaded newer image for wurstmeister/kafka:latest 

7,在命令行中執行docker images驗證wurstmeister/kafka和wurstmeister/zookeeper兩個鏡像已下載。

?  ~  docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
wurstmeister/kafka       latest              24fc32f98556        3 weeks ago         477.6 MB
wurstmeister/zookeeper   latest              a3075a3d32da        9 months ago        451 MB 

8,現在可以在一個終端里運行docker run --name zookeeper -p 2181 -t wurstmeister/zookeeper引導啟動Zookeeper。如果你在Mac OS X或Windows上,記得$(boot2docker shellinit)。

?  ~  docker run --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper
JMX enabled by default
Using config: /opt/zookeeper-3.4.6/bin/../conf/zoo.cfg
2015-07-17 19:10:40,419 [myid:] - INFO  [main:QuorumPeerConfig@103] - Reading configuration from: /opt/zookeeper-3.4.6/bin/../conf/zoo.cfg
...
2015-07-17 19:10:40,452 [myid:] - INFO  [main:ZooKeeperServer@773] - maxSessionTimeout set to -1
2015-07-17 19:10:40,464 [myid:] - INFO  [main:NIOServerCnxnFactory@94] - binding to port 0.0.0.0/0.0.0.0:2181 

現在ZooKeeper在監聽2181端口。用Docker(或者Mac OS上的Boot2Docker)的IP地址遠程連接確認下。

?  ~  telnet `boot2docker ip` 2181
Trying 192.168.59.103...
Connected to 192.168.59.103.
Escape character is '^]'. 

9,在另一個終端里執行

docker run --name kafka -e HOST_IP=localhost -e KAFKA_ADVERTISED_PORT=9092 -e KAFKA_BROKER_ID=1 -e ZK=zk -p 9092 --link zookeeper:zk -t wurstmeister/kafka

記得$(boot2docker shellinit),如果你在Mac OS X或Windows上。

?  ~  docker run --name kafka -e HOST_IP=localhost -e KAFKA_ADVERTISED_PORT=9092 -e KAFKA_BROKER_ID=1 -e ZK=zk -p 9092 --link zookeeper:zk -t wurstmeister/kafka
[2015-07-17 19:32:35,865] INFO Verifying properties (kafka.utils.VerifiableProperties)
[2015-07-17 19:32:35,891] INFO Property advertised.port is overridden to 9092 (kafka.utils.VerifiableProperties)
[2015-07-17 19:32:35,891] INFO Property broker.id is overridden to 1 (kafka.utils.VerifiableProperties)
...
[2015-07-17 19:32:35,894] INFO Property zookeeper.connect is overridden to 172.17.0.5:2181 (kafka.utils.VerifiableProperties)
[2015-07-17 19:32:35,895] INFO Property zookeeper.connection.timeout.ms is overridden to 6000 (kafka.utils.VerifiableProperties)
[2015-07-17 19:32:35,924] INFO [Kafka Server 1], starting (kafka.server.KafkaServer)
[2015-07-17 19:32:35,925] INFO [Kafka Server 1], Connecting to zookeeper on 172.17.0.5:2181 (kafka.server.KafkaServer)
[2015-07-17 19:32:35,934] INFO Starting ZkClient event thread. (org.I0Itec.zkclient.ZkEventThread)
[2015-07-17 19:32:35,939] INFO Client environment:zookeeper.version=3.4.6-1569965, built on 02/20/2014 09:09 GMT (org.apache.zookeeper.ZooKeeper)
...
[2015-07-17 19:32:36,093] INFO Awaiting socket connections on 0.0.0.0:9092. (kafka.network.Acceptor)
[2015-07-17 19:32:36,095] INFO [Socket Server on Broker 1], Started (kafka.network.SocketServer)
[2015-07-17 19:32:36,146] INFO Will not load MX4J, mx4j-tools.jar is not in the classpath (kafka.utils.Mx4jLoader$)
[2015-07-17 19:32:36,172] INFO 1 successfully elected as leader (kafka.server.ZookeeperLeaderElector)
[2015-07-17 19:32:36,253] INFO Registered broker 1 at path /brokers/ids/1 with address 61c359a3136b:9092. (kafka.utils.ZkUtils$)
[2015-07-17 19:32:36,270] INFO [Kafka Server 1], started (kafka.server.KafkaServer)
[2015-07-17 19:32:36,318] INFO New leader is 1 (kafka.server.ZookeeperLeaderElector$LeaderChangeListener) 

現在你的電腦上運行著依托Docker的Apache Kafka,你是它的的開心用戶。用docker ps查看容器狀態。

?  ~  docker ps
CONTAINER ID        IMAGE                    COMMAND                CREATED             STATUS              PORTS                                                 NAMES
0b34a9927004        wurstmeister/kafka       "/bin/sh -c start-ka   2 minutes ago       Up 2 minutes        0.0.0.0:32769->9092/tcp                               kafka
14fd32558b1c        wurstmeister/zookeeper   "/bin/sh -c '/usr/sb   4 minutes ago       Up 4 minutes        22/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:32768->2181/tcp   zookeeper 

10,要結束你的Apache Kafka旅程時,用docker stop kafka zookeeper(或docker stop $(docker ps -aq),如果運行的容器只有kafka和zookeeper)docker stop容器。

?  ~  docker stop kafka zookeeper
kafka
zookeeper 

之后運行docker ps會顯示沒有正在運行的容器:

?  ~  docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES 

現在沒有正在運行的容器是因為他們被關閉了,這些容器依然可以被再次啟動----使用docker ps -a查看可以使用的容器。

?  ~  docker ps -a
CONTAINER ID        IMAGE                    COMMAND                CREATED             STATUS                        PORTS               NAMES
7dde25ff7ec2        wurstmeister/kafka       "/bin/sh -c start-ka   15 hours ago        Exited (137) 16 seconds ago                       kafka
b7b4b675b9c0        wurstmeister/zookeeper   "/bin/sh -c '/usr/sb   16 hours ago        Exited (137) 5 seconds ago                        zookeeper 

11,最后,用boot2docker down停止boot2docker守護進程(僅對于Mac OS X和Windows用戶)。

結語

利用wurstmeister/kafkawurstmeister/zookeeper這兩個鏡像,不用過多修改本地的工作站環境去安裝必需的包諸如Apache ZooKeeper,你就能運行Apache Kafka。除了Docker本身(和Boot2Docker,如果你恰好在Mac OS上),你不必擔心其它升級軟件和依賴,從而將你從花時間安裝和維護你的機器和軟件中解脫出來。還有,Docker鏡像可以被部署到其它機器,確保一致的內部軟件環境。

你可以在博客下方的評論區留言,或者郵件jacek@japila.pl聯系我,告訴我你對這個話題的看法。記得在推ter上關注作者@jaceklaskowski

原文鏈接:Apache Kafka on Docker(翻譯:Azriel 審校:魏小紅)

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!