利用Docker容器化部署springboot應(yīng)用(過程詳解)
前言
在這篇文章中,我將分享如何在Linux環(huán)境下通過Docker部署SpringBoot項(xiàng)目。主要內(nèi)容包括:
- 正確構(gòu)建JAR包及其組成結(jié)構(gòu)
- 使用Dockerfile構(gòu)建鏡像
- 通過Docker容器進(jìn)行項(xiàng)目部署
對docker不熟悉的朋友可以看我這篇docker
構(gòu)建jar包
目前Boot項(xiàng)目通常通過IntelliJ IDEA和Maven進(jìn)行構(gòu)建。在打包時,我們可以在IDEA右側(cè)Maven面板的生命周期中直接執(zhí)行package命令。需要注意的是,Maven默認(rèn)的打包方式會生成一個僅包含項(xiàng)目自身代碼的標(biāo)準(zhǔn)JAR包,該包不包含項(xiàng)目依賴的第三方庫,因此無法直接運(yùn)行。
boot項(xiàng)目,我們一般會構(gòu)建可以直接運(yùn)行、包含所有依賴的jar包,可以直接在pom文件中添加一下配置,指定spring-boot-maven-plugin插件作為jar包構(gòu)建的工具。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.msun.hospitaldictmapping.MsunHospitaldictMappingApplication</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>上述配置有兩個關(guān)鍵配置的作用如下:
| 配置項(xiàng) | 作用說明 |
|---|---|
| <mainClass> | 指定 Spring Boot 應(yīng)用的入口主類,即包含 main方法的類。repackage目標(biāo)會將它寫入 MANIFEST.MF 文件的 Start-Class屬性 |
| <goal>repackage</goal> | 插件的核心目標(biāo)。它會在 Maven 默認(rèn)打包后,將原始的普通 JAR 包重新打包為包含所有依賴的可執(zhí)行jar包 |
配置好spring-boot-maven-plugin這個插件后,我們現(xiàn)在執(zhí)行package指令,Spring Boot Maven 插件會按照以下步驟工作
4.1 Maven 默認(rèn)打包??:首先,Maven 的 maven-jar-plugin會執(zhí)行,生成一個普通的、只包含你項(xiàng)目自身編譯代碼的 JAR 包(通常被命名為 your-app-version.jar.original)。
4.2 Repackage(重新打包):接著,spring-boot-maven-plugin的 repackage目標(biāo)會啟動。它會將這個普通的 JAR 包和所有依賴的第三方庫(來自你的本地 Maven 倉庫)一起,重新打包成一個特殊的 ??Fat JAR??(即可執(zhí)行 JAR),并覆蓋掉最初生成的那個 JAR 文件
可執(zhí)行Fat jar組成結(jié)構(gòu)
一個典型的Spring Boot Fat JAR解壓后,我們會看到類似這樣的結(jié)構(gòu)
myapp-1.0.jar ├─ BOOT-INF/ │ ├─ classes/ # 你的應(yīng)用類文件 (.class) 和資源文件 (如 application.yml) │ └─ lib/ # 所有的第三方依賴 JAR 文件 ├─ META-INF/ │ └─ MANIFEST.MF # 清單文件,這是啟動的關(guān)鍵 └─ org/ └─ springframework/boot/loader/ # Spring Boot 的啟動器類 (如 JarLauncher)
下面表格詳細(xì)展示了這些內(nèi)部結(jié)構(gòu)存放的文件內(nèi)容
| 目錄 | 存放內(nèi)容 |
|---|---|
| BOOT-INF/classes/ | 存放我們項(xiàng)目的編譯類文件和資源文件 |
| BOOT-INF/lib/ | 存放所有依賴的 JAR 文件 |
| org/springframework/boot/loader/ | 存放 Spring Boot 自定義的類加載器(如 JarLauncher) |
| META-INF/MANIFEST.MF | 清單文件,其中關(guān)鍵屬性 Main-Class指向 類加載器org.springframework.boot.loader.JarLauncher,而 Start-Class指向我們的 com.msun…Application啟動類 |
這樣,當(dāng)我們運(yùn)行 java -jar your-app.jar時,JVM 會首先啟動 JarLauncher類加載器,由它負(fù)責(zé)加載 BOOT-INF/lib下的所有依賴和 BOOT-INF/classes下的應(yīng)用代碼,最后通過反射調(diào)用 Start-Class指定的Application啟動類 main方法
構(gòu)建springboot應(yīng)用鏡像
打好項(xiàng)目jar包后,接下來我們構(gòu)建應(yīng)用的docker鏡像
首先,將 Spring Boot JAR 包(例如 myapp.jar)上傳到 Linux 服務(wù)器的某個目錄,比如 /home/project。然后在該目錄下創(chuàng)建 Dockerfile文件。
# 進(jìn)入你存放JAR包的目錄 cd /home/project # 創(chuàng)建Dockerfile touch Dockerfile
編寫 Dockerfile 文件,構(gòu)建boot應(yīng)用鏡像“圖紙”,將your-project-name.jar替換為我們的實(shí)際jar包名稱即可,注意,要將你的jar包放到Dockerfile同級目錄下
# 使用一個輕量級的Java運(yùn)行環(huán)境作為基礎(chǔ)鏡像 FROM openjdk:8-jre-slim # 在鏡像內(nèi)設(shè)置一個工作目錄,影響run/cmd/copy等指令 WORKDIR /app # 將宿主機(jī)的JAR包復(fù)制到鏡像的工作目錄中。注意替換JAR包文件名。由于設(shè)置了工作目錄,實(shí)際復(fù)制到/app/app.jar COPY your-project-name.jar app.jar # 聲明容器運(yùn)行時需要暴露的端口(與你的Spring Boot應(yīng)用端口一致) EXPOSE 8080 # 指定容器啟動時運(yùn)行的命令 ENTRYPOINT ["java", "-jar", "app.jar"]
openjdk:8-jre-slim就是一個??專為運(yùn)行Java程序而優(yōu)化的、輕量且高效的java程序運(yùn)行的基礎(chǔ)鏡像,提供了java程序運(yùn)行所需的最小環(huán)境,包含了一個非常輕量級的Linux發(fā)行版-Debian的“slim”系統(tǒng)、java8運(yùn)行時環(huán)境,即 ??OpenJDK 8的JRE(JVM+核心類庫)
最后,執(zhí)行下面docker命令構(gòu)建我們的boot應(yīng)用鏡像。
docker build -t 鏡像名稱 .
注意后面有個.,意思是從當(dāng)前目錄尋找Dockerfile文件,構(gòu)建鏡像。
執(zhí)行命令后,如果控制臺最后出現(xiàn)success標(biāo)識,說明鏡像分層構(gòu)建成功

此時,我們執(zhí)行docker images就可以看到我們創(chuàng)建的鏡像

docker容器化部署
鏡像構(gòu)建完成后,我們直接通過docker進(jìn)行容器化部署即可,直接使用 docker run命令啟動一個容器來啟動應(yīng)用
docker run -d \ # -d:讓容器在后臺以"分離模式"運(yùn)行 -p 8080:8080 \ # -p 8080:8080:將??宿主機(jī)的8080端口??映射到??容器的8080端口??。如果你的應(yīng)用端口不是8080,請相應(yīng)調(diào)整 --name my-app-container\ # 為容器指定名稱 my-spring-boot-app:1.0 # 我們的應(yīng)用鏡像名稱
這里要注意的是,最后指定的鏡像名稱,我們可以通過docker images 查詢,創(chuàng)建容器時指定鏡像名稱格式為repository:tag,以下面這個截圖為例,鏡像名稱就是drug_test:latest

驗(yàn)證部署
容器啟動后,可以通過以下方式驗(yàn)證應(yīng)用是否成功運(yùn)行:
- 查看容器狀態(tài)??:使用
docker ps命令查看容器是否在運(yùn)行 - ??查看日志??:如果應(yīng)用無法訪問,使用
docker logs -f 容器名命令查看啟動日志,這通常是排查問題最快的方法
到此這篇關(guān)于如何利用docker部署springboot應(yīng)用的文章就介紹到這了,更多相關(guān)docker部署springboot內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Docker到底是什么?Docker為什么它這么火!
- Docker部署SpringBoot項(xiàng)目教程(完整版)
- springboot項(xiàng)目中使用docker進(jìn)行遠(yuǎn)程部署的實(shí)現(xiàn)
- Docker一鍵部署SpringBoot項(xiàng)目的多種方式
- 基于SpringBoot項(xiàng)目實(shí)現(xiàn)Docker容器化部署的主要步驟
- SpringBoot項(xiàng)目Docker部署三種方式
- 如何利用Docker部署一個簡單的springboot項(xiàng)目
- docker部署minio并使用springboot連接的操作方法
- Docker部署SpringBoot的兩種方法
相關(guān)文章
Mac系統(tǒng)上用Docker搭建lamp環(huán)境
這篇文章主要給大家介紹了Mac系統(tǒng)上用Docker如何搭建lamp環(huán)境,文章給大家介紹的很詳細(xì),有需要的朋友們可以參考借鑒,下面來一起看看吧。2016-12-12
dockerfile部署前端vue打包的ist文件實(shí)戰(zhàn)
這篇文章主要為大家介紹了dockerfile部署前端vue打包的ist文件實(shí)戰(zhàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
docker環(huán)境部署domino的詳細(xì)過程
要在Docker容器中運(yùn)行Domino服務(wù)器,你需要創(chuàng)建一個Docker容器,該容器運(yùn)行一個適合Domino服務(wù)器運(yùn)行的操作系統(tǒng)和必要的軟件,本文給大家介紹docker環(huán)境部署domino的詳細(xì)過程,感興趣的朋友跟隨小編一起看看吧2026-04-04
淺析docker-compose部署mysql無法訪問的問題
Compose 是 Docker 容器進(jìn)行編排的工具,定義和運(yùn)行多容器的應(yīng)用,可以一條命令啟動多個容器,使用Docker Compose不再需要使用shell腳本來啟動容器。接下來通過本文給大家分享docker-compose部署mysql無法訪問的問題,需要的朋友參考下吧2018-10-10
低版本Docker升級高版本Docker的詳細(xì)教程及成功避坑
如果我們使用docker來管理容器,那么保持docker引擎的更新將會是十分重要的,下面這篇文章主要給大家介紹了關(guān)于低版本Docker升級高版本Docker的詳細(xì)教程及成功避坑,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05
Docker swarm集群部署過程詳解(包含compose.yml文件詳情)
Docker Swarm是Docker的集群管理工具,支持服務(wù)部署、副本調(diào)度、Stack管理(基于Compose文件),包含初始化集群、節(jié)點(diǎn)添加、服務(wù)更新、資源清理等操作,確保容器化應(yīng)用的高效運(yùn)行,本文給大家介紹Docker swarm集群部署包含compose.yml文件詳情,感興趣的朋友一起看看吧2025-07-07
Docker部署Web在線版的PPT應(yīng)用程序PPTist
PPTist作為一款開源的Web應(yīng)用程序,無需安裝、跨平臺且支持實(shí)時協(xié)作的幻燈片制作,本文介紹了如何使用Docker部署Web在線版的PPTist,包括本地環(huán)境規(guī)劃、檢查、下載PPTist鏡像、部署PPTist應(yīng)用以及訪問PPTist首頁的步驟2025-02-02

