1. 程式人生 > >理解docker部署springboot-容器日誌處理(四)

理解docker部署springboot-容器日誌處理(四)

將jdk和需要的執行的jar構建成映象之後,執行成容器之後,可以實時的輸出日誌,但是當容器掛掉之後,日誌也便消失不見。在容器中可以執行bash命令的前提下,容器執行的時候會根據jar中配置的日誌目錄生成相應的日誌檔案,當容器停止的時候在容器中的所有的東西也會消失不見,查詢原因時就會遇到問題,所以就需要在容器之外將日誌儲存起來,下邊是幾種容器日誌儲存的解決方案。

第一種,docker logs containerId:

這種方式存在的問題是隻能實時輸出層,儲存的路徑在容器內部,容器掛掉之後日誌變會消失不見。這種方式存在的問題是隻能實時輸出層,儲存的路徑在容器內部,容器掛掉之後日誌變會消失不見。

第二種,資料卷的方式:

docker run -d -v /changfeng/logscontainer/syway:/changfeng/logs/syway -p 8081:8080  txxs/springbootdocker:1.0
前邊的是宿主機中日誌的目錄,後邊是容器中日誌檔案的輸出目錄,指定暴露的埠號是8081,執行的映象是txxs/springbootdocker的1.0的版本。這樣就可以在外部docker的宿主機上看到日誌,但是問題是再次啟動映象的時候日誌會怎麼辦呢,這時候並不會重新新建檔案而是直接在原檔案的末尾新增,也就是這兩個容器的日誌檔案合併為同一個。改變的辦法可以很簡單,雖然映象都是一樣的,但是可以動態的生成日誌檔案的名字,這樣在啟動映象的時候因為日誌檔案的名字不同,也就不存在上邊的問題了。具體日誌檔案的名字可以使用時間或者IP+序號的方式進行拼接
第三種,資料卷容器:
docker run -it -v /changfeng/logs/syway --name logs centos
資料卷容器的路徑和日誌的輸出日誌路徑要保持一致,用這種方式指定需要輸出日誌路徑,建立資料卷容器的時候就要指定相應的路徑。
docker run -it --volumes-from logs -p 8082:8080  txxs/springbootdocker:1.0
這種方式有同樣的問題就是新建容器並不會對日誌檔案進行重建,而是直接在第一個日誌檔案的基礎上繼續新增,這樣所有的容器的日誌檔案都會集中在這一個檔案中,對於查詢問題依舊是不方便,另一個問題是,資料卷容器掛了,那麼所有的日誌也將消失。改變的方式類似於上述資料卷的形式,但是,這樣的話就需要改程式碼,其實並不是非常合適。
第四種,訊息佇列
在容器內部的程式中通過訊息佇列的方式傳送出去,然後序列化。再把序列化的檔案或資料進行分析和查詢。個人認為日誌就兩方面的作用,一是查詢問題,二是分析問題,通過訊息佇列的方式顯然是後者。
第五種,Loggly
第六種,ELK(Elasticsearch+Logstash+Kibana)
後兩者方式沒有安裝操作驗證就不寫了,在這裡記錄一下以便以後學習。

資料卷有以下四個方面的特徵:
1、容器移除的時候可以儲存容器的資料
2、在檔案系統和docker容器之間可以共享資料
3、docker容器之間可以共享資料
4、容器具有隔離性,臨時性

補充說明,可以使用以下命令進入內部容器

docker exec -it containerid /bin/bash,但是有時候並不好使,因為你不知道構建映象的基礎是什麼,這時候可以使用docker history --no-trunc=true image> image-dockerfile獲取dockerfile後,檢視內部的映象構建基礎,比如有的是/bash,而有的可能是/bin/sh,還可能就不可以使用命令列,那麼你就需要自己構建相應的映象,或者將兩個現成的映象合併