不難,記錄備忘: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
統一弄到前面準備好的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的配置文件,在裏面能夠記錄
docker exec -it <容器ID> bash
bash是固定寫法,聽說也能夠是/bin/bash和/bin/sh,本人沒試了。進去後,就能夠看到生成了一個日誌文件夾了。
日誌持久化
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)