用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非常方便。此工具使容器之间的协作更加简便,因此我们尽量将容器的角色分开,确保每个容器的角色清晰明确。