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

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

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

驗(yàn)證部署
容器啟動(dòng)后,可以通過(guò)以下方式驗(yàn)證應(yīng)用是否成功運(yùn)行:
- 查看容器狀態(tài)??:使用
docker ps命令查看容器是否在運(yùn)行 - ??查看日志??:如果應(yīng)用無(wú)法訪問(wèn),使用
docker logs -f 容器名命令查看啟動(dòng)日志,這通常是排查問(wèn)題最快的方法
到此這篇關(guān)于如何利用docker部署springboot應(yīng)用的文章就介紹到這了,更多相關(guān)docker部署springboot內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(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部署一個(gè)簡(jiǎn)單的springboot項(xiàng)目
- docker部署minio并使用springboot連接的操作方法
- Docker部署SpringBoot的兩種方法
相關(guān)文章
Node.js服務(wù)Docker容器化應(yīng)用實(shí)踐小結(jié)
這篇文章主要介紹了Node.js服務(wù)Docker容器化應(yīng)用實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
MacOS使用Docker創(chuàng)建MySQL主從數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了MacOS使用Docker創(chuàng)建MySQL主從數(shù)據(jù)庫(kù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12
使用Docker容器化Flask應(yīng)用的簡(jiǎn)單示例
在當(dāng)今的軟件開(kāi)發(fā)中,容器化技術(shù)已經(jīng)變得不可或缺,Docker 作為容器化領(lǐng)域的佼佼者,為開(kāi)發(fā)者提供了一種高效、便捷的方式來(lái)部署和運(yùn)行應(yīng)用程序,本文將通過(guò)一個(gè)簡(jiǎn)單的 Flask 應(yīng)用示例,展示如何使用 Docker 將 Python 應(yīng)用程序容器化,需要的朋友可以參考下2025-09-09
Docker自定義鏡像上傳至阿里云的實(shí)現(xiàn)
本文主要介紹了Docker自定義鏡像上傳至阿里云的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-04-04

