使用docker-compose安装ELK(elasticsearch,logstash,kibana)并简单使用

首先服务器上需要安装docker已经docker-compose,如果没有,可以参考我之前写的文章进行安装。

https://blog.csdn.net/a_lllk/article/details/143382884?spm=1001.2014.3001.5502

1.下载并启动elk容器

先创建一个网关,让所有的容器共用此网关,方便容器之间互相通信。

复制代码
docker network create elk-net

编写docker-compose.yml,我这里的docker-compose版本是2.8.0,可以根据自己安装的docker-compose去调整version。ELK的版本都使用的事8.6.2。

复制代码
version: '2.8'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.6.2
    restart: always
    container_name: es
    environment:
      - "ES_JAVA_OPTS=-Xms256m -Xmx512m"
      - "discovery.type=single-node"
      - "ELASTIC_USERNAME=elastic"
      - "ELASTIC_PASSWORD=elastic"
      - "ingest.geoip.downloader.enabled=false"
      - "xpack.security.transport.ssl.enabled=false"
      - "xpack.security.http.ssl.enabled=false"
      - "xpack.security.enabled=true"
      - "bootstrap.memory_lock=true"
      - "cluster.name=es-cluster"
    ports:
      - "9200:9200"
      - "9300:9300"
    privileged: true
    networks:
      - elk-net

  logstash:
    image: docker.io/logstash:8.6.2
    container_name: logstash
    environment:
      - "LS_JAVA_OPTS=-Xmx256m -Xms256m"
    ports:
      - "5044:5044"  # Beats通信
      - "9600:9600"  # API通信
    networks:
      - elk-net
    restart: always
    privileged: true

  kibana:
    image: docker.elastic.co/kibana/kibana:8.6.2
    container_name: kibana
    environment:
      - "ELASTICSEARCH_HOSTS=http://elasticsearch:9200"
      - "SERVER_NAME=kibana"
      - "XPACK_SECURITY_ENABLED=true"
    ports:
      - "5601:5601"
    networks:
      - elk-net
    restart: always
    privileged: true

networks:
  elk-net:
    driver: bridge

将文件放入服务器的任意目录,然后输入以下命令运行。

复制代码
docker-compose up -d

稍等一会,等镜像下载并创建容器,我这里因为早就下载好了镜像,所以就直接创建了容器。

可以使用docker ps -a查看容器的创建情况,我的容器创建如下图

可以使用ip+端口的形式去查看运行容器的情况,这里注意如果是服务器的话记得打开对于端口。

elasticsearch使用ip+:9200端口去访问

kibana使用ip+:5601去访问。这里注意,如果页面显示"Kibana server is not ready yet."是正常情况,因为目前并没有对elasticsearch做任何配置,kibana是没有检测到es的存在。

logstash暂时没有验证的方式,只要看容器的启动状态是up就行了。

2.配置ELK

2.1.配置elasticsearch

首先在服务器目录创建一个文件夹,来存放容器中的数据。

复制代码
mkdir -p /usr/local/docker/elasticsearch

然后将容器中的配置文件及data,logs目录复制到当前宿主机指定目录下。

复制代码
docker cp es:/usr/share/elasticsearch/config /usr/local/docker/elasticsearch/config
docker cp es:/usr/share/elasticsearch/data /usr/local/docker/elasticsearch/data
docker cp es:/usr/share/elasticsearch/logs /usr/local/docker/elasticsearch/logs

进入config目录,有一个elasticsearch.yml文件,这个就是容器的配置文件。

我一般为了保险起见,都会先复制一个没有修改过的配置文件,避免修改配置文件出错时,容器启动报错。

复制代码
cp elasticsearch.yml  elasticsearch-backup.yml

然后修改配置文件,内容如下:

复制代码
vim elasticsearch.yml
复制代码
cluster.name: "es-cluster"
network.host: 0.0.0.0

node.name: node-01
path.data: /usr/share/elasticsearch/data
path.logs: /usr/share/elasticsearch/logs
http.port: 9200
discovery.type: single-node
xpack.security.enabled: true
bootstrap.memory_lock: true

保存并退出,es的配置文件就编辑好了。

2.配置kibana

同样创建一个文件夹,来存放容器中的数据。

复制代码
mkdir -p /usr/local/docker/kibana

将需要的文件复制到宿主机中。

复制代码
docker cp kibana:/usr/share/kibana/config /usr/local/docker/kibana/

docker cp kibana:/usr/share/kibana/data /usr/local/docker/kibana/

docker cp kibana:/usr/share/kibana/logs /usr/local/docker/kibana/

进入config目录,编辑名为kibana.yml的配置文件。

复制代码
vim kibana.yml

配置文件内容如下

复制代码
#
# ** THIS IS AN AUTO-GENERATED FILE **
#
# Default Kibana configuration for docker target
server.host: "0.0.0.0"
server.shutdownTimeout: "5s"
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
elasticsearch.username: "elastic"
elasticsearch.password: "elastic"
monitoring.ui.container.elasticsearch.enabled: true
#界面汉化
i18n.locale: "zh-CN"
##启用或禁用 Kibana 报告功能的角色管理
xpack.reporting.roles.enabled: false

保存并退出,kibana配置文件就算改好了。

3.配置logstash

创建文件夹

复制代码
mkdir -p /usr/local/docker/kibana

从容器中复制文件夹

复制代码
docker cp logstash:/usr/share/logstash/pipeline/  /usr/local/docker/logstash/

进入/logstash/pipeline,编辑logstash.conf

复制代码
input {
  beats {
    port => 5044
  }
}

output {
   elasticsearch {
        hosts => ["http://elasticsearch:9200"]
        user => "elastic"
        password => "elastic"
        index => "logs-%{+YYYY.MM.dd}"
    }
}

3.重新创建容器

上面就对所有容器的配置文件做了处理,然后因为第一次启动的时候没有挂载目录,所以更改的配置配置文件也不会生效,所以我们就需要重新创建一下容器,并将所有编辑的配置文件挂载到容器中去

首先对所有容器进行移除

复制代码
docker stop es logstash kibana

docker rm es logstash kibana

然后重新编辑上面的docker-compose.yml,将宿主机中的目录挂载到容器中。

复制代码
version: '2.8'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.6.2
    restart: always
    container_name: es
    volumes:
      - /usr/local/docker/elasticsearch/data:/usr/share/elasticsearch/data  
      - /usr/local/docker/elasticsearch/logs:/usr/share/elasticsearch/logs  
      - /usr/local/docker/elasticsearch/config:/usr/share/elasticsearch/config    
    environment:
      - "ES_JAVA_OPTS=-Xms256m -Xmx512m"
      - "discovery.type=single-node"
      - "ELASTIC_USERNAME=elastic"
      - "ELASTIC_PASSWORD=elastic"
      - "ingest.geoip.downloader.enabled=false"
      - "xpack.security.transport.ssl.enabled=false"
      - "xpack.security.http.ssl.enabled=false"
      - "xpack.security.enabled=true"
      - "bootstrap.memory_lock=true"
      - "cluster.name=es-cluster"
    ports:
      - "9200:9200"
      - "9300:9300"
    privileged: true
    networks:
      - elk-net

  logstash:
    image: docker.io/logstash:8.6.2
    container_name: logstash
    environment:
      - "LS_JAVA_OPTS=-Xmx256m -Xms256m"
    volumes:
      - /usr/local/docker/logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf:rw  # Logstash配置
    ports:
      - "5044:5044"  # Beats通信
      - "9600:9600"  # API通信
    networks:
      - elk-net
    restart: always
    privileged: true

  kibana:
    image: docker.elastic.co/kibana/kibana:8.6.2
    container_name: kibana
    environment:
      - "ELASTICSEARCH_HOSTS=http://elasticsearch:9200"
      - "SERVER_NAME=kibana"
      - "XPACK_SECURITY_ENABLED=true"
    volumes:
      - /usr/local/docker/kibana/logs:/usr/share/kibana/logs  
      - /usr/local/docker/kibana/data:/usr/share/kibana/data
      - /usr/local/docker/kibana/config:/usr/share/kibana/config 
    ports:
      - "5601:5601"
    networks:
      - elk-net
    restart: always
    privileged: true

networks:
  elk-net:
    driver: bridge

运行命令,还是生成了三个容器。使用上面的ip+端口的方式去验证,发现es可以访问,但是kibana一直在尝试重启,说明配置文件存在问题。

使用log命令查看kibana的启动日志,

复制代码
docker logs -f kibana

发现es报错了,报错信息如下

"Error: [config validation of [elasticsearch].username]: value of "elastic" is forbidden. This is a superuser account that cannot write to system indices that Kibana needs to function. Use a service account token instead. Learn more: https://www.elastic.co/guide/en/elasticsearch/reference/8.0/service-accounts.html"

这里大概意思就是elastic作为超级账号,是不能在kibana中直接使用,这里推荐使用账户token的方式去连接es。所以这里需要使用token的方式去连接es。

先进入到es的容器之中,然后运行一下命令,生成对应的token令牌。

进入容器:

复制代码
docker exec -it es /bin/bash

运行生成令牌命令:

复制代码
bin/elasticsearch-service-tokens create elastic/kibana default

复制等号后面的token信息

exit;退出容器,然后进入kibana的配置文件存放位置

复制代码
cd usr/local/docker/kibana/config/

编辑kibana.yml,内容如下:

将之前配置的用户名和密码注释或删除,然后新增elasticsearch.serviceAccountToken,内容为刚才容器中返回的token信息。

然后wq!保存,重启kibana

复制代码
docker restart kibana

然后使用ip+:5601的方式访问kibana,发现已经可以正常登录使用了,也就是kibana已经成功连接了es。

4.在SpringBoot项目中简单使用

elk的使用方式有很多种,这里简单演示一下整合springBoot。

先创建一个springBoot项目,并导入以下jar包

复制代码
        <!-- Logback Classic -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.11</version>
        </dependency>

        <!-- Logstash Logback Encoder -->
        <dependency>
            <groupId>net.logstash.logback</groupId>
            <artifactId>logstash-logback-encoder</artifactId>
            <version>6.3</version>
        </dependency>

然后在application.properties同级目录,新建一个文件,文件名就是"logback-spring.xml"

然后xml内容如下。

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern>
        </encoder>
    </appender>
    <!-- 控制台输出 -->
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}.%M.%L) - %highlight(%msg)%n
                </pattern>
            </layout>
        </appender>
        <!-- logback 输出 -->
        <appender name="STASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
            <destination>60.204.148.130:5044</destination>
            <encoder class="net.logstash.logback.encoder.LogstashEncoder">
                <includeCallerData>true</includeCallerData>
                <timeZone>UTC</timeZone>
                <customFields>{"server_name":"demo-server"}</customFields>
            </encoder>
        </appender>
        <root level="DEBUG">
            <!-- 将日志发送到Logstash -->
            <appender-ref ref="STDOUT"/>
            <appender-ref ref="STASH"/>
        </root>
</configuration>

然后直接启动springBoot项目,我这边为了演示,level使用的是debug模式,如果觉得debug模式记录太多的话,可以将xml最下面的root level值改为info.

然后访问kibana主页,点击右侧management下面的Stack Management。

进入Stack Management后,选择右边的索引管理。

这里已经成功根据配置文件,新建了一个记录springBoot项目运行日志的索引。

然后可以点击右侧Management下的开发工具。

在左边控制台中输入下面命令,去查看日志的记录清空。

复制代码
GET /logs-2025.01.16/_search // _search
{
  "sort": [
    {
      "@timestamp": {
        "order": "desc"
      }
    }
  ], 
  "query": {
    "match_all": {}
  }
}
相关推荐
真实的菜2 小时前
Elasticsearch 分片机制高频面试题(含参考答案)
elasticsearch·搜索引擎·es
孤的心了不冷2 小时前
【Docker】CentOS 8.2 安装Docker教程
linux·运维·docker·容器·eureka·centos
ice___Cpu3 小时前
Git - 1( 14000 字详解 )
大数据·git·elasticsearch
tebukaopu1483 小时前
官方 Elasticsearch SQL NLPChina Elasticsearch SQL
大数据·sql·elasticsearch
头疼的程序员3 小时前
docker学习与使用(概念、镜像、容器、数据卷、dockerfile等)
学习·docker·容器
IT小郭.3 小时前
使用 Docker Desktop 安装 Neo4j 知识图谱
windows·python·sql·docker·知识图谱·database·neo4j
淡水猫.3 小时前
hbit资产收集工具Docker(笔记版)
运维·docker·容器
jiedaodezhuti11 小时前
ElasticSearch重启之后shard未分配问题的解决
笔记·elasticsearch
jiedaodezhuti11 小时前
为什么elasticsearch配置文件JVM配置31G最佳
大数据·jvm·elasticsearch
旧故新长12 小时前
访问 Docker 官方镜像源(包括代理)全部被“重置连接”或超时
运维·docker·容器