不難,記錄備忘:
一、有centos7的機器
可用Virtualbox安裝centos虛擬機:https://www.centos.org/download/
二、機器上安裝有docker
參考文章:https://www.cnblogs.com/yufeng218/p/8370670.html
三、在自己機器上把spring boot項目打包成一個可執行jar包
我本地用的maven構建,官方支持的一套東西,運行mvn package直接就打包好了,打包步驟略過
四、建Dockerfile
# 指定一個基礎鏡像centos FROM docker.io/centos:latest WORKDIR /app #安裝應用執行的環境java RUN yum -y install java #將目錄下的文件復制到容器中 COPY . /app #執行jar文件 ENTRYPOINT ["java" ,"-jar","xxx.jar"]
五、准備好的文件有這些:
- Dockerfile
- application.properties
- logback-spring.xml
- xxx.jar
統一弄到前面准備好的centos上去,可以直接在根目錄下建一個app文件夾,把東西放進去
六、構建自己的鏡像,xxx是為項目的docker鏡像命名,"."表示當前目錄(應該是表示Dockerfile在當前目錄下?本人還沒弄清):
docker build -t xxx .
七、鏡像做好后,可以查看一下:
docker images
八、運行鏡像,-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到這里面就可以看到對應的內容了。
2、運行如下命令:
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)