目錄
0、引言
學習記錄 :Docker搭建 Elasticsearch + Logstash + Kibana + Filebeat
ELKB :7.7.0
服務器 : Centos 7.7.1908
本次主要介紹簡單安裝和收集配置,之後會整理從Redis,Mysql收集數據的思路及實測可用的配置。
每一項安裝時我碰到的問題,我都會總結在最下面了。>>問題整理<<
1、流程
日誌流規劃
2、安裝
拉取鏡像就不囉嗦了,直接docker pull xxx;
2.1 創建bridge網絡
# 創建網絡,設置子網,網關
docker network create --driver bridge --subnet=172.28.0.0/16 --gateway=172.28.0.1 elkb
# 查看網絡列表,可以看到剛剛創建的 名稱爲elkb的網絡
docker network ls
NETWORK ID NAME DRIVER SCOPE
43d968dd5106 bridge bridge local
ed78d4b05185 elkb bridge local
27d34658c92c host host local
8aabc48398e4 none null local
2.2 創建Elasticsearch容器
- 容器創建命令
指定容器網絡,指定網絡ip,綁定主機端口9200,9300
docker run -d --name elasticsearch --net elkb --ip 172.28.0.2 \
-p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" \
docker.elastic.co/elasticsearch/elasticsearch:7.7.0
- 結果展示,瀏覽器直接訪問 ip:9200
2.3 創建Kibana容器
- 容器創建命令
指定容器網絡,指定網絡ip,綁定主機端口5601
docker run -d --name kibana --net elkb --ip 172.28.0.3 \
-p 5601:5601 \
docker.elastic.co/kibana/kibana:7.7.0
- 結果展示,直接瀏覽器訪問 ip:5601
2.3 創建Logstash容器
- 容器創建命令
指定容器網絡,指定網絡ip,綁定主機端口5044
這個容器需要綁定目錄,到服務器目錄,因爲需要修改配置文件
docker run -it -d --name logstash \
-p 5044:5044 --net elkb --ip 172.28.0.4 \
-v /mnt-docker/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml \
-v /mnt-docker/logstash/conf.d/:/usr/share/logstash/conf.d/ \
docker.elastic.co/logstash/logstash:7.7.0
- 結果展示 : 因爲logstash沒有界面,而且啓動很慢,所以需要等一下,查看容器的狀態。
- 編輯配置文件
配置文件編輯完成,重啓容器 docker restart logstash(名稱/id)
# ===============logstash.yml logstash配置主文件=====
vim /mnt-docker/logstash/logstash.yml
# 寫入下面的內容
# 加載目錄下的所有以.conf結尾的規則文件
path.config: /usr/share/logstash/conf.d/*.conf
path.logs: /var/log/logstash
# ===============test.conf 第一個規則文件============
vim /mnt-docker/logstash/conf.d/test.conf
# 寫入下面的內容
# 從beats接收數據,並輸出到elasticsearch
input {
beats {
port => 5044
codec => "json"
}
}
output {
elasticsearch {
hosts => ["elasticsearch:9200"]
index => "test-%{+YYYY.MM.dd}"
}
stdout { codec => rubydebug }
}
2.4 創建Filebeat容器
- 容器創建命令
指定容器網絡,指定網絡ip,
這個容器需要綁定目錄,到服務器目錄,因爲需要修改配置文件
還多綁定了一個nginx目錄方便收集日誌測試
docker run --name filebeat --user=root -d --net elkb --ip 172.28.0.5 \
-v /var/log/nginx/:/var/log/nginx \
-v /mnt-docker/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml \
-v /var/lib/docker/containers:/var/lib/docker/containers \
-v /var/run/docker.sock:/var/run/docker.sock \
docker.elastic.co/beats/filebeat:7.7.0
- 編輯配置文件
配置文件編輯完成,重啓容器 docker restart filebeat(名稱/id)
# ===============filebeat.yml filebeat收集日誌============
vim /mnt-docker/filebeat/filebeat.yml
# 寫入下面的內容 收集nginx運行日誌,並寫入logstash 172.18.0.4對應容器的ip
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
output.logstash:
hosts: ['172.18.0.4:5044']
好了,基礎安裝已經結束。
3、流程測試
軟件已經安裝好了,正常到這裏,有訪問日誌,我們的Elasticsearch就已經收到數據了,可以通過Kibana創建Index patterns去分析檢索了。
3.1 問題排查:docker logs
通過docker logs 命令查看容器啓動和運行的輸出日誌。
使用logstash將收集的日誌輸出到控制檯,通過logs 我們也可以查看數據格式。
# 查看某個容器的log輸出 xxx替換成對應的 容器名稱/容器id
docker logs -f -t xxx --tail 100
# 查看elasticsearch輸出
docker logs -f -t elasticsearch --tail 100
通過logs,大多數運行中的問題都可以發現,我遇到的問題回憶整理下:
- 端口開放問題(我用的是阿里雲的服務器,需要在防火牆和ECS控制檯都操作下)
- 對應docker服務,ip寫入錯誤(filebeat output配置,寫錯了logstash的ip)
4、問題整理
4.1 內存問題
因爲我使用的阿里雲2G內存的服務器,對。。。嗯。。。。
Exception in thread "main" java.lang.RuntimeException: starting java failed with [1]
output:
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 1073741824 bytes for committing reserved memory.
# An error report file with more information is saved as:
# logs/hs_err_pid132.log
error:
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error='Not enough space' (errno=12)
at org.elasticsearch.tools.launchers.JvmErgonomics.flagsFinal(JvmErgonomics.java:126)
at org.elasticsearch.tools.launchers.JvmErgonomics.finalJvmOptions(JvmErgonomics.java:88)
at org.elasticsearch.tools.launchers.JvmErgonomics.choose(JvmErgonomics.java:59)
at org.elasticsearch.tools.launchers.JvmOptionsParser.jvmOptions(JvmOptionsParser.java:139)
at org.elasticsearch.tools.launchers.JvmOptionsParser.main(JvmOptionsParser.java:95)
解決方法:
# 搜索找到下面的文件,修改配置信息
find /var/lib/docker/overlay2/ -name jvm.options
# 結果
/var/lib/docker/overlay2/ee28c4597cf0691e769deb1b1e3d2a6e8192ec2127ee352eae9e838b875bbc02/diff/usr/share/logstash/config/jvm.options
/var/lib/docker/overlay2/91c5c75d5317968f899078644cf47bb98a8f2ff6428c4a57be4d40b8b9917abe/diff/usr/share/logstash/config/jvm.options
/var/lib/docker/overlay2/85e6a8ce14bbb386c13b82963c2fdb5527fa1227fbbe8e9854f09be9b4f848a0/diff/usr/share/elasticsearch/config/jvm.options
# 怎麼操作,改什麼
# vim 對應的路徑
vim /var/lib/docker/overlay2/ee28c4597cf0691e769deb1b1e3d2a6e8192ec2127ee352eae9e838b875bbc02/diff/usr/share/logstash/config/jvm.options
# 找到到配置
-Xms2g
-Xmx2g
# 修改爲 512m 或者更小的 256m
-Xms512m
-Xmx512m
4.2 容器衝突問題
報錯如下 :
/usr/bin/docker-current: Error response from daemon: driver failed programming external connectivity on endpoint
問題原因:
實際上並沒有衝突的容器存在。
Docker服務啓動時定義的自定義鏈Docker由於某種原因被清掉。
重啓Docker服務即可重新生成自定義鏈Docker。
解決方法:
# 相關命令
systemctl restart docker 重啓docker服務
systemctl stop docker 關閉docker
systemctl start docker 啓動docker