为什么选择Docker?
Docker是目前非常主流的容器化的虚拟技术,这个虚拟又与VMware或者是Hyper-v搭建的虚拟机不同,虚拟机是在宿主机的内核已经操作系统系统之上在虚拟出一套操作系统,而Docker这种容器化的技术是基于操作系统的namespace直接使用宿主机的操作系统去构建需要隔离的应用,中间省去了再去虚拟化一套操作系统的过程,或许有人会担心使用如果Docker的容器挂掉了之后,数据会丢失的问题,这你大可不必的过多担心,Docker本身实现了数据卷的工程,可以将容器内部的目录挂载到宿主机之上,只要你的宿主机还健康,那么上面的数据就不会丢失.甚至是当你重新创建一个容器之后你将新容器的数据目录也挂载到了之前容器的目录上,数据都可以复用,但我不建议你这样哦~
ELK版本的选择
主版本不用最新版,大版本不用老版,这是我选择版本的原则,根据这个原则我们打开DockerHub看一下哪一个版本符合我的要求.
可以看到最新版本是7.14,那么根据上面的选择版本的原则,我们直接pull 7.13.0版本的ELK即可.
安装docker-compose
ELK其实是三个开源软件的简称,E代表的是搜索引擎elasticsearch,L代表的是日志收集系统logstash,K代表的是可视化的es的索引分析平台.当然我们选择了Docker安装,那么ELK就代表了三个容器,对于容器的版本,选择docker-compose更加合适.
代码语言:javascript复制# 使用国内镜像下载docker-compose
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-uname -s-uname -m > /usr/local/bin/docker-compose
# 服务docker-compose执行权限
sudo chmod x /usr/local/bin/docker-compose
下载ELK的Docker镜像
代码语言:javascript复制docker pull elasticsearch:7.13.0
docker pull logstash:7.13.0
docker pull kibana:7.13.0
编写docker-compose.yml文件
代码语言:javascript复制version: '3'
services:
elasticsearch:
image: elasticsearch:7.13.0
container_name: elasticsearch-dev
networks:
- host
environment:
- "cluster.name=elasticsearch" #设置集群名称为elasticsearch
- "discovery.type=single-node" #以单一节点模式启动
- "ES_JAVA_OPTS=-Xms512m -Xmx512m" #设置使用jvm内存大小
volumes:
- /pins/dev/data/elasticsearch/plugins:/usr/share/elasticsearch/plugins #插件文件挂载
- /pins/dev/data/elasticsearch/data:/usr/share/elasticsearch/data #数据文件挂载
ports:
- :9200
kibana:
image: kibana:7.13.0
container_name: kibana-dev
networks:
- host
links:
- elasticsearch:es #可以用es这个域名访问elasticsearch服务
depends_on:
- elasticsearch #kibana在elasticsearch启动之后再启动
environment:
- "elasticsearch.hosts=http://es:9200" #设置访问elasticsearch的地址
ports:
- :5601
logstash:
image: logstash:7.13.0
container_name: logstash-dev
networks:
- host
volumes:
- /pins/dev/data/logstash/conf:/usr/share/logstash/pipeline/ #挂载logstash的配置文件
depends_on:
- elasticsearch #kibana在elasticsearch启动之后再启动
links:
- elasticsearch:es #可以用es这个域名访问elasticsearch服务
ports:
- :4560
networks:
host:
先别急着启动
启动之前先使用netstat -anp | grep 端口号 查看一下你用到的端口有没有被占用,还记得上面我说过的容器挂载吗,挂载的目录要在宿主机上创建好哦,不然是会报错的哦~,你以为事情如此简单,一个坑都没有?那必然不是呀.
设置内核参数
代码语言:javascript复制# 改变设置
sysctl -w vm.max_map_count=262144
# 使之立即生效
sysctl -p
es的数据挂载目录需要全权限
代码语言:javascript复制chomd 777 /pins/dev/data/elasticsearch/data
修改logstash.conf输出到es
代码语言:javascript复制input {
tcp {
mode => "server"
host => "0.0.0.0"
port => 4560
codec => json_lines
}
}
output {
elasticsearch {
hosts => "es:9200"
index => "springboot-logstash-%{ YYYY.MM.dd}"
user => "elastic"
password => "密码我不告诉你"
}
}
启动ELK
看图,懂的都懂懒得解释了
代码语言:javascript复制docker-compose -f docker-compose-dev.yml up -d
LogStash安装json_lines插件
代码语言:javascript复制# 进入logstash容器
docker exec -it logstash-dev /bin/bash
# 进入bin目录 cd /bin/
# 安装插件 logstash-plugin install logstash-codec-json_lines
# 退出容器 exit
# 重启logstash服务 docker restart logstash-dev
使用Kibana在es创建Index索引
浏览器访问http://192.168.1.52:5601/进入kibana.
创建logstack输出到es的索引模式
SpringBoot输出日志到Logstash
怎么讲SpringBoot的日志输出到logstash上呢,veryeasy,我又懒得解释了,自己看代码吧.
代码语言:javascript复制<!--输出到logstash的appender-->
<appender name="LOGSTASH-DEV" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!--可以访问的logstash日志收集端口-->
<destination>192.168.1.52:4560</destination>
<!-- 日志输出编码 -->
<encoder charset="UTF-8"
class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp>
<timeZone>UTC</timeZone>
</timestamp>
<pattern>
<pattern>
{
"logLevel": "%level",
"serviceName": "hospital-manage",
"pid": "${PID:-}",
"thread": "%thread",
"class": "%logger{40}",
"rest": "%message %ex",
"@profile":"dev"
}
</pattern>
</pattern>
</providers>
</encoder>
</appender>
<!-- springboot多环境配置 -->
<springProfile name="prod">
<root>
<level value="info"/>
<appender-ref ref="loghubAppender"/>
</root>
</springProfile>
<springProfile name="dev | test | prod">
<root>
<level value="info"/>
<appender-ref ref="fileAppender"/>
<appender-ref ref="LOGSTASH-DEV"/>
</root>
</springProfile>
<springProfile name="dev | test">
<root>
<level value="info"/>
<appender-ref ref="STDOUT"/>
<appender-ref ref="LOGSTASH-DEV"/>
</root>
</springProfile>
这里需要注意的是logback.xml要更名为logback-spring,不然多环境配置中的springProfile标签可是不可以用的哦~
展示一下效果吧
结束了,但没完全结束,因为上面的做法并不安全
为ELK增加权限控制
docker的命令我也懒得解释了
代码语言:javascript复制### es增加密码
docker exec -it elasticsearch-dev /bin/bash
vi config/elasticsearch.yml
代码语言:javascript复制cluster.name: "docker-cluster"
network.host: 0.0.0.0
xpack.security.enabled: true
xpack.license.self_generated.type: basic
xpack.security.transport.ssl.enabled: true
代码语言:javascript复制### 重启es,初始化密码
docker restart elasticsearch-dev
docker exec -it elasticsearch-dev /bin/bash
elasticsearch-setup-passwords interactive
修改logstash.conf增加访问es的账号密码
代码语言:javascript复制input {
tcp {
mode => "server"
host => "0.0.0.0"
port => 4560
codec => json_lines
}
}
output {
elasticsearch {
hosts => "es:9200"
index => "springboot-logstash-%{ YYYY.MM.dd}"
user => "elastic"
password => "密码我不告诉你"
}
}
修改Kibana增加访问es的账号密码
代码语言:javascript复制# Default Kibana configuration for docker target
server.host: "0"
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
monitoring.ui.container.elasticsearch.enabled: true
i18n.locale: "zh-CN"
elasticsearch.username: "elastic"
elasticsearch.password: "密码我还是不告诉你"