Docker搭建ELK

ElasticSearch简介

Elasticsearch 是一个分布式的免费开源搜索和分析引擎,适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。Elasticsearch 在 Apache Lucene 的基础上开发而成,由 Elasticsearch N.V.(即现在的 Elastic)于 2010 年首次发布。Elasticsearch 以其简单的 REST 风格 API、分布式特性、速度和可扩展性而闻名,是 Elastic Stack 的核心组件;Elastic Stack 是一套适用于数据采集、扩充、存储、分析和可视化的免费开源工具。人们通常将 Elastic Stack 称为 ELK Stack(代指 Elasticsearch、Logstash 和 Kibana),目前 Elastic Stack 包括一系列丰富的轻量型数据采集代理,这些代理统称为 Beats,可用来向 Elasticsearch 发送数据。

Elasticsearch 的用途是什么?

Elasticsearch 在速度和可扩展性方面都表现出色,而且还能够索引多种类型的内容,这意味着其可用于多种用例:

  • 应用程序搜索
  • 网站搜索
  • 企业搜索
  • 日志处理和分析
  • 基础设施指标和容器监测
  • 应用程序性能监测
  • 地理空间数据分析和可视化
  • 安全分析
  • 业务分析

Elasticsearch 索引是什么?

Elasticsearch 索引指相互关联的文档集合。Elasticsearch 会以 JSON 文档的形式存储数据。每个文档都会在一组键(字段或属性的名称)和它们对应的值(字符串、数字、布尔值、日期、数值组、地理位置或其他类型的数据)之间建立联系。

Elasticsearch 使用的是一种名为倒排索引的数据结构,这一结构的设计可以允许十分快速地进行全文本搜索。倒排索引会列出在所有文档中出现的每个特有词汇,并且可以找到包含每个词汇的全部文档。
在索引过程中,Elasticsearch 会存储文档并构建倒排索引,这样用户便可以近实时地对文档数据进行搜索。索引过程是在索引 API 中启动的,通过此 API 您既可向特定索引中添加 JSON 文档,也可更改特定索引中的 JSON 文档。

Docker run 安装

内核设置必须设置为vm.max_map_count至少262144用于生产用途。

vi /etc/sysctl.conf
vm.max_map_count=262144

ElasticSearch

docker network create elastic

docker run -itd --name es01-test --net elastic -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms512m -Xmx512m" docker.elastic.co/elasticsearch/elasticsearch:7.16.3

查看效果

curl localhost:9200

{
  "name" : "e55c439c43e2",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "IpA90qJnSiCapy0Q1b8keQ",
  "version" : {
    "number" : "7.16.3",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "4e6e4eab2297e949ec994e688dad46290d018022",
    "build_date" : "2022-01-06T23:43:02.825887787Z",
    "build_snapshot" : false,
    "lucene_version" : "8.10.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

Kibana

应确保kibana的版本和elasticSearch的版本一致。

docker run -itd --name kib01-test --net elastic --link es01-test:elasticsearch -p 5601:5601 -e "ELASTICSEARCH_HOSTS=http://elasticsearch:9200" -e ES_JAVA_OPTS="-Xms128m -Xmx128m" docker.elastic.co/kibana/kibana:7.16.3

网页端查看效果(注:55601是virtualBox Nat网络端口映射):

Docker Compose 安装方式

先强制删除es01-test和kib01-test(或者采用先stop 再rm的方式,-f是强制删除)

docker rm -f es01-test
docker rm -f kib01-test

docker-compose.yml

version: '2.2'
services:
  elasticsearch:
    image: elasticsearch:7.16.3  #镜像
    container_name: elk_elasticsearch  #定义容器名称
    restart: always  #开机启动,失败也会一直重启
    environment:
      - "cluster.name=elasticsearch" #设置集群名称为elasticsearch
      - "discovery.type=single-node" #以单一节点模式启动
      - "ES_JAVA_OPTS=-Xms256m -Xmx256m" #设置使用jvm内存大小
    volumes:
      - /data/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins #插件文件挂载
      - /data/elk/elasticsearch/data:/usr/share/elasticsearch/data #数据文件挂载
    ports:
      - 9200:9200
    networks:
      - elastic 
  kibana:
    image: kibana:7.16.3
    container_name: elk_kibana
    restart: always
    depends_on:
      - elasticsearch #kibana在elasticsearch启动之后再启动
    environment:
      - ELASTICSEARCH_URL=http://elasticsearch:9200 #设置访问elasticsearch的地址
    ports:
      - 5601:5601
    networks:
      - elastic 
  logstash:
    image: logstash:7.16.3
    container_name: elk_logstash
    restart: always
    volumes:
      - /data/elk/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf #挂载logstash的配置文件
    depends_on:
      - elasticsearch #kibana在elasticsearch启动之后再启动
    links:
      - elasticsearch:es #可以用es这个域名访问elasticsearch服务
    ports:
      - 4560:4560
    networks:
      - elastic 
  mysql:
    restart: always
    image: mysql:8.0
    container_name: mysql-lable
    volumes:
      - /apps/mysql/mydir:/mydir
      - /apps/mysql/datadir:/var/lib/mysql
      - /apps/mysql/conf/my.cnf:/etc/my.cnf
      # 数据库还原目录 可将需要还原的sql文件放在这里
      - /apps/mysql/source:/docker-entrypoint-initdb.d
    environment:
      - "MYSQL_ROOT_PASSWORD=uu001"
      - "MYSQL_DATABASE=uudemo"
      - "TZ=Asia/Shanghai"
    ports:
      # 使用宿主机的3306端口映射到容器的3306端口
      # 宿主机:容器
      - 3306:3306

networks:
  elastic:
    driver: bridge

/apps/mysql/conf/my.conf,内容如下:

[mysqld]
user=mysql
default-storage-engine=INNODB
character-set-server=utf8
character-set-client-handshake=FALSE
collation-server=utf8_unicode_ci
init_connect='SET NAMES utf8'
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

/data/elk/logstash/logstash.conf,内容如下:

input {
  tcp {
    mode => "server"
    host => "0.0.0.0"
    port => 4560
    codec => json_lines
  }
}
output {
  elasticsearch {
    hosts => "es:9200"
    index => "logstash-%{+YYYY.MM.dd}"
  }
}

执行以下命令,以守护进程方式启动

cd /data/elk
chmod 777 elasticsearch/data
docker-compose up -d

错误解决

1. 安装后外网无法访问。

解决:docker run -p后面仿照官网加了127.0.0.1:9200:9200,这个127.0.0.1是回环地址,外网访问不到,去掉127.0.0.1即可。

2.访问ui settings Elasticsearch plugin is red

解决:安装版本不一致,保持一致即可

3. kibana server is not ready yet

通过查看日志分析问题

docker ps |grep kib

docker logs kibana的容器名称

发下以下错误:(大概意思是未发现es结点)
解决:查看配置文件(通过卷映射或者到容器内查看)

docker exec -it kibana容器名称 /bin/bash
ls

LICENSE.txt NOTICE.txt README.txt bin config data node node_modules package.json plugins src x-pack

cd config
ls

kibana.yml node.options

cat 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" ]

从这里可以看出kibana默认连接的是http://elasticsearch:9200,这里可以修改这里,也可以在docker run的时候 加上--link es实例名称:elasticsearch

links实质是在kibana的etc/hosts设置一个对应的映射。

3.ElasticsearchException[failed to bind service]; nested: AccessDeniedException[/usr/share/elasticsearch/data/nodes];
解决:权限问题。执行以下命令配置权限

cd /data/elk
chmod 777 elasticsearch/data

查看效果:

需要如要设置登录密码,需要配置Xpack,(后续再补充)

引用

https://www.elastic.co/guide/en/kibana/current/docker.html
https://www.cnblogs.com/woshimrf/p/docker-es7.html
https://www.jianshu.com/p/2d78ce6bc504

posted @ 2022-01-27 16:39  从此启程  阅读(1749)  评论(0编辑  收藏  举报