注:该文的原文为 Using Docker with Apache Flume - Part 1,由 Alex Wilson 编写。java
在 Unruly ,咱们使用 Apache Flume 做为事件流架构的一部分。在源断和 sinks 端,它使很是容易创建以及丢弃的。在个人创新时间,我尝试创立一些 Flume 技术来得到 Docker 和集装箱运输的知识。docker
Docker 有镜像的概念,在这个镜像中咱们能运行一个容器。所以,第一步就是建立一个预安装了 Flume 的镜像。Flume 仅仅依赖 java(它是一个java工程),我在一个 Ubuntu 基础镜像的基础上建立了它,建立它须要执行如下步骤:apache
以下所作,建立一个 dockerfile :ubuntu
FROM ubuntu # install wget + java RUN apt-get update -q RUN DEBIAN_FRONTEND=noninteractive apt-get install \ -qy --no-install-recommends \ wget openjdk-7-jre # download and unzip Flume RUN mkdir /opt/flume RUN wget -qO- \ https://archive.apache.org/dist/flume/stable/apache-flume-1.4.0-bin.tar.gz \ | tar zxvf - -C /opt/flume --strip 1 # set environment variables ENV JAVA_HOME /usr/lib/jvm/java-7-openjdk-amd64 ENV PATH /opt/flume/bin:$PATH
经过这个 Dockerfile 构建一个镜像(使用 docker build -t flume .
),将给咱们一个基础镜像,以使 Flume 容器使用。它是可用的,你能够在 Docker index 找到它。架构
一个 Flume 拓扑由 agent 组成,它有3个核心概念:sources、channels 和 sinks。jvm
咱们从 sources 接收数据,把它放入一个或是多个的 channels ,它能被 sinks 读取和加工。大部分的基础拓扑由一个节点组成,咱们创建了如下一个由 Docker 建立的节点,使用:ui
这个拓扑的配置文件,咱们称之为 flume-example.conf 配置文件像以下这样:.net
docker.sinks = logSink docker.sources = netcatSource docker.channels = inMemoryChannel docker.sources.netcatSource.type = netcat docker.sources.netcatSource.bind = 0.0.0.0 docker.sources.netcatSource.port = 44444 docker.sources.netcatSource.channels = inMemoryChannel docker.channels.inMemoryChannel.type = memory docker.channels.inMemoryChannel.capacity = 1000 docker.channels.inMemoryChannel.transactionCapacity = 100 docker.sinks.logSink.type = logger docker.sinks.logSink.channel = inMemoryChannel
咱们将使用这个配置文件建立一个新容器,而且启动 docker agent。code
FROM probablyfine/flume ADD flume-example.conf /var/tmp/flume-example.conf EXPOSE 44444 ENTRYPOINT [ "flume-ng", "agent", "-c", "/opt/flume/conf", "-f", "/var/tmp/flume-example.conf", "-n", "docker", "-Dflume.root.logger=INFO,console" ]
在 ENTRYPOINT
块的 flume-ng
的命令将在一个启动的容器中运行(配置文件的目录,配置文件,和agent 名字),而且 EXPOSE
指令使得端口在运行期是可用的。NetcatSource 在监听这个端口。事件
一旦咱们建立了这个新镜像(咱们叫作 flume-example),咱们就能够经过使用命令 docker run -p 444:44444 -t flume-example
启动这个容器,p 444:44444
指令将让容器中的 4444
端口和本机的 444
端口作映射。如今咱们能够经过 echo foo bar baz | nc localhost 444
给它发送消息了,而后看被记录的事件。
... 2014-05-05 19:26:13,218 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:70)] Event: { headers:{} body: 66 6F 6F 20 62 61 72 20 62 61 7A foo bar baz } ...
简直酷毙了!如今咱们有一个工做的 Flume agent 能够获取和处理数据了。
下一篇文章,将展现更多的有趣的 Flume 技术,而且咱们能够更早的把 Docker 的特性和 Flume 的创建整合起来(好比共享一个卷和只读的挂载)。