上篇(spring mvc+ELK从头开始搭建日志平台)分享了从头开始搭建基于spring mvc+redis+logback+logstash+elasticsearch+kibana的分布式日志平台,是在windows平台下操作的,这篇主要是将这些软件环境全部在linux+docker折腾一遍。
我们的目的是需要在docker中安装像resis,elk这些软件环境,由于我是windows平台,搜索一把找到了boot2docker,但在安装时提示需要用dockermachine来安装,dockermachine与Oracle VM VirtualBox配合来完成,在创建一个docker时会自动创建一个linux虚似机。经过对比,我最终决定按传统的方式来做,在linux系统中去安装docker.虚似机我选择了VMware Workstation Pro,操作系统选择最新的ubantu,,安装好之后,还需要做很多操作,比如:磁盘映射,窗口大小分辨率,粘贴复制的支持等等这些方便使用虚似机的设置。
有了虚似机,就可以开始搞docker了,安装docker环境这个操作比较简单,我们只需要按照这个链接(Installation on Ubuntu)中的操作一步一步就可以了,虽然有些操作命令你不一定熟悉,但也不需要过份紧张,我们只求安装成功,有兴趣的可细研究每条命令的用途。文章中需要根据自己安装的ubuntu版本来执行相应的命令,新版本反而更加简单些,安装成功了也附加了测试方式。我们执行下docer version,如果看到如下图所示说明已经安装成功。
安装软件,安装软件一种是直接去下载压缩包,解压来安装,这种自控能力比较强,但相对麻烦,这里我们可以选择已经做好的image文件方式来安装,所有的image都可以在hub.docker中查找到,其中包含了详细的操作步骤,下面主要分享在安装过程中遇到的一些问题。
在执行时,如果发现有些命令不清楚,第一个方法是去官网上查,第二个就是利用-h或者--help在命令中查看。
- redis
docker run -v /myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf --name myredis redis redis-server /usr/local/etc/redis/redis.conf
我按上面的命令写出了下面的版本:
docker run -dit --name redis --hostname redis-host -v /data:/data -p 6379:6379 redis redis-server /data/redis.conf
上面的指令导致docker执行异常,问题出在配置文件的指定上,修改了加载配置文件的路径,改成下面的可正常运行,不知道是否是配置文件的路径不支持随意修改的原因,下面的命令没有指定redis-server以及配置文件,初步看来默认会加载配置文件,有待后续验证。
docker run -dit --name redis --hostname redis-host -v /data:/data -v /data/redis.conf:/usr/local/etc/redis/redis.conf -p : redis
- -p是端口映射,docker内部的端口映射到host的端口,比如安装了多个resis时,这个端口映射就必备设置,否则会出现host上的端口被占用的情况。
- --name,这个是为了方便根据docker的名称来操作docker,否则只能根据生成的ID来操作,不直观,比如我们可以 docker start redis来启动。
- --hostname,这个是进入docker后的一个显示名称,比如执行docker exec -it redis bash后出现的名称
- -v是磁盘路径映射,docker与host主机之间的路径关系
- -d是机后台方式运行,其它的i与t可以查文档
- 如果不指定image的版本,它会自动寻找最新的版本来安装。
- logstash
docker run -dit --name logstash --hostname logstash-host -v /data:/data logstash logstash -f /data/logstash.conf
logstash的安装没有出现redis的一波三折,配置文件的路径可直接指定,问题出在配置文件的配置上,下面是运转正常的配置
input { redis {
data_type => "list"
key => "logstash"
host => "192.168.21.128"
port => 6379
threads => 5
codec => "json"
}
}
filter { }
output {
elasticsearch {
hosts => ["192.168.21.128"]
} stdout{}
}
之前的windows版本有介绍配置,但在docker下配置有所不同,直接将windows版的配置文件拿过来,出现了logstash无法将redis中的日志输出到elastcsearch中,输出配置如下:
output { elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "logstash-%{type}-%{+YYYY.MM.dd}"
document_type => "%{type}"
workers => 1
flush_size => 20
idle_flush_time => 1
template_overwrite => true
}
stdout{}
}
这里从两方面分析:
input:确认logback是否将日志持久化到redis,可使用key *来查看是否有我们专门为日志配置的logstash这个key,然后使用llen logstash来测试日志有没有随程序的执行而增加,确认的结果是可以查到logstash这个key,而且长度随程序的执行而增加,那现在的问题就在 于logstash并没有将redis中的日志取走去执行并输出到elasticsearch中,将output中的elasticsearch的配置删 除,只保留stdout,结果发现logstash可以正常的取走日志。
output: input的排查说明问题出在output,然后采取最少配置方法,只配置最重要的属性,按文档中配置hosts再运行,结果程序运转正常。
我们按照https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html文章中说的来配置,注意hosts属性,之前配置的某些属性可能有问题,这里采取优先级最少配置法来排查问题。
- elasticsearch
docker run -dit --name elasticsearch --hostname elasticsearch-host -v /data:/data -p : -p : elasticsearch:latest
elasticsearch的安装比较奇怪,按上面的命令安装后,在客户端访问http9200端口,提示拒绝访问,端口显示为tcp,后经过无数次安装,无意中一次安装成功了,正常的映射了端口,目前详细的问题还没有找到,等后续有机会再研究。我们看docker ps后显示的结果,目前正常的情况下那个端口显示为如下图,之前出现问题时端口显示不是:0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp而是9200/tcp, 9300/tcp。
- kibana
docker run -dit --name kibana --hostname kibana-host -v /data:/data -p : -e ELASTICSEARCH_URL=http://192.168.21.128: kibana:latest
kibana的执行命令也是遇到配置文件指定的问题,后来将属性直接放在命令上了,这也是后续需要解决的问题。
上面四项都成功安装后,我们的日志就可以成功的采集到elasticsearch中了。
上面的docker在启动后,并不具备自启功能,做也是可以做到的。如果没有做成自启功能,我们也不能一个命令一个命令去重新启动,这里有一个命令可以一次性全部启动docker,非常实用。
docker start `docker -ps -a -q`