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