centos7上部署spring boot並保存日誌

不難,記錄備忘:html

1、有centos7的機器java

  可用Virtualbox安裝centos虛擬機:https://www.centos.org/download/spring

2、機器上安裝有dockerdocker

  參考文章:http://www.javashuo.com/article/p-aptrhsrk-dp.htmlcentos

3、在本身機器上把spring boot項目打包成一個可執行jar包bash

  我本地用的maven構建,官方支持的一套東西,運行mvn package直接就打包好了,打包步驟略過服務器

4、建Dockerfile  app

# 指定一個基礎鏡像centos FROM docker.io/centos:latest WORKDIR /app #安裝應用執行的環境java RUN yum -y install java #將目錄下的文件複製到容器中 COPY . /app #執行jar文件 ENTRYPOINT ["java" ,"-jar","xxx.jar"]

5、準備好的文件有這些:maven

  • Dockerfile
  • application.properties
  • logback-spring.xml
  • xxx.jar

統一弄到前面準備好的centos上去,能夠直接在根目錄下建一個app文件夾,把東西放進去ui

6、構建本身的鏡像,xxx是爲項目的docker鏡像命名,"."表示當前目錄(應該是表示Dockerfile在當前目錄下?本人還沒弄清):

docker build -t xxx .

7、鏡像作好後,能夠查看一下:

docker images

8、運行鏡像,-d表示後臺運行,-p表示端口映射(以下是表示外部訪問 centos機器IP:80,便可訪問到spring boot在docker裏運行所監聽的8080端口),xxx即第六步定義的docker鏡像名:

docker run -d -p 80:8080 xxx

 

存在的一些問題:

spring boot項目,通常都用logback記錄日誌。並且開發的時候通常會有一個 logback-spring.xml 文件在 resources 下,表示要記錄什麼日誌,以及記錄在硬盤哪一個位置。可是開發時候日誌的路徑,確定和centos服務器上的docker裏的路徑不同啊,因此確定不能用開發時的 logback-spring.xml 。不過剛剛mvn打包時,把logback-spring.xml 也打包進去了,若是在服務器上不給個專門的logback-spring.xml ,那就用的開發時的了。因此要指定。

在.jar文件所在的位置,能夠放置application.properties ,裏面就包括 logging.config=./logback-spring.xml ,這樣就使用.jar的同級目錄下的logback-spring.xml做爲logback的配置文件,在裏面能夠記錄

<property name="LOG_PATH" value="./prologs" />
即會在當前目錄下記錄日誌了。 這一段羅裏吧嗦的其實和docker沒啥關係,主要spring boot在生產環境上自定義日誌配置文件位置的問題。
 
好了,如今執行如下命令能夠 進入到運行中的docker 容器裏去:
docker exec -it <容器ID> bash

bash是固定寫法,聽說也能夠是/bin/bash和/bin/sh,本人沒試了。進去後,就能夠看到生成了一個日誌文件夾了。

 

日誌持久化

還有個問題,這些日誌記錄了也只存在於容器裏,容器沒了的時候日誌也就沒了。能夠解決,我瞭解兩種方式,也就是docker官方推薦的兩種數據管理方式:
一、運行的時候使用以下命令:
docker run -d -p 80:8080 -v logVolume:/app/prologs xxx

-v表示使用volume,docker官方指定的三種數據管理方式之一,也是推薦的方式。

這條命令是告訴docker,在這個容器運行時,將會建立一個路徑,叫/app/prologs,並且這個路徑,在docker外面,實體的centos上也能夠訪問,而且不會隨着容器中止和刪除並且消失。這樣一來,docker裏面程序操做過的文件,好比寫過的日誌,就保留下來了。不過官方文檔卻是沒有提到過這種 use case。

這個在docker裏面看是 /app/prologs 路徑,而在外面也能夠訪問的東西就叫作volume,這條命令新建了一個名叫 logVolume 的 volume,也能夠用這條命令查看一共有哪些volume:

docker volume ls

那在docker外面查看這些個東西呢?

先運行:

docker inspect <容器ID>

找到 Mounts 節點,下面有個Source,即爲能夠在docker外部訪問的目錄,如:/var/lib/docker/volumes/logVolume/_data,cd到這裏面就能夠看到對應的內容了。

 

二、運行以下命令:

docker run -d -p 800:8080 -v "$(pwd)"/prologs:/app/prologs xxx

和上一條命令有點相似,惟一不一樣的,就是-v後面到冒號前面這一段文本,這裏的這段文本表示的是當前目錄下的 prologs 路徑,這種狀況,日誌文件就會出如今當前目錄下的 prologs 路徑裏了。

雖然使用方式相似,可是概念上不同,官方稱第一種方式爲 Volumes ,第二種方式稱爲 Bind mounts

至此,問題基本解決。

 

腳本:

# 關閉全部正在運行容器 docker ps | awk  '{print $1}' | xargs docker stop # 刪除全部容器應用 docker ps -a | awk  '{print $1}' | xargs docker rm # 或者 docker rm $(docker ps -a -q)
相關文章
相關標籤/搜索