Docker
這門技術也是開發中我們值得掌握的一門技術。接下我們就來探究一下, 怎么使用Docker
容器化的技術來構建並運行,Spring Boot
項目的可執行Jar
包。
演示環境
- CentOS 7
- Docker 1.13.1
- Spring Boot 2.1.1.RELEASE
准備一個Spring Boot
項目
構建一個 Spring Boot
項目的方式有很多,也不是我們討論的重點,這里就不多做描述了。我們在項目中准備一個簡單的HelloController
,其中有一個sayHello()
方法映射到我們訪問項目的跟路徑,訪問時返回:Hello Jerome, This is docker image !
。
package xin.jerome.demo.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @GetMapping("") public String sayHello() { return "Hello Jerome, This is docker image !"; } }
對項目打包,生成可執行jar
我們到項目的根目錄,運行mvn clean package
對項目進行打包,運行之后會在target
目錄下生成一個xxx.jar
的可執行jar
文件。
制作Docker
鏡像
首先我們將准備的xxx.jar
拷貝到我們的CentOS 7
機器上,拷貝的方法就不做描述了,大家各顯神通吧。這里我是將我生成docker-demo-0.0.1.jar
拷貝到了/usr/local/apps
文件夾下/
編寫Dockerfile
在該目錄下創建Dockerfile 文件,使用vi Dockerfile
對文件進行編輯。
FROM java:8 VOLUME /tmp ADD docker-demo-0.0.1.jar app.jar ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
上面命令的相關解釋:
- 從docker倉庫獲取
openjdk
作為我們項目的容器 VOLUME
指向了一個/tmp
的目錄,由於Spring Boot使用內置的Tomcat容器,Tomcat默認使用/tmp
作為工作目錄。效果就是在主機的/usr/local/apps目錄下創建了一個臨時文件,並連接到容器的/tmp
。- 項目的
docker-demo-0.0.1.jar
作為app.jar
添加到容器。 ENTRYPOINT
執行項目app.jar
。為了縮短 Tomcat 啟動時間,添加一個系統屬性指向/dev/urandom
作為 Entropy Source-
# from java:8 拉取一個jdk為1.8的docker image
# maintainer 作者是bingo
# demo-0.0.1-SNAPSHOT.jar 就是你上傳的jar包,替換為jar包的名稱
# demo.jar 是你將該jar包重新命名為什么名稱,在容器中運行
# expose 該容器暴露的端口是多少,就是jar在容器中以多少端口運行
# entrypoint 容器啟動之后執行的命令,java -jar demo.jar 即啟動jar
構建Docker鏡像
我們在/usr/local/apps目錄下,執行Docker
的命令來構建鏡像。
docker build -t jerome.xin/docker-demo:latest .
這個命令就是使用Docker
的build
命令來構建鏡像,並給鏡像起了一個名字jerome.xin/docker-demo
其TAG
為latest
在當前文件夾下。
我們使用docker images
來查看所有的鏡像。
[root@localhost testdocker]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE jerome.xin/docker-demo latest ab3426243fac 56 minutes ago 119 MB docker.io/openjdk 8-jdk-alpine 97bc1352afde 5 weeks ago 103 MB
我們發現鏡像列表里面有我們生成的鏡像jerome.xin/docker-demo
。
運行鏡像
通過上面的步驟我們就已經完成了鏡像的創建,接下來我們只需要使用
docker run -d --restart=always --name jerome.xin/docker-demo -v /usr/local/apps/docker-demo/logs:/home/docker-demo/logs -p 7500:7500 jerome.xin/docker-demo
命令來運行我們的項目。
這個表示docker容器在停止或服務器開機之后會自動重新啟動 --restart=always
-v /usr/local/apps/docker-demo/logs:/home/docker-demo/logs:將鏡像內/home/docker-demo/logs目錄的日志掛載到宿主機/usr/local/apps/docker-demo/logs目錄下
-p 7500:7500:端口映射,默認啟動的是7500
docker logs --tail 300 -f demo 查看啟動日志
拓展一:編寫一個通用的運行jar包的鏡像(這里只給思路,不給具體示例)
> Dockerfile如:
FROM justrydeng/jdk8 MAINTAINER dengshuai<13548417409@163.com> RUN mkdir /jarAppDir/ CMD ["nohup","java","-jar","/jarAppDir/app.jar","&"]
> 生成鏡像 docker build -t justrydeng/common-run-jar . -f jarDockerfile
注: -f 可以指定Dockerfile文件的文件名。
> 在后面使用時,我們可以使用同一個鏡像來制作對應不同端口(不同服務)的容器
docker run -p 宿主機端口:要映射的容器端口 --name 容器名 -d justrydeng/common-run-jar
> 在更新jar包時,需要在把xxx.jar包復制進容器時,統一重命名為app.jar
docker cp 宿主機jar包 容器名(或容器ID):/jarAppDir/app.jar
說明:此方式的優勢在於:每次如果要更新jar包,只需要先將容器stop,然后直接替換容器里面的jar包,最后再將該容
器start即可。無需每次都創建新的鏡像,創建新的容器。