SpringBoot打包成Docker鏡像的幾種實(shí)現(xiàn)方式
1、第一種方式
1.1 編寫一個(gè)springboot項(xiàng)目并且打包成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 項(xiàng)目打包
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 運(yùn)行
$ docker run -d -P --name spring-boot-demo demo:v1 $ curl http://192.168.136.195:49153/hello

2、第二種方式
2.1 SpringBoot項(xiàng)目

<?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"]
這個(gè) Dockerfile 文件很簡(jiǎn)單,構(gòu)建 Jdk 基礎(chǔ)環(huán)境,添加 Spring Boot Jar 到鏡像中,簡(jiǎn)單解釋一下:
FROM:表示使用 JDK8環(huán)境為基礎(chǔ)鏡像,如果鏡像不是本地的會(huì)從DockerHub進(jìn)行下載。VOLUME:VOLUME 指向了一個(gè)/tmp的目錄,由于 Spring Boot 使用內(nèi)置的Tomcat容器,Tomcat 默認(rèn)使用
/tmp作為工作目錄。這個(gè)命令的效果是:在宿主機(jī)的/var/lib/docker目錄下創(chuàng)建一個(gè)臨時(shí)文件并把它鏈接到容器中的
/tmp目錄。ADD:拷貝文件并且重命名。ENTRYPOINT:為了縮短 Tomcat 的啟動(dòng)時(shí)間,添加java.security.egd的系統(tǒng)屬性指向/dev/urandom作為 ENTRYPOINT。
2.2 使用Docker部署Spring Boot項(xiàng)目
將項(xiàng)目 spring-boot-docker 拷貝服務(wù)器中,進(jìn)入項(xiàng)目路徑下進(jìn)行打包測(cè)試。
# 打包 $ mvn package # 啟動(dòng) $ java -jar target/spring-boot-docker-0.0.1-SNAPSHOT.jar
看到 Spring Boot 的啟動(dòng)日志后表明環(huán)境配置沒(méi)有問(wèn)題,接下來(lái)我們使用 DockerFile 構(gòu)建鏡像。
$ mvn package docker:build
第一次構(gòu)建可能有點(diǎn)慢,當(dāng)看到以下內(nèi)容的時(shí)候表明構(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)建好的鏡像,下一步就是運(yùn)行該鏡像
$ [root@zsx spring-boot-docker]# docker run -d -p 8888:8080 -t springboot/spring-boot-docker af51b2369945a77a8b96098618b22191fb2b8a1616897c97688ed8183a7da759
啟動(dòng)完成之后我們使用docker ps查看正在運(yùn)行的鏡像:
[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)建的容器正在在運(yùn)行,訪問(wèn)瀏覽器:http://192.168.136.195:8888/,返回
Hello Docker!
說(shuō)明使用 Docker 部署 Spring Boot 項(xiàng)目成功!
到此這篇關(guān)于SpringBoot打包成Docker鏡像的幾種實(shí)現(xiàn)方式的文章就介紹到這了,更多相關(guān)SpringBoot打包成Docker鏡像內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot服務(wù)docker打包分層的實(shí)現(xiàn)
- 將Java(SpringBoot)項(xiàng)目打包為Docker鏡像的三種方法
- 淺析如何將多個(gè)SpringBoot項(xiàng)目打包到一個(gè)Docker容器中
- Docker打包SpringBoot鏡像的實(shí)現(xiàn)方式
- SpringBoot打包成Docker鏡像的項(xiàng)目實(shí)踐
- SpringBoot多模塊打包部署Docker的項(xiàng)目實(shí)戰(zhàn)
- 一步步教你把SpringBoot項(xiàng)目打包成Docker鏡像
- SpringBoot打包docker鏡像發(fā)布的詳細(xì)步驟
- Springboot打包為Docker鏡像并部署的實(shí)現(xiàn)
- SpringBoot3.x打包Docker容器的實(shí)現(xiàn)
- Springboot微服務(wù)打包Docker鏡像流程解析
- Springboot打包docker的多種方法實(shí)現(xiàn)
相關(guān)文章
解決springSecurity 使用默認(rèn)登陸界面登錄后無(wú)法跳轉(zhuǎn)問(wèn)題
這篇文章主要介紹了解決springSecurity 使用默認(rèn)登陸界面登錄后無(wú)法跳轉(zhuǎn)問(wèn)題,項(xiàng)目環(huán)境springboot下使用springSecurity 版本2.7.8,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-12-12
springboot臨時(shí)文件存儲(chǔ)目錄配置方式
這篇文章主要介紹了springboot臨時(shí)文件存儲(chǔ)目錄配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Java調(diào)用SSE流式接口并流式返回給前端實(shí)現(xiàn)打字輸出效果
在Web開發(fā)中,有時(shí)我們需要將文件以流的形式返回給前端,下面這篇文章主要給大家介紹了關(guān)于Java調(diào)用SSE流式接口并流式返回給前端實(shí)現(xiàn)打字輸出效果的相關(guān)資料,需要的朋友可以參考下2024-08-08
Java如何替換RequestBody和RequestParam參數(shù)的屬性
近期由于接手的老項(xiàng)目中存在所有接口中新增一個(gè)加密串來(lái)給接口做一個(gè)加密效果,所以就研究了一下Http請(qǐng)求鏈路,發(fā)現(xiàn)可以通過(guò)?javax.servlet.Filter去實(shí)現(xiàn),這篇文章主要介紹了Java替換RequestBody和RequestParam參數(shù)的屬性,需要的朋友可以參考下2023-10-10
SpringBoot3+Kafka實(shí)戰(zhàn)指南
本文主要介紹了SpringBoot3+Kafka實(shí)戰(zhàn)指南,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-09-09
SpringBoot 使用jwt進(jìn)行身份驗(yàn)證的方法示例
這篇文章主要介紹了SpringBoot 使用jwt進(jìn)行身份驗(yàn)證的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
java調(diào)用process線程阻塞問(wèn)題的解決
這篇文章主要介紹了java調(diào)用process線程阻塞問(wèn)題的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
快速搭建Spring Boot+MyBatis的項(xiàng)目IDEA(附源碼下載)
這篇文章主要介紹了快速搭建Spring Boot+MyBatis的項(xiàng)目IDEA(附源碼下載),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12

