Docker 部署jar包


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"]

上面命令的相關解釋:

  1. 從docker倉庫獲取openjdk作為我們項目的容器
  2. VOLUME指向了一個/tmp的目錄,由於Spring Boot使用內置的Tomcat容器,Tomcat默認使用/tmp作為工作目錄。效果就是在主機的/usr/local/apps目錄下創建了一個臨時文件,並連接到容器的/tmp
  3. 項目的docker-demo-0.0.1.jar作為app.jar添加到容器。
  4. ENTRYPOINT 執行項目 app.jar。為了縮短 Tomcat 啟動時間,添加一個系統屬性指向/dev/urandom 作為 Entropy Source
  5. # 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 .

這個命令就是使用Dockerbuild命令來構建鏡像,並給鏡像起了一個名字jerome.xin/docker-demoTAGlatest在當前文件夾下。

我們使用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即可。無需每次都創建新的鏡像,創建新的容器。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM