docker部署elasticsearch-kibana-logstash-filebeat-v7-14
docker部署elasticsearch-kibana-logstash-filebeat-v7-14全家桶环境准备。
首先,安装 Docker
安装 docker 可以照着官网步骤一步一步来,挺简单的。
Install Docker Engine on CentOS
Docker 镜像统一从 https://hub.docker.com/ 下载 (安装时请使用统一版本)
安装完后可以看下版本:docker -v
查看 docker 详细信息:docker info
然后,了解ELK全家桶
通常Elasticsearch+Kibana+Logstash+Filebeat全家桶,统称为ELK,反之,ELK是由 Elasticsearch、Logstash和Kibana三部分组件组成。
Elasticsearch 是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
Logstash 是一个完全开源的工具,它可以对你的日志进行收集、分析,并将其存储供以后使用
kibana 是一个开源和免费的工具,它可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。
Filebeat 是用于单用途数据托运人的平台。它们以轻量级代理的形式安装,并将来自成百上千台机器的数据发送到 Logstash 或 Elasticsearch。
最后,ELK全家桶安装须知
以下步骤在 VMware 中的 centos 7 中操作,ip 地址为:10.100.21.17;
注意安装的时候最好统一版本,否则后面会出现许多问题,进官网搜索对应镜像,查看 Tags 标签下的版本,目前我这最新的 Tags 是 7.14.0,所以拉取镜像时统一加上该版本号。官网镜像地址
Docker 搭建 ELK 之前需熟悉 Docker 的相关指令,如:拷贝容器文件docker cp、强制删除容器: docker rm -f 容器id、创建网络: docker network create net-elk、查看日志:docker logs container 等等。
为了方便后续文件的挂载,先创建如下目录 /usr/local/elk ,再执行 mkdir /usr/local/elk/{elasticsearch,kibana,logstash} 创建3个对应的目录,所以以下操作如无特别说明,均在 /usr/local/elk下执行。
[root@master ~]# mkdir -p /usr/local/elk/{elasticsearch,kibana,logstash}
为了容器间的通信,需要先用 docker 创建一个网络:
[root@master ~]# docker network create --subnet 172.18.0.0/16 net-elk
一、Docker 安装 Elasticsearch
1、Docker拉取elasticserach镜像
[root@master ~]# docker pull elasticsearch:7.14.0
7.14.0: Pulling from library/elasticsearch
7a0437f04f83: Pull complete
7718d2f58c47: Pull complete
cc5c16bd8bb9: Pull complete
e3d829b4b297: Pull complete
1ad944c92c79: Pull complete
373fb8fbaf74: Pull complete
5908d3eb2989: Pull complete
Digest: sha256:81c126e4eddbc5576285670cb3e23d7ef7892ee5e757d6d9ba870b6fe99f1219
Status: Downloaded newer image for elasticsearch:7.14.0
2、制作配置文件
# 运行 elasticsearch
docker run -d --name es --net net-elk -P -e "discovery.type=single-node" elasticsearch:7.14.0
# 进入容器查看配置文件路径
docker exec -it es /bin/bash
cd config
在 config 中可看到 elasticsearch.yml 配置文件,再执行 pwd
可以看到当前目录为: /usr/share/elasticsearch/config
,所以退出容器,执行文件的拷贝:
# 将容器内的配置文件拷贝到 /usr/local/elk/elasticsearch/ 中
[root@master elasticsearch]# docker cp es:/usr/share/elasticsearch/config/elasticsearch.yml .
# 修改文件权限
[root@master elasticsearch]# chmod 666 elasticsearch.yml
# 在elasticsearch 目录下再创建data目录,同时修改权限
[root@master elasticsearch]# mkidr data
[root@master elasticsearch]# chmod -R 777 data/
注意:此处要修改文件的权限为可写,否则,进行挂载后,在外部修改配置文件,容器内部的配置文件不会更改。同时,创建 data 目录进行挂载。
3、重置容器运行并挂载
# 先删除旧的容器
docker rm -f es
# 再运行新的容器
[root@master elasticsearch]# docker run -d --name es --net net-elk -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e "ES_JAVA_OPTS=-Xms1g -Xmx1g" --privileged=true -v /usr/local/elk/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /usr/local/elk/elasticsearch/data/:/usr/share/elasticsearch/data elasticsearch:7.14.0
说明:
-p (小写)映射端口号,主机端口:容器端口
-P(大写)随机为容器指定端口号
-v 进行容器的挂载
–name 指定容器别名
–net 连接指定网络
-e 指定启动容器时的环境变量
-d 后台运行容器
–privileged=true 使容器有权限挂载目录
4、校验容器服务
# 查看运行中的容器
docker ps
# 查看容器日志
docker logs es
# 访问前端是否正常
curl localhost:9200
如果日志无误,可以用 curl ip:9200
查看结果,也可用浏览器输入 http://ip:9200
查看。至此,elasticsearch 安装完成。同时,我们可以在 data 目录下看到容器内的数据,并且在宿主机修改也会同步到容器的内部。
二、 Docker安装Logstash
1、与elasticserach步骤几乎一致
拉取镜像并拷贝配置,并赋予权限
# 拉取镜像,注意版本一致
[root@master ~]# docker pull logstash:7.14.0
7.14.0: Pulling from library/logstash
2d473b07cdd5: Pull complete
d3a7759e9ad2: Pull complete
42f451c261d7: Pull complete
fa33a67e94b1: Pull complete
34d1ee3f4428: Pull complete
983fac569dd3: Pull complete
61ad6cb97e4c: Pull complete
b9f4df95ea5b: Pull complete
5b2018eb0e9f: Pull complete
240a339160a2: Pull complete
b02655e33c0a: Pull complete
Digest: sha256:cda21243aa471c4bef46b89aebe6a51c6e2a2f6e96e16bd08f47e8035176eb07
Status: Downloaded newer image for logstash:7.14.0
[root@master kibana]# docker run -d -P --name logstash --net net-elk logstash:7.14.0
# 拷贝数据
[root@master logstash]# docker cp logstash:/usr/share/logstash/config .
[root@master logstash]# docker cp logstash:/usr/share/logstash/data .
[root@master logstash]# docker cp logstash:/usr/share/logstash/pipeline .
#文件夹赋权
chmod -R 777 /usr/local/elk/logstash/
2、修改相应配置文件
# 修改 logstash/config 下的 logstash.yml 文件,主要修改 es 的地址:
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://10.100.21.17:9200" ]
修改 logstash/pipeline 下的 logstash.conf 文件:
input {
tcp {
mode => "server"
host => "0.0.0.0" # 允许任意主机发送日志
port => 5044
codec => json_lines # 数据格式
}
}
output {
elasticsearch {
hosts => ["http://10.100.21.17:9200"] # ElasticSearch 的地址和端口
index => "elk" # 指定索引名
codec => "json"
}
stdout {
codec => rubydebug
}
}
3、启动容器并挂载
# 注意先删除之前的容器
[root@master logstash]# docker rm -f logstash
# 运行新的容器
[root@master logstash]# docker run -d --name logstash --net net-elk --privileged=true -p 5044:5044 -p 9600:9600 -e "ES_JAVA_OPTS=-Xms1g -Xmx1g" -v /usr/local/elk/logstash/data/:/usr/share/logstash/data -v /usr/local/elk/logstash/config/:/usr/share/logstash/config -v /usr/local/elk/logstash/pipeline/:/usr/share/logstash/pipeline logstash:7.14.0
4、校验Logstash服务
# 查看日志
[root@master logstash]# docker logs -f logstash
三、 Docker安装kibana
1、步骤与elasticserach几乎一致
# 拉取kibana镜像,保持版本一致
[root@master ~]# docker pull kibana:7.14.0
7.14.0: Pulling from library/kibana
7a0437f04f83: Already exists
d92a27ccb611: Downloading [===================================> ] 68.72MB/97.12MB
5c7ecfbf36a1: Download complete
8d9081d817c4: Download complete
a530cdbe89f1: Download complete
ccffe653ddc0: Download complete
af29ddcbaa8e: Downloading [===> ] 24.14MB/326.8MB
8e4704d6a270: Download complete
458a467a0651: Waiting
4fcc78271e5a: Waiting
d86420aa7083: Waiting
50e699604220: Waiting
d53c69cf1db7: Waiting
# 启动 kibana 容器并连接同一网络
docker run -d --name kibana --net net-elk -P -e "ELASTICSEARCH_HOSTS=http://es:9200" -e "I18N_LOCALE=zh-CN" kibana:7.14.0
注意: -e "ELASTICSEARCH_HOSTS=http://es:9200" 表示连接刚才启动的 elasticsearch 容器,因为在同一网络(elk)中,地址可直接填 容器名+端口,即 es:9200, 也可以填 http://192.168.161.128:9200,即 http://ip:端口。
2、制作kibana启动文件
# 从容器拷贝至物理卷中
[root@master kibana]# docker cp kibana:/usr/share/kibana/config/kibana.yml .
# 授予相关权限
[root@master kibana]# chmod 666 kibana.yml
# 修改配置文件
[root@master kibana]# vim kibana.yml
拷贝完成后,修改该配置文件,主要修改 elastissearch.hosts 并新增 i18n.locale 配置:
1、es 地址改为刚才安装的 es 地址,因容器的隔离性,这里最好填写 http://ip:9200
;
2、kibana 界面默认是英文的,可以在配置文件中加上 i18n.locale: zh-CN
(注意冒号后面有个空格)。
#
# ** THIS IS AN AUTO-GENERATED FILE **
#
# Default Kibana configuration for docker target
server.name: kibana
server.host: "0"
# elasticsearch 地址
elasticsearch.hosts: [ "http://10.100.21.17:9200" ]
monitoring.ui.container.elasticsearch.enabled: true
# 开启 kibana 的汉化
i18n.locale: zh-CN
注意:如果使用挂载配置文件的方式启动的话,elasticsearch.hosts 这需填写 http://ip:9200
,而不能使用容器名了,否则后面 kibana 连接 es 会失败。
3、 重置容器运行并挂载
#删除原来未挂载的容器
docker rm -f kibana
# 运行新的容器
[root@master kibana]# docker run -d --name kibana -p 5601:5601 -v /usr/local/elk/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml --net net-elk kibana:7.14.0
4、校验Kibana服务
打开浏览器,输入:http://ip:5601
打开 kibana 控制台,如果未能成功打开,可以使用: docker logs kibana
查看容器日志看是否运行有误等。可参考官网:Install Kibana with Docker
四、Docker安装Filebeat
1、拉取filebeat镜像
[root@master filebeat]# docker pull store/elastic/filebeat:7.14.0
# 下载默认官方配置文件
[root@master ~]# curl -L -O https://raw.githubusercontent.com/elastic/beats/7.14.0/deploy/docker/filebeat.docker.yml
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 372 100 372 0 0 744 0 --:--:-- --:--:-- --:--:-- 746
[root@master filebeat]# docker run --name filebeat --user=root -d --net net-elk --volume="/var/log/:/var/log/nginx/" --volume="/usr/local/elk/filebeat/filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro" --volume="/var/lib/docker/containers:/var/lib/docker/containers:ro" --volume="/var/run/docker.sock:/var/run/docker.sock:ro" store/elastic/filebeat:7.14.0
## 初始化命令注解
{nginx-path} = 本地的日志文件目录(映射到容器中 作为数据源)
{path} = Filebeat配置文件路径
{ip} = elasticsearch 地址
docker run --name filebeat --user=root -d --net somenetwork --volume="{nginx-path}:/var/log/nginx/" --volume="{path}/filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro" --volume="/var/lib/docker/containers:/var/lib/docker/containers:ro" --volume="/var/run/docker.sock:/var/run/docker.sock:ro" store/elastic/filebeat:7.1.1
五、Docker安装ElasticSearch-head(可选)
1、拉取镜像
[root@master ~]# docker pull mobz/elasticsearch-head:5
[root@master ~]# docker run -d -p 9100:9100 docker.io/mobz/elasticsearch-head:5
[root@master ~]# vim /usr/local/elk/elasticsearch/elasticsearch.yml
# 解决跨域问题,在elasticsearch.yml中添加,并重启es
http.cors.enabled: true
http.cors.allow-origin: "*"
六、 Docker部署Elasticsearch+Kibana+Logstash+Filebeat完美适配Springboot应用
1、解决Java应用pom.xml 文件,引入 logstash 的依赖:
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>6.6</version>
</dependency>
2、在 resource 下创建 log/logback-springxml 文件
这里我们主要填写<destination>ip:端口</destination>
,关于 <pattern>
标签则看个人使用情况修改:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml" />
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>192.168.161.128:5044</destination>
<!-- 日志输出编码 -->
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
<providers>
<timestamp>
<timeZone>UTC</timeZone>
</timestamp>
<pattern>
<pattern>
{
<!--es索引名称 -->
"index":"elk",
<!--应用名称 -->
"appname":"${spring.application.name}",
<!--打印时间 -->
"timestamp": "%d{yyyy-MM-dd HH:mm:ss.SSS}",
<!--线程名称 -->
"thread": "%thread",
<!--日志级别 -->
"level": "%level",
<!--日志名称 -->
"logger_name": "%logger",
<!--日志信息 -->
"message": "%msg",
<!--日志堆栈 -->
"stack_trace": "%exception"
}
</pattern>
</pattern>
</providers>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="LOGSTASH" />
<appender-ref ref="CONSOLE" />
</root>
</configuration>
3、最后修改 application.yml 文件:
logging:
config: classpath:log/logback-spring.xml
4、完整检验Docker部署Elasticsearch+Kibana+Logstash+Filebeat全家桶环境
启动后在 elasticsearch-head 界面即可看到输出的日志:http://10.100.21.17:9200
同时在 kibana 页面可以看到增加了索引 elk: http://10.100.21.17: 5601
七、总结
Docker部署Elasticsearch+Kibana+Logstash+Filebeat全家桶整个过程中常见问题
1、创建容器时内存不足
在启动 elasticsearch 或 logstash 容器时,可能会出现内存不足的情况,我们可以通过编辑修改指定文件来修改内存分配:
# 方法一、在启动 elasticsearch 容器时,可直接加入环境变量
-e "ES_JAVA_OPTS=-Xms2g -Xmx2g"
# 方法二、映射卷的方式,大约在第6,7行,调整内存大小即可
[root@master ~]# vim /usr/local/elk/logstash/config/jvm.options
-Xms1g
-Xmx1g
# 方法三、容器内的方式,同理,也可以docker exec -it登录容器内部调整,大约在33,34行
33 -Xms2g
34 -Xmx2g
2、Logstash端口映射
在编辑 logstash.conf
文件时,需要注意暴露出来的端口还需要容器映射才行,否则会导致 springboot 连接不上 logstash,如:
input {
tcp {
mode => "server"
host => "0.0.0.0" # 允许任意主机发送日志
port => 5044
codec => json_lines # 数据格式
}
}
docker部署elasticsearch-kibana-logstash-filebeat-v7-14相关帮助文档