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
經過 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>
將 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"]
參數說明:
當前完整的 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>
項目截圖:
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 所在服務器,執行打包操做。
項目代碼結構:
執行 mvn clean package dockerfile:build -Dmaven.test.skip=true
執行 docker images 查看
至此,springboot 的鏡像就製做完成了。
上邊的步驟鏡像建立後,咱們就能夠直接來建立 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
`