在Docker上运行Apache Kafka

本文讲的是在Docker上运行Apache Kafka,【编者的话】在研究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的步骤,假设你已经装好了boot2dockerdocker

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

  ~  docker --version
Docker version 1.7.1, build 786b29d

我很喜欢homebrew,强烈推荐给Mac OS X的用户。很多程序包只需brew install一下就能用,包括dockerboot2docker

在两个镜像上运行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 

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/kafkawurstmeister/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),如果运行的容器只有kafkazookeeper)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联系我,告诉我你对这个话题的看法。记得在Twitter上关注作者@jaceklaskowski

原文链接:Apache Kafka on Docker(翻译:Azriel 审校:魏小红)

原文发布时间为:2015-08-05 

本文作者:Azriel

本文来自合作伙伴DockerOne,了解相关信息可以关注DockerOne。

原文标题:在Docker上运行Apache Kafka

时间: 2024-09-10 03:00:14

在Docker上运行Apache Kafka的相关文章

在Docker上运行.NET Core

本文讲的是在Docker上运行.NET Core,[编者的话]本文为Jurgis Pasukonis在medium.com博客中发布的关于在Docker上运行.NET Core的文章,介绍了目前.NET Core在Docker上的开源情况及部分演示.Jurgis目前是TRAFI公司的CTO. 对于Microsoft和.NET来说,这是一个新的时代,然而这并不是言过其实的.如果你之前没有追随过这些消息,那么下面是一些发生在去年与此有关的事情: .NET框架和C#语言已经被开源并且可以在GitHub

如何在在树莓(Raspberry)PI 上运行 Apache

树莓PI (Raspberry PI) 产自英国. 树莓PI 是一款只有信用卡大小的电脑,而且价格很便宜,有两种型号, A型和B型. A型有 256M 内存,一个USB接口,没有网线插口,B型是升级版,512M内存,2个USB口,有一个网线插口. 别看这么小,但是树莓PI 是可以用来做很多事情的, 是名副其实的"麻雀虽小,五脏俱全" 树莓PI 可以装LINUX系统,可以在 官网上下载各种系统镜像,比如 Raspbian .在树莓PI 主板上有一个SD卡接口,SD卡是当做"硬盘

在 Docker 上运行 Java 程序?你已经触犯法律!

小伙伴们惊呆了!!! 来自国外媒体 takipi 的报道:在 Docker 容器中运行 Oracle Java 可能会让你承担法律责任,为什么呢? Oracle 和 Linux 之间的关系跌宕起伏,为了在多数的 Linux 发行版使用 Oracle 的 JDK,用户都要经过一番折腾.而如果你使用 Docker ,那么问题更麻烦.因为你可能已经在未知的情况下违反了 Oracle 的许可协议.本文将为了解开其中详情以及帮你在使用 Docker 和 Java 时做出明智的决定. 首先 Java 在 L

在阿里云上运行ASP.NET Docker应用

微软的.NET开源后可以运行在Mac和Linux平台,也支持运行在Docker容器里.我们今天要尝试的是在Mac上开发一个.NET应用,并且把它用Docker跑起来,然后部署到阿里云容器服务上. 本文的后续文章介绍了如何访问SQLServer数据库,点击[在Docker中运行SQLServer ASP.NET应用].(https://yq.aliyun.com/articles/60857) 在Mac上安装.NET Core 按照微软的官方文档,我们可以非常容易地在Mac上安装.NET Core

如何在Ubuntu上安装Apache,MySQL,PHP,Nginx,HAProxy,以及如何在docker上安装LAMP

如何在Ubuntu上安装Apache,MySQL,PHP,Nginx,HAProxy,以及如何在docker上安装LAMP   在Ubuntu上安装LAMP: https://help.ubuntu.com/community/ApacheMySQLPHPhttps://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-ubuntuhttp://www.make

弹性集成Apache Mesos与Apache Kafka框架

本文讲的是弹性集成Apache Mesos与Apache Kafka框架,[编者的话]本文由Mesosphere公司的Derrick Harries和Kafka项目代码提交者Joe Stein合作撰写,介绍了如何将Mesos与Kafka集成以简化海量流数据的管理和配置工作. Kafka和Mesos是非常知名和成功的Apache项目,它们每个都获得了大型社区的支持,还有Confluent和Mesosphere这样的公司各自围着它们构筑生态系统.最近,两家公司合作使Kafka成为Mesosphere

尝鲜 | 在Docker中运行你的Mesos集群

本文讲的是尝鲜 | 在Docker中运行你的Mesos集群,[编者的话]本文介绍了在Docker中运行Apache Mesos,Mesos官方网站提供了安装包来直接运行它,但文中尝试使用Docker来运行Mesos,Mesosphere也提供了相应的镜像.在Docker中运行Mesos也有它的好处,读者可以尝试下. 很多人都已经开始在Apache Mesos中运行容器化的应用,我们也是这样.尽管我们尝试在容器中运行应用,但我们还是通过传统的安装包来在自己的主机上安装Mesos.尽管这是最简单和直

利用 Spring Boot 在 Docker 中运行 Hadoop

本文讲的是利用 Spring Boot 在 Docker 中运行 Hadoop,[编者的话]Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.本文介绍了如何利用Spring Boot在Docker中运行Hadoop任务. 简介 越来越多的应用都开始使用Hadoop框架.而开发者在使用过程中也遇到一些挑战,比如使用诸如Docker之类的容器开发和部署相关的技术栈开发的应用.我们将会在下面的例子中介绍如何克服这些挑战. 由于 S

我在Mesos上运行Docker容器的经验

本文讲的是我在Mesos上运行Docker容器的经验,[编者的话]下面的这篇博客出自John Omernik之手,他是Big Data Analytics的Data Enthusiast和VP,还是Zions Bank的Fraud Center of Excellence的经理,Zions Bank是家顶级的金融服务公司.在这篇博客中,作者分享了他是怎么利用新技术如Mesos和Docker来使用MapR文件系统的,并编写了一个可以简化流程的脚本. 我的技术栈 正如在此博客中我所写到的,我想和你分