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-head效果图

六、 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相关帮助文档

Docker应用容器化,修改 Docker 镜像默认存储位置的方法