SpringBoot打包成Docker鏡像的幾種實現(xiàn)方式
1、第一種方式
1.1 編寫一個springboot項目并且打包成jar包
package com.example.demo.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @RequestMapping("/hello") public String hello(){ return "Hello World!!!"; } }
package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
1.2 安裝docker插件
Docker
1.3 項目打包
mvn package
1.4 在target目錄下編寫Dockerfile文件
FROM openjdk:8 COPY *.jar /app.jar CMD ["--server.port=8080"] EXPOSE 8080 ENTRYPOINT ["java","-jar","/app.jar"]
1.5 構(gòu)建鏡像
$ docker build -t demo:v1 .
[root@zsx target]# docker build -t demo:v1 . Sending build context to Docker daemon 17.37MB Step 1/5 : FROM openjdk:8 ---> b273004037cc Step 2/5 : COPY *.jar /app.jar ---> 71538f2a4725 Step 3/5 : CMD ["--server.port=8080"] ---> Running in 9a08516ce3b2 Removing intermediate container 9a08516ce3b2 ---> 58ad7de95482 Step 4/5 : EXPOSE 8080 ---> Running in 47ae06299ac5 Removing intermediate container 47ae06299ac5 ---> 50c705487e20 Step 5/5 : ENTRYPOINT ["java","-jar","/app.jar"] ---> Running in 2252f518b4cb Removing intermediate container 2252f518b4cb ---> 3da5156a3350 Successfully built 3da5156a3350 Successfully tagged demo:v1
$ docker images
1.5 運行
$ docker run -d -P --name spring-boot-demo demo:v1 $ curl http://192.168.136.195:49153/hello
2、第二種方式
2.1 SpringBoot項目
<?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.0.0.RELEASE</version> </parent> <groupId>com.example</groupId> <artifactId>spring-boot-docker</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring-boot-docker</name> <description>spring-boot-docker</description> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> <docker.image.prefix>springboot</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</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <!-- Docker maven plugin start--> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <configuration> <imageName>${docker.image.prefix}/${project.artifactId}</imageName> <dockerDirectory>src/main/docker</dockerDirectory> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin> <!-- Docker maven plugin start--> </plugins> </build> </project>
package com.example.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class DockerController { @RequestMapping("/") public String index() { return "Hello Docker!"; } }
FROM openjdk:8 VOLUME /tmp ADD spring-boot-docker-0.0.1-SNAPSHOT.jar app.jar ENTRYPOINT ["java","-Djava.security.egd=file:/dev/urandom","-jar","/app.jar"]
這個 Dockerfile 文件很簡單,構(gòu)建 Jdk 基礎(chǔ)環(huán)境,添加 Spring Boot Jar 到鏡像中,簡單解釋一下:
FROM
:表示使用 JDK8環(huán)境為基礎(chǔ)鏡像,如果鏡像不是本地的會從DockerHub進行下載。VOLUME
:VOLUME 指向了一個/tmp
的目錄,由于 Spring Boot 使用內(nèi)置的Tomcat容器,Tomcat 默認使用
/tmp
作為工作目錄。這個命令的效果是:在宿主機的/var/lib/docker
目錄下創(chuàng)建一個臨時文件并把它鏈接到容器中的
/tmp
目錄。ADD
:拷貝文件并且重命名。ENTRYPOINT
:為了縮短 Tomcat 的啟動時間,添加java.security.egd
的系統(tǒng)屬性指向/dev/urandom
作為 ENTRYPOINT。
2.2 使用Docker部署Spring Boot項目
將項目 spring-boot-docker
拷貝服務(wù)器中,進入項目路徑下進行打包測試。
# 打包 $ mvn package # 啟動 $ java -jar target/spring-boot-docker-0.0.1-SNAPSHOT.jar
看到 Spring Boot 的啟動日志后表明環(huán)境配置沒有問題,接下來我們使用 DockerFile 構(gòu)建鏡像。
$ mvn package docker:build
第一次構(gòu)建可能有點慢,當看到以下內(nèi)容的時候表明構(gòu)建成功:
[root@zsx spring-boot-docker]# mvn package docker:build [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building spring-boot-docker 0.0.1-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-resources-plugin:3.0.1:resources (default-resources) @ spring-boot-docker --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 1 resource [INFO] Copying 0 resource [INFO] [INFO] --- maven-compiler-plugin:3.7.0:compile (default-compile) @ spring-boot-docker --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] --- maven-resources-plugin:3.0.1:testResources (default-testResources) @ spring-boot-docker --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] skip non existing resourceDirectory /home/temp/spring-boot-docker/src/test/resources [INFO] [INFO] --- maven-compiler-plugin:3.7.0:testCompile (default-testCompile) @ spring-boot-docker --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] --- maven-surefire-plugin:2.20.1:test (default-test) @ spring-boot-docker --- [INFO] [INFO] --- maven-jar-plugin:3.0.2:jar (default-jar) @ spring-boot-docker --- [INFO] Building jar: /home/temp/spring-boot-docker/target/spring-boot-docker-0.0.1-SNAPSHOT.jar [INFO] [INFO] --- spring-boot-maven-plugin:2.0.0.RELEASE:repackage (default) @ spring-boot-docker --- [INFO] [INFO] --- docker-maven-plugin:1.0.0:build (default-cli) @ spring-boot-docker --- [INFO] Using authentication suppliers: [ConfigFileRegistryAuthSupplier] [INFO] Copying /home/temp/spring-boot-docker/target/spring-boot-docker-0.0.1-SNAPSHOT.jar -> /home/temp/spring-boot-docker/target/docker/spring-boot-docker-0.0.1-SNAPSHOT.jar [INFO] Copying src/main/docker/Dockerfile -> /home/temp/spring-boot-docker/target/docker/Dockerfile [INFO] Building image springboot/spring-boot-docker Step 1/4 : FROM openjdk:8 ---> b273004037cc Step 2/4 : VOLUME /tmp ---> Using cache ---> 1ddce8ad30a4 Step 3/4 : ADD spring-boot-docker-0.0.1-SNAPSHOT.jar app.jar ---> 731e8e91b593 Step 4/4 : ENTRYPOINT ["java","-Djava.security.egd=file:/dev/urandom","-jar","/app.jar"] ---> Running in 504bf74d0084 Removing intermediate container 504bf74d0084 ---> b3bb84d4545a ProgressMessage{id=null, status=null, stream=null, error=null, progress=null, progressDetail=null} Successfully built b3bb84d4545a Successfully tagged springboot/spring-boot-docker:latest [INFO] Built springboot/spring-boot-docker [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 12.890 s [INFO] Finished at: 2024-01-23T11:50:16+08:00 [INFO] Final Memory: 30M/97M [INFO] ------------------------------------------------------------------------
使用docker images
命令查看構(gòu)建好的鏡像:
$ [root@zsx spring-boot-docker]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE springboot/spring-boot-docker latest b3bb84d4545a About a minute ago 542MB
springboot/spring-boot-docker
就是我們構(gòu)建好的鏡像,下一步就是運行該鏡像
$ [root@zsx spring-boot-docker]# docker run -d -p 8888:8080 -t springboot/spring-boot-docker af51b2369945a77a8b96098618b22191fb2b8a1616897c97688ed8183a7da759
啟動完成之后我們使用docker ps
查看正在運行的鏡像:
[root@zsx spring-boot-docker]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES af51b2369945 springboot/spring-boot-docker "java -Djava.securit…" 48 seconds ago Up 46 seconds 0.0.0.0:8888->8080/tcp, :::8888->8080/tcp youthful_margulis
可以看到我們構(gòu)建的容器正在在運行,訪問瀏覽器:http://192.168.136.195:8888/
,返回
Hello Docker!
說明使用 Docker 部署 Spring Boot 項目成功!
到此這篇關(guān)于SpringBoot打包成Docker鏡像的幾種實現(xiàn)方式的文章就介紹到這了,更多相關(guān)SpringBoot打包成Docker鏡像內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
RestTemplate發(fā)送請求時Cookie的影響及注意事項說明
這篇文章主要介紹了RestTemplate發(fā)送請求時Cookie的影響及注意事項說明,具有很好的參考價值,希望對大家有所幫助。2023-07-07淺談Spring與SpringMVC父子容器的關(guān)系與初始化
這篇文章主要介紹了淺談Spring與SpringMVC父子容器的關(guān)系與初始化,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08SpringBoot優(yōu)雅地實現(xiàn)全局異常處理的方法詳解
這篇文章主要為大家詳細介紹了SpringBoot如何優(yōu)雅地實現(xiàn)全局異常處理,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2022-08-08Maven分模塊開發(fā)與依賴管理和聚合和繼承及屬性深入詳細介紹
依賴管理是項目管理中非常重要的一環(huán)。幾乎任何項目開發(fā)的時候需要都需要使用到庫。而這些庫很可能又依賴別的庫,這樣整個項目的依賴形成了一個樹狀結(jié)構(gòu),而隨著這個依賴的樹的延伸和擴大,一系列問題就會隨之產(chǎn)生2022-10-10Java從零編寫吃貨聯(lián)盟訂餐系統(tǒng)全程講解
這篇文章主要介紹了Java訂餐系統(tǒng),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-12-12Java下變量大小寫駝峰、大小寫下劃線、大小寫連線轉(zhuǎn)換
有時候需要處理對象屬性的getter、setter方法,或者將屬性與數(shù)據(jù)表字段進行相互轉(zhuǎn)換,感興趣的可以了解一下2021-06-06