详解使用Docker快速部署ELK环境(最新5.5.1版本)
本篇文章将详细介绍如何使用Docker快速部署ELK(Elasticsearch,Logstash,Kibana)环境,供大家参考和学习。
确认环境
在开始之前,您需要安装好Docker和Docker Compose,如果您还没有安装,请先完成这一步。同时,您的电脑需要支持64位操作系统和虚拟化技术。
下载docker-compose.yml文件
首先,您需要在您的电脑上创建一个文件夹,用于存放docker-compose.yml文件。然后,在命令行中进入该文件夹,使用curl命令下载docker-compose.yml文件,您可以在文末找到该文件的下载链接。
curl -L https://raw.githubusercontent.com/deviantony/docker-elk/master/docker-compose.yml -o docker-compose.yml
下载完成后,使用ls命令可以看到docker-compose.yml文件已经放在该文件夹中。
启动ELK容器
在确认您的电脑上已经安装好Docker和Docker Compose,并且已经下载完成docker-compose.yml文件之后,您需要执行以下命令,启动ELK容器。
docker-compose up
如果您看到以下的输出,说明ELK容器已经启动成功,并且Elasticsearch已经准备好接受请求了。
elasticsearch_1 | [2017-07-31T12:09:17,517][INFO ][o.e.n.Node ] [] initializing ...
elasticsearch_1 | [2017-07-31T12:09:17,615][INFO ][o.e.e.NodeEnvironment ] [5Sul-z9] using [1] data paths, mounts [[/usr/share/elasticsearch/data (/dev/vda3)]], net usable_space [45gb], net total_space [49.2gb], spins? [possibly], types [ext4]
elasticsearch_1 | [2017-07-31T12:09:17,615][INFO ][o.e.e.NodeEnvironment ] [5Sul-z9] heap size [989.8mb], compressed ordinary object pointers [true]
elasticsearch_1 | [2017-07-31T12:09:17,617][INFO ][o.e.n.Node ] [5Sul-z9] node name [5Sul-z9] derived from node ID [5Sul-z96TwG7W4W2shD4g]; set [node.name] to override
elasticsearch_1 | [2017-07-31T12:09:17,619][INFO ][o.e.n.Node ] [5Sul-z9] version[5.5.1], pid[1], build[19c13d0/2017-07-18T20:44:24.823Z], OS[Linux/4.9.38-linuxkit-aufs/amd64], JVM[Oracle Corporation/OpenJDK 64-Bit Server VM/1.8.0_131/25.131-b11]
elasticsearch_1 | [2017-07-31T12:09:17,619][INFO ][o.e.n.Node ] [5Sul-z9] JVM arguments [-Xms1g, -Xmx1g, -XX:+UseConcMarkSweepGC, -XX:CMSInitiatingOccupancyFraction=75, -XX:+UseCMSInitiatingOccupancyOnly, -Des.networkaddress.cache.ttl=60, -Des.networkaddress.cache.negative.ttl=10, -XX:+AlwaysPreTouch, -Xss1m, -Djava.awt.headless=true, -Dfile.encoding=UTF-8, -Djna.nosys=true, -Djdk.io.permissionsUseCanonicalPath=true, -Dio.netty.noUnsafe=true, -Dio.netty.noKeySetOptimization=true, -Dio.netty.recycler.maxCapacityPerThread=0, -Dlog4j.shutdownHookEnabled=false, -Dlog4j2.disable.jmx=true, -Djava.io.tmpdir=/tmp/elasticsearch-11217345152283664836, -XX:+HeapDumpOnOutOfMemoryError, -XX:HeapDumpPath=data, -XX:ErrorFile=logs/hs_err_pid%p.log, -XX:+PrintGCDetails, -XX:+PrintGCDateStamps, -XX:+PrintTenuringDistribution, -XX:+PrintGCApplicationStoppedTime, -Xloggc:logs/gc.log, -XX:+UseGCLogFileRotation, -XX:NumberOfGCLogFiles=32, -XX:GCLogFileSize=64m, -Des.path.home=/usr/share/elasticsearch]
elasticsearch_1 | [2017-07-31T12:09:19,223][INFO ][o.e.p.PluginsService ] [5Sul-z9] loaded module [aggs-matrix-stats]
elasticsearch_1 | [2017-07-31T12:09:19,223][INFO ][o.e.p.PluginsService ] [5Sul-z9] loaded module [ingest-common]
elasticsearch_1 | [2017-07-31T12:09:19,223][INFO ][o.e.p.PluginsService ] [5Sul-z9] loaded module [lang-expression]
elasticsearch_1 | [2017-07-31T12:09:19,223][INFO ][o.e.p.PluginsService ] [5Sul-z9] loaded module [lang-groovy]
elasticsearch_1 | [2017-07-31T12:09:19,223][INFO ][o.e.p.PluginsService ] [5Sul-z9] loaded module [lang-mustache]
elasticsearch_1 | [2017-07-31T12:09:19,223][INFO ][o.e.p.PluginsService ] [5Sul-z9] loaded module [lang-painless]
elasticsearch_1 | [2017-07-31T12:09:19,224][INFO ][o.e.p.PluginsService ] [5Sul-z9] loaded module [parent-join]
elasticsearch_1 | [2017-07-31T12:09:19,224][INFO ][o.e.p.PluginsService ] [5Sul-z9] loaded module [percolator]
elasticsearch_1 | [2017-07-31T12:09:19,224][INFO ][o.e.p.PluginsService ] [5Sul-z9] loaded module [reindex]
elasticsearch_1 | [2017-07-31T12:09:19,224][INFO ][o.e.p.PluginsService ] [5Sul-z9] loaded module [transport-netty3]
elasticsearch_1 | [2017-07-31T12:09:19,224][INFO ][o.e.p.PluginsService ] [5Sul-z9] loaded module [transport-netty4]
elasticsearch_1 | [2017-07-31T12:09:19,225][INFO ][o.e.p.PluginsService ] [5Sul-z9] loaded plugin [repository-s3]
elasticsearch_1 | [2017-07-31T12:09:19,235][INFO ][o.e.n.Node ] [5Sul-z9] initialized
elasticsearch_1 | [2017-07-31T12:09:19,235][INFO ][o.e.n.Node ] [5Sul-z9] starting ...
接下来,您可以访问http://localhost:5601/来访问Kibana Web界面。默认情况下,用户名和密码均为“elastic”。
示例1:创建自定义镜像
有时候,Docker官方提供的镜像并不能完全满足我们的需求。这时,我们可以通过自定义镜像的方式,来达到我们想要的效果。
编写自定义Dockerfile
我们以安装中文分词插件为例,来演示如何创建自定义镜像。首先,我们需要编写一个Dockerfile,如下所示。
FROM docker.elastic.co/elasticsearch/elasticsearch:5.5.1
MAINTAINER Your Name <your.name@example.com>
RUN /usr/share/elasticsearch/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.5.1/elasticsearch-analysis-ik-5.5.1.zip
其中,我们使用了Dockerfile的继承特性,继承了Elasticsearch 5.5.1官方镜像。然后,使用elasticsearch-plugin安装中文分词插件。
构建自定义镜像
编写完Dockerfile之后,我们需要使用Docker命令构建镜像。在命令行中,进入存放Dockerfile的目录,使用以下命令。
docker build -t my-elasticsearch:5.5.1 .
其中,my-elasticsearch是我们指定的镜像名称,5.5.1是我们要继承的官方镜像的版本号(对应Dockerfile中的FROM语句)。最后的点号(.)表示要在当前目录下查找Dockerfile。
构建自定义镜像需要耗费一些时间,等待命令执行完毕即可。
使用自定义镜像启动ELK容器
自定义镜像构建完成后,我们可以修改docker-compose.yml文件,来使用这个新的镜像启动ELK容器。
elasticsearch:
image: my-elasticsearch:5.5.1
container_name: elasticsearch
environment:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- "cluster.name=docker-cluster"
- "bootstrap.memory_lock=true"
- "ES_HEAP_SIZE=512m"
- "http.cors.enabled=true"
- "http.cors.allow-origin=/*"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro
- ./elasticsearch/data:/usr/share/elasticsearch/data
- ./elasticsearch/plugins:/usr/share/elasticsearch/plugins
ports:
- "9200:9200"
- "9300:9300"
将原先的“docker.elastic.co/elasticsearch/elasticsearch:5.5.1”替换为“my-elasticsearch:5.5.1”,同时增加了一些Elasticsearch的配置项,来开启跨域访问和中文分词插件。
使用相同的命令“docker-compose up”启动容器即可。
示例2:使用Logstash采集日志
除了Elasticsearch和Kibana之外,ELK还包括了一个非常重要的角色,就是Logstash。Logstash是一个强大的工具,可以用来采集各种类型的日志,并将其转换成Elasticsearch所需的格式。
在实际的生产环境中,日志采集、存储和分析是非常重要的一部分,大家也都知道Elasticsearch在这方面有非常强大的功能。现在,我们将演示如何使用Logstash采集一个简单的日志,并存储到Elasticsearch中。
编写Logstash配置文件
首先,我们要编写一个Logstash配置文件,用来定义我们要采集和哪些日志文件,将采集到的日志如何处理,以及存储到Elasticsearch之前需要进行的一些转换操作。
我们创建一个文件夹,用于存放我们的配置文件、日志文件和其他相关文件。然后,我们创建一个名为“logstash.conf”的文件,内容如下所示。
input {
file {
path => [ "/log/test.log" ]
start_position => "beginning"
}
}
filter {
grok {
match => { "message" => "%{IP:client} - - \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:action} %{NOTSPACE:url}\" %{INT:code} %{NOTSPACE:body}|-)" }
}
date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
output {
elasticsearch {
hosts => "elasticsearch:9200"
index => "logstash-%{+YYYY.MM.dd}"
}
stdout { codec => rubydebug }
}
该配置文件定义了一个file类型的输入,来采集路径为“/log/test.log”的日志文件。接着,在filter中使用grok模块来匹配日志中的信息,并在date模块中转换时间格式。最后,在output中,我们使用elasticsearch模块将日志存储到Elasticsearch中,使用stdout将日志输出到控制台。
启动Logstash容器
在Logstash的配置文件和日志文件都已经准备好之后,我们需要启动一个Logstash容器,来执行我们的配置文件。
我们修改docker-compose.yml文件,来启动一个Logstash容器,并在elasticsearch容器和该Logstash容器之间建立连接。
logstash:
image: docker.elastic.co/logstash/logstash-oss:5.5.1
container_name: logstash
volumes:
- ./logstash/config:/usr/share/logstash/config
- ./logstash/pipeline:/usr/share/logstash/pipeline
environment:
- "ES_HOST=elasticsearch"
- "ES_PORT=9200"
depends_on:
- elasticsearch
该配置文件定义了一个名为logstash的容器,继承了Logstash的官方镜像。我们将配置文件和日志文件都放在了./logstash/config和./logstash/pipeline目录下,通过volumes来与Logstash容器关联起来。在environment中,我们指定了Elasticsearch的地址和端口,以便Logstash可以将采集到的日志存储到Elasticsearch中。最后,我们使用depends_on来定义了elasticsearch容器,来建立连接。
使用相同的命令“docker-compose up”启动容器即可。
总结
通过本教程,您可以快速了解Docker的基本使用方法,并在该基础上,学习如何使用Docker快速部署ELK环境。同时,我们也提供了两个示例,在第一个示例中,演示了如何通过自定义镜像来满足特定需求;在第二个示例中,演示了如何使用Logstash采集日志。
希望本教程对您有所帮助,如果有任何疑问或建议,请在评论区中提出。谢谢!
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解使用Docker快速部署ELK环境(最新5.5.1版本) - Python技术站