用Docker和fig试用Apache + fluentd + Elasticsearch + Kibana

我一直想试用的工具系列第二部。

为了测试管理多个Docker容器的fig是什么样的工具,这次我用fig构建了一个用于尝试fluentd、Elasticsearch和Kibana的环境。但是,尽管满意于环境的建立,我还没有确认fluentd和Kibana的使用感觉。我可能有点贪多嚼不烂了。。。

另外,环境是Mac OS X Mavericks + boot2docker。

安装fig

用Homebrew迅速安装。

% brew install fig
% fig --version
fig 1.0.1

顺便说一下,Docker 的环境如下。

% docker version
Client version: 1.3.0
Client API version: 1.15
Go version (client): go1.3.3
Git commit (client): c78088f
OS/Arch (client): darwin/amd64
Server version: 1.3.0
Server API version: 1.15
Go version (server): go1.3.3
Git commit (server): c78088f

構成 – 形成或組成某個整體的要素或部分。

本次使用fig来创建以下三个容器并进行协作。

    • コンテナ名: web

Apache
fluentd

コンテナ名: elasticsearch

Elasticsearch

コンテナ名: kibana

Apache
Kibana

假设web容器是前端服务器。使用fluentd将该服务器的访问日志发送至Elasticsearch,然后在Kibana中进行可视化。

据说在实际使用产品时,最好的做法是先将 fluentd 放入集成环境中,然后再将数据传输到 Elasticsearch,而不是直接发送给 Elasticsearch。

Dockerfile – Docker文件

我已根据以下方式分别创建了用于构建各个容器的Dockerfile。
这些Dockerfile都以CentOS 6为基础。

网页容器 yè qì)

按照官方文档的指示安装Fluentd。

然而,当使用 yum 安装 Apache 时,/var/log/httpd 目录以 root:root 的身份创建,但是无论我如何更改权限,却无法从 td-agent 用户访问。由于尝试了很多方法但依然不明原因,所以根据此链接的参考,我修改了启动脚本以 root 身份启动。

在安装 fluentd 时,还需要安装适用于 Elasticsearch 的插件。请使用 yum 安装所需的 libcurl-devel 和 gcc 依赖包。

FROM centos:centos6

# Install core modules
RUN yum update -y &&\
    yum install -y sudo tar &&\
    yum clean -y all

# Edit sudoers file
RUN sed -i -e "s/Defaults    requiretty.*/ #Defaults    requiretty/g" /etc/sudoers

# Install fluentd
RUN curl -L http://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
RUN sed -i -e "s/--user td-agent/--user root/g" /etc/init.d/td-agent &&\
    sed -i -e "s/--group td-agent/--user root --group td-agent/g" /etc/init.d/td-agent
RUN ulimit -n 65536
COPY td-agent.conf /etc/td-agent/td-agent.conf

# Install Fluent::Plugin::Elasticsearch
RUN yum install -y libcurl-devel gcc &&\
    yum clean -y all
RUN /opt/td-agent/embedded/bin/gem install fluent-plugin-elasticsearch

# Install httpd
RUN yum install -y httpd &&\
    yum clean -y all

COPY run.sh /tmp/
EXPOSE 80
ENTRYPOINT ["/bin/bash", "/tmp/run.sh"]

为了启动 Apache 和 Fluentd 两个服务,创建以下的 shell 脚本,以使进程一直在前台运行。

#!/bin/bash

service httpd start
service td-agent start

tail -f /var/log/td-agent/td-agent.log

先试着创建了一个 Fluentd 的设置文件 td-agent.conf,大致如下。

<source>
  type tail
  path /var/log/httpd/access_log
  tag apache.web
  pos_file /var/log/td-agent/httpd-access.log.pos
  format apache2
</source>

<match apache.**>
  type copy

  <store>
    type stdout
  </store>

  <store>
    type elasticsearch
    host elasticsearch
    port 9200
  </store>

</match>

Elasticsearch容器

在安装java之前,需要用yum事先安装java和which。还需设置环境变量JAVA_HOME,并添加到PATH中。

按照 Elasticsearch 的文档安装。选择安装路径为 /opt/elasticsearch。

为了跨域处理,已向elasticsearch.yml添加了配置。

FROM centos:centos6

# Install core modules
RUN yum update -y &&\
    yum install -y java-1.7.0-openjdk sudo tar which &&\
    yum clean -y all

# Edit sudoers file
RUN sed -i -e "s/Defaults    requiretty.*/ #Defaults    requiretty/g" /etc/sudoers

# Set JAVA_HOME
ENV JAVA_HOME /usr/lib/jvm/java-1.7.0-openjdk.x86_64
ENV PATH $JAVA_HOME/bin:$PATH

# Install elasticsearch
ENV ES_PKG_NAME elasticsearch-1.4.0
ADD https://download.elasticsearch.org/elasticsearch/elasticsearch/$ES_PKG_NAME.tar.gz /tmp/$ES_PKG_NAME.tar.gz
RUN cd /tmp &&\
    tar xzvf $ES_PKG_NAME.tar.gz &&\
    mv $ES_PKG_NAME /opt/elasticsearch &&\
    rm -f $ES_PKG_NAME.tar.gz
RUN echo 'http.cors.enabled: true' >> /opt/elasticsearch/config/elasticsearch.yml &&\
    echo 'http.cors.allow-origin: "/.*/"' >> /opt/elasticsearch/config/elasticsearch.yml

EXPOSE 9200
EXPOSE 9300

ENTRYPOINT ["/opt/elasticsearch/bin/elasticsearch"]

Elasticsearch 可视化工具的容器。

只需下载Kibana 3,然后放到Apache的文档根目录下即可使用(从Kibana 4开始配置有些变化)。很简单。这次将其放置在/var/www/html/kibana下。

FROM centos:centos6

# Install core modules
RUN yum update -y &&\
    yum install -y sudo tar &&\
    yum clean -y all

# Edit sudoers file
RUN sed -i -e "s/Defaults    requiretty.*/ #Defaults    requiretty/g" /etc/sudoers

# Install httpd
RUN yum install -y httpd &&\
    yum clean -y all

# Install kibana
ENV KIBANA_PKG_NAME kibana-3.1.2
ADD https://download.elasticsearch.org/kibana/kibana/$KIBANA_PKG_NAME.tar.gz /tmp/$KIBANA_PKG_NAME.tar.gz
RUN cd /var/www/html &&\
    tar xzvf /tmp/$KIBANA_PKG_NAME.tar.gz &&\
    mv $KIBANA_PKG_NAME kibana

COPY run.sh /tmp/run.sh

EXPOSE 80
ENTRYPOINT ["/bin/bash", "/tmp/run.sh"]

虽然我准备了一个像Web容器一样的Shell脚本,但由于只有一个运行的服务,直接启动Apache也没有问题。

#!/bin/bash

service httpd start

tail -f /var/log/httpd/access_log

fig.yml-请叙述fig.yml文件。

因为 Dockerfile 已经完成了,接下来要创建 fig 的配置文件。配置文件要用 YAML 来写。参考了参考文献,创建了以下类似的 fig.yml。

---
elasticsearch:
  build: elasticsearch
  ports:
    - "9200:9200"
    - "9300:9300"
kibana:
  build: kibana
  ports:
    - "50080:80"
  links:
    - elasticsearch
web:
  build: web
  ports:
    - "10080:80"
    - "18888:8888"
  links:
    - elasticsearch

在构建时指定包含Dockerfile的目录。可以使用ports来指定要导出的端口,并可以使用links来指定想要链接的容器。如果尝试在不使用fig的情况下启动,则需要自己在docker run选项中进行指定,但使用fig的话可以轻松设置,非常方便。

启动容器

构建 Dockerfile 并创建映像。

% fig build
Building elasticsearch...
 ---> 70441cac1ed5
Step 1 : RUN yum update -y &&    yum install -y java-1.7.0-openjdk sudo tar which &&    yum clean -y all

(...snip...)

Successfully built c9747896561b

只需要这一个命令就可以构建所有的Dockerfile。非常方便。

然后启动。这也是一步简单的。

% fig up
Recreating fluentdsample_elasticsearch_1...
Recreating fluentdsample_web_1...
Recreating fluentdsample_kibana_1...
Attaching to fluentdsample_elasticsearch_1, fluentdsample_web_1, fluentdsample_kibana_1
elasticsearch_1 | [2014-11-22 17:43:57,222][INFO ][node                     ] [Eros] version[1.4.0], pid[1], build[bc94bd8/2014-11-05T14:26:12Z]
elasticsearch_1 | [2014-11-22 17:43:57,223][INFO ][node                     ] [Eros] initializing ...
elasticsearch_1 | [2014-11-22 17:43:57,228][INFO ][plugins                  ] [Eros] loaded [], sites []
web_1           | httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.198 for ServerName
kibana_1        | httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.200 for ServerName
web_1           | Starting httpd: [  OK  ]
kibana_1        | Starting httpd: [  OK  ]
web_1           | Starting td-agent: [  OK  ]

(...snip...)

每个容器的输出都被写入标准输出中。

确认操作

因使用boot2docker,需确认虚拟机的IP地址。

% boot2docker ip

The VM's Host only interface IP address is: 192.168.XX.YYY

试着访问每个容器。

Elasticsearch 容器:

% curl -s "http://192.168.XX.YYY:9200/"
{
  "status" : 200,
  "name" : "Eros",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "1.4.0",
    "build_hash" : "bc94bd81298f81c656893ab1ddddd30a99356066",
    "build_timestamp" : "2014-11-05T14:26:12Z",
    "build_snapshot" : false,
    "lucene_version" : "4.10.2"
  },
  "tagline" : "You Know, for Search"
}

网络容器:

% curl -s -I "http://192.168.XX.YYY:10080/"
HTTP/1.1 403 Forbidden
Date: Sat, 22 Nov 2014 17:52:14 GMT
Server: Apache/2.2.15 (CentOS)
Accept-Ranges: bytes
Content-Length: 4954
Connection: close
Content-Type: text/html; charset=UTF-8

Kibana 容器:

% curl -s -I "http://192.168.XX.YYY:50080/kibana/"
HTTP/1.1 200 OK
Date: Sat, 22 Nov 2014 17:53:52 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Fri, 07 Nov 2014 15:15:25 GMT
ETag: "cb-819-507464842dd40"
Accept-Ranges: bytes
Content-Length: 2073
Connection: close
Content-Type: text/html; charset=UTF-8

每个人似乎都在运作。

当在web浏览器中访问 http://192.168.XX.YYY:50080/kibana/ 时,能够正确显示Kibana页面。如果与Elasticsearch的连接不成功,则会显示错误页面。

总结

使用多个Dockerfile组合时,fig非常方便。此工具使容器之间的协作更加简便,因此我们尽量将容器的角色分开,确保每个容器的角色清晰明确。

广告
将在 10 秒后关闭
bannerAds