SpringBoot打包成Docker鏡像

1. 本文環境

Maven:3.6.3(Maven配置參考php

SpringBoot version:2.3.4.RELEASEjava

Docker version: 19.03.11(Docker搭建參考web

JDK version:1.8.0_221(JDK搭建參考spring

dev tools:IDEA(IDEA破解參考docker

環境說明:本地跟docker不在同一環境,docker爲單獨服務器。apache

2. 準備工做

經過 IDEA -> Spring Initializr 快速建立一個 SpringBoot 應用springboot

填寫項目名、選擇 jdk 版本:服務器

以後操做一路「藍色按鈕」默認便可。maven

建立後的項目 pom.xml 文件內容以下:ide

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.3.4.RELEASE</version>
  <relativePath/> <!-- lookup parent from repository -->
 </parent>
 <groupId>com.example</groupId>
 <artifactId>springboot-demo</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <name>springboot-demo</name>
 <description>Demo project for Spring Boot</description>

 <properties>
  <java.version>1.8</java.version>
 </properties>

 <dependencies>
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-test</artifactId>
   <scope>test</scope>
   <exclusions>
    <exclusion>
     <groupId>org.junit.vintage</groupId>
     <artifactId>junit-vintage-engine</artifactId>
    </exclusion>
   </exclusions>
  </dependency>
 </dependencies>
 <build>
  <plugins>
   <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
   </plugin>
  </plugins>
 </build>
</project>

3. Maven dockerfile 插件

將 SpringBoot 項目打包成 Docker 鏡像,其主要經過 Maven plugin 插件來進行構建。

在以前都是經過 docker-maven-plugin 插件進行打包,而如今已經升級出現了新的插件:

dockerfile-maven-plugin

接下來咱們就是經過這個 plugin 插件進行操做。

<plugin>
  <groupId>com.spotify</groupId>
  <artifactId>dockerfile-maven-plugin</artifactId>
  <version>1.4.13</version>
  <executions>
    <execution>
      <id>default</id>
      <goals>
        <goal>build</goal>
        <goal>push</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <repository>${docker.image.prefix}/${project.artifactId}</repository>
    <tag>${project.version}</tag>
    <buildArgs>
      <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
    </buildArgs>
  </configuration>
</plugin>

參數說明:

  • repository:指定Docker鏡像的repo名字,要展現在docker images 中的。

  • tag:指定Docker鏡像的tag,不指定tag默認爲latest

  • buildArgs:指定一個或多個變量,傳遞給Dockerfile,在Dockerfile中經過ARG指令進行引用。JAR_FILE 指定 jar 文件名。

另外,能夠在execution中同時指定build和push目標。當運行mvn package時,會自動執行build目標,構建Docker鏡像。

DockerFile

DockerFile 文件須要放置在項目 pom.xm l同級目錄下,內容大體以下:

FROM java:8
EXPOSE 8080
ARG JAR_FILE
ADD target/${JAR_FILE} /niceyoo.jar
ENTRYPOINT ["java", "-jar","/niceyoo.jar"]

參數說明:

  • FROM:基於java:8鏡像構建
  • EXPOSE:監聽8080端口
  • ARG:引用plugin中配置的 JAR_FILE 文件
  • ADD:將當前 target 目錄下的 jar 放置在根目錄下,命名爲 niceyoo.jar,推薦使用絕對路徑。
  • ENTRYPOINT:執行命令 java -jar /niceyoo.jar

當前完整的 pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.3.4.RELEASE</version>
      <relativePath/> <!-- lookup parent from repository -->
   </parent>
   <groupId>com.example</groupId>
   <artifactId>springboot-demo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <name>springboot-demo</name>
   <description>Demo project for Spring Boot</description>
   
   <properties>
      <java.version>1.8</java.version>
      <docker.image.prefix>10.211.55.4:5000</docker.image.prefix>
   </properties>

   <dependencies>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
      </dependency>

      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
         <exclusions>
            <exclusion>
               <groupId>org.junit.vintage</groupId>
               <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
         </exclusions>
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>

         <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>dockerfile-maven-plugin</artifactId>
            <version>1.4.13</version>
            <executions>
               <execution>
                  <id>default</id>
                  <goals>
                     <goal>build</goal>
                     <goal>push</goal>
                  </goals>
               </execution>
            </executions>
            <configuration>
               <repository>${docker.image.prefix}/${project.artifactId}</repository>
               <tag>${project.version}</tag>
               <buildArgs>
                  <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
               </buildArgs>
            </configuration>
         </plugin>
         
      </plugins>

   </build>

</project>

項目截圖:

4. 使用誤區

docker-maven-plugin 和 dockerfile-maven-plugin 使用誤區。

咱們以前在使用 docker-maven-plugin 插件時,能夠直接在本地就能夠完成打包並推送鏡像至遠程倉庫,即 SpringBoot項目構建 docker 鏡像並推送到遠程倉庫:

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>1.0.0</version>
    <configuration>
        <!--鏡像名稱-->
        <imageName>10.211.55.4:5000/${project.artifactId}</imageName>
        <!--指定dockerfile路徑-->
        <!--<dockerDirectory>${project.basedir}/src/main/resources</dockerDirectory>-->
        <!--指定標籤-->
        <imageTags>
            <imageTag>latest</imageTag>
        </imageTags>
        <!--遠程倉庫地址-->
        <registryUrl>10.211.55.4:5000</registryUrl>
        <pushImage>true</pushImage>
        <!--基礎鏡像jdk1.8-->
        <baseImage>java</baseImage>
        <!--製做者提供本人信息-->
        <maintainer>niceyoo apkdream@163.com</maintainer>
        <!--切換到ROOT目錄-->
        <workdir>/ROOT</workdir>
        <cmd>["java","-version"]</cmd>
        <entryPoint>["java","-jar","${project.build.finalName}.jar"]</entryPoint>
        <!--指定遠程docker地址-->
        <dockerHost>http://10.211.55.4:2375</dockerHost>
        <!--這裏是複製jar包到docker容器指定目錄配置-->
        <resources>
            <resource>
                <targetPath>/ROOT</targetPath>
                <!--指定須要複製的根目錄,${project.build.directory}表示target目錄-->
                <directory>${project.build.directory}</directory>
                <!--用於指定須要複製的文件,${project.build.finalName}.jar表示打包後的jar包文件-->
                <include>${project.build.finalName}.jar</include>
            </resource>
        </resources>
    </configuration>
</plugin>

使用如上配置時,當執行 mvn package docker:build,便可完成打包至 docker 鏡像中。

可是,Dockerfile 就不同了,從咱們開始編寫 Dockerfile 文件 FROM 命令開始,咱們就發現,這個必須依賴於Docker,但問題就是,假設我本地跟 Docker 並不在一臺機器上,那麼我是無法執行 dockerfile 的,若是在本地不安裝 docker 環境下,是無法執行打包操做的,那麼就能夠將代碼拉取到 Docker 所在服務器,執行打包操做。

5. 項目打包

項目代碼結構:

執行 mvn clean package dockerfile:build -Dmaven.test.skip=true

執行 docker images 查看

至此,springboot 的鏡像就製做完成了。

6. 建立鏡像容器

上邊的步驟鏡像建立後,咱們就能夠直接來建立 springboot 容器來運行了。

docker run -d -p 8080:8080 10.211.55.4:5000/springboot-demo:0.0.1-SNAPSHOT
  • -d:表示在後臺運行

  • -p:指定端口號,第一個8080爲容器內部的端口號,第二個8080爲外界訪問的端口號,將容器內的8080端口號映射到外部的8080端口號

  • 10.211.55.4:5000/springboot-demo:0.0.1-SNAPSHOT:鏡像名+版本號。

若是以爲鏡像名稱過長的話,能夠重命名:

docker tag 鏡像IMAGEID 新的名稱:版本號

以 10.211.55.4:5000/springboot-demo 爲例:

docker tag 1815d40a66ae demo:latest

若是版本號不加的話,默認爲 latest

`

相關文章
相關標籤/搜索