上篇(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在命令中查看。
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 6379:6379 redis
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屬性,之前配置的某些屬性可能有問題,這裡采取優先級最少配置法來排查問題。
docker run -dit --name elasticsearch --hostname elasticsearch-host -v /data:/data -p 9200:9200 -p 9300:9300 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。
docker run -dit --name kibana --hostname kibana-host -v /data:/data -p 5601:5601 -e ELASTICSEARCH_URL=http://192.168.21.128:9200 kibana:latest
kibana的執行命令也是遇到配置文件指定的問題,後來將屬性直接放在命令上了,這也是後續需要解決的問題。
上面四項都成功安裝後,我們的日志就可以成功的采集到elasticsearch中了。
上面的docker在啟動後,並不具備自啟功能,做也是可以做到的。如果沒有做成自啟功能,我們也不能一個命令一個命令去重新啟動,這裡有一個命令可以一次性全部啟動docker,非常實用。
docker start `docker -ps -a -q`