1. Elasticsearch安裝
下載elasticsearch7.6.0的docker鏡像:
docker停止啟動(dòng)重啟的時(shí)候不用復(fù)制,只要輸入幾個(gè)字母就行了。
docker pull elasticsearch:7.6.0
修改虛擬內(nèi)存區(qū)域大小,否則會(huì)因?yàn)檫^小而無法啟動(dòng):
#切換到root用戶
#執(zhí)行命令:
sysctl -w vm.max_map_count=262144
# 使之立即生效
sysctl -p
#查看結(jié)果:
sysctl -a|grep vm.max_map_count
#顯示:
vm.max_map_count = 262144
#上述方法修改之后,如果重啟虛擬機(jī)將失效,所以:
#解決辦法:
#在 /etc/sysctl.conf文件最后添加一行,通過vim,輸入shift + g快速跳到最后一行
vm.max_map_count=262144
#即可永久修改
使用docker命令啟動(dòng):
docker run -p 9200:9200 -p 9300:9300 --name elasticsearch \
-e "discovery.type=single-node" \
-e "cluster.name=elasticsearch" \
-v /root/hospital-test-0703/yang/mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-v /root/hospital-test-0703/yang/mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-d elasticsearch:7.6.0
啟動(dòng)時(shí)會(huì)發(fā)現(xiàn)/usr/share/elasticsearch/data目錄沒有訪問權(quán)限,只需要修改/mydata/elasticsearch/data目錄的權(quán)限,再重新啟動(dòng)。
(以及這里面有一個(gè)重坑,如果把之前docker裝的elasticsearch刪掉了,然后重裝,一定要把掛載目錄里面的東西清理干凈,不然換一個(gè)版本適配不了。)
這里面有好幾點(diǎn)要注意的,首先是
mkdir -p xxxx/xxxx/xxxx來創(chuàng)建一系列目錄
然后是/開頭就是絕對(duì)目錄,而docker -v必須要用絕對(duì)目錄
這里的chmod也有重坑,必須要精確到data這一級(jí)目錄,在父目錄上面加權(quán)限不行
chmod 777 /mydata/elasticsearch/data/
chmod 777 /mydata/elasticsearch/plugins
(ll可以看權(quán)限等級(jí))
- 安裝中文分詞器IKAnalyzer,并重新啟動(dòng):
planA:
#進(jìn)入容器
docker exec -it elasticsearch /bin/bash
#此命令需要在容器中運(yùn)行
elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.6.0/elasticsearch-analysis-ik-7.6.0.zip
docker restart elasticsearch
plabB:
由于在容器里面運(yùn)行install實(shí)在太慢了,沒法跑啊,于是自己去github上面下載了zip,解壓之后拖到了plugin文件夾里面。
- elasticsearch沒提供界面管理,所以要自己安裝一個(gè)。
planA:
最好的planA+是直接chrome商店下載一個(gè)。
https://github.com/mobz/elasticsearch-head下載這個(gè)網(wǎng)頁里面項(xiàng)目,然后解壓完了之后找到elasticsearch-head-master\elasticsearch-head-master\crx也就是找到crx這個(gè)文件夾,里面有個(gè)es-head.crx,這個(gè)就是擴(kuò)展程序,不過不能直接這樣拖進(jìn)去,要把這個(gè)文件的后綴改成rar,解壓出來。

然后解壓出來的這個(gè)文件夾就能變成插件安裝上去。
planB:
(這么裝出來,有數(shù)據(jù)不顯示的問題)
#拉取鏡像
docker pull mobz/elasticsearch-head:5
#運(yùn)行容器
docker run -d --name es-head -p 9100:9100 mobz/elasticsearch-head:5
瀏覽器打開: http://39.100.144.125:9100

嘗試連接elaseticsearch會(huì)發(fā)現(xiàn)無法連接上,由于是前后端分離開發(fā),所以會(huì)存在跨域問題,需要在服務(wù)端做CORS的配置,如下
修改docker中elasticsearch的elasticsearch.yml文件
docker exec -it elasticsearch /bin/bash
vim config/elasticsearch.yml
在最下面添加2行
#kua yu
http.cors.enabled: true
http.cors.allow-origin: "*"
退出并重啟服務(wù)
exit
docker restart elasticsearch
2. kibana安裝
- 下載kibana6.4.0的docker鏡像:
docker pull kibana:7.6.0
- 使用docker命令啟動(dòng):
docker run --name kibana -p 5601:5601 \
--link elasticsearch:es \
-e "elasticsearch.hosts=http://es:9200" \
-d kibana:7.6.0
Kibana設(shè)置中文:
#進(jìn)入kibana容器
docker exec -it kibana /bin/bash
#打開yml
vi /usr/share/kibana/config/kibana.yml
在末尾加上一行
i18n.locale: zh-CN

然后exit退出docker容器
容器重啟使配置生效
docker restart kibana
- 訪問地址進(jìn)行測(cè)試:[http://http://39.100.144.125:5601/
時(shí)間相差八個(gè)小時(shí)的問題,可以直接在Kibana的設(shè)置里面把時(shí)區(qū)設(shè)置成Asia的時(shí)區(qū),直接就解決了,filebeat和logstash什么也不用設(shè)置
3. FileBeat安裝
#拉鏡像
docker pull docker.elastic.co/beats/filebeat:7.6.0
然后在運(yùn)行docker容器之前,先整一個(gè)yml。先創(chuàng)建好目錄,然后vim yml編輯一個(gè)yml。
#創(chuàng)建一個(gè)目錄,這次用的是/root/hospital-test-0703/yang/mydata/filebeat/filebeat.yml
vim /root/hospital-test-0703/yang/mydata/filebeat/filebeat.yml
(這個(gè)yml是個(gè)大坑!??!enable是一個(gè)坑,multi是一個(gè)坑)
filebeat.inputs:
- type: log
enabled: true
paths:
# 上面也就這一個(gè)值得改的,就改這個(gè)位置,上面的enable可以在寫了多組設(shè)置之后快速更改哪個(gè)生效
- /var/log/gateway.log
tags: ["hospital"]
#帶井號(hào)的在粘貼的時(shí)候有問題,就是會(huì)把縮進(jìn)搞亂,這個(gè)粘貼的時(shí)候不能帶井號(hào)一起粘
#multiline這個(gè)是為了把一行日志打不下來的日志合并起來,不然filebeat收集到的就已經(jīng)是文件流了,每一行算一條。
# 這是個(gè)正則表達(dá)式,^是以這個(gè)開頭,也就是匹配以 "[" 開頭的行
multiline.pattern: '^\['
# 否定模式,這個(gè)默認(rèn)是false,跟上面設(shè)置的反向
multiline.negate: true
# 這個(gè)after結(jié)合上面的否定模式以及匹配字符,發(fā)揮出來的作用就是,把首行之后不是以 "[" 開頭的行接到上一行上湊成多行模式
multiline.match: "after"
#-------------------------- Elasticsearch output ------------------------------
#output.elasticsearch:
# hosts: ["39.100.144.125:9200"]
#-------------------------- Logstash ------------------------------------------
output.logstash:
hosts: ["39.100.144.125:5044"]
# 刪除各個(gè)沒用的標(biāo)簽
processors:
- drop_fields:
fields: ["input_type", "log.offset", "host.name", "input.type", "agent.hostname", "agent.type", "ecs.version", "agent.ephemeral_id", "agent.id", "agent.version", "fields.ics", "log.flags" ]
yml編輯完了之后,在下面注意幾個(gè)位置,都映射過去,這里似乎這幾個(gè)文件夾都不要什么權(quán)限的。
#跑鏡像
docker run -d --name=filebeat \
-v /root/hospital-test-0703/yang/mydata/logs:/var/log \
-v /root/hospital-test-0703/yang/mydata/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml \
-v /root/hospital-test-0703/yang/mydata/filebeat/registry/:/usr/share/filebeat/data/registry/ docker.elastic.co/beats/filebeat:7.6.0
4. logstash 安裝
#拉鏡像
docker.elastic.co/logstash/logstash:7.6.0
建立這樣的目錄
/root/hospital-test-0703/yang/mydata/logstash/conf.d/logstash.conf
/root/hospital-test-0703/yang/mydata/logstash/logstash.yml
第一個(gè)conf是重點(diǎn),說實(shí)話第二個(gè)yml有沒有用我還不確定。
第一個(gè)conf內(nèi)容
input {
beats {
port => 5044
#codec => json
client_inactivity_timeout => 360000
}
}
output {
elasticsearch {
hosts=>["39.100.144.125:9200"]
index => "logstash-%{+YYYY.MM.dd}" #對(duì)日志進(jìn)行索引歸檔
}
#stdout {codec => rubydebug}
}
filter {
mutate {
remove_field => ["tags", "@version"]
}
}
第二個(gè)yml內(nèi)容
path.config: /usr/share/logstash/conf.d/*.conf
path.logs: /var/log/logstash
兩個(gè)文件都建好了之后,跑鏡像
docker run -d -it -p 5044:5044 --name logstash \
-v /root/hospital-test-0703/yang/mydata/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml \
-v /root/hospital-test-0703/yang/mydata/logstash/conf.d/:/usr/share/logstash/conf.d/ \
docker.elastic.co/logstash/logstash:7.6.0
跑起來logstash之后,讓filebeat往這里面輸入日志,然后進(jìn)入docker鏡像去看日志輸出。
docker logs -ft logstash
5. docker的安裝經(jīng)驗(yàn)
(1) ELK有一個(gè)大問題,就是這些東西要保持版本的高度一致。所以如果不清楚自己拉的是哪個(gè)版本就很麻煩。
docker inspect elasticsearch
也試過使用這個(gè)命令來看一下版本,結(jié)果標(biāo)簽上面寫的就是latest,沒查到版本。
(2) 善用docker logs filebeat這種命令,每一次都帶著監(jiān)控看
(3) 39服務(wù)器空間不夠