SpringBoot+Docker+K8s云原生部署全流程(從零到發(fā)布)
從零到發(fā)布:SpringBoot + Docker + K8s 云原生部署全流程
一、前言
在當(dāng)今的軟件開發(fā)領(lǐng)域,云原生技術(shù)已經(jīng)成為主流趨勢(shì)。Spring Boot 以其快速開發(fā)和便捷配置的特性,成為 Java 開發(fā)者構(gòu)建 Web 應(yīng)用的首選框架;Docker 為應(yīng)用提供了輕量級(jí)的容器化解決方案,實(shí)現(xiàn)了應(yīng)用的隔離和可移植性;Kubernetes(K8s)則是容器編排的事實(shí)標(biāo)準(zhǔn),能夠高效地管理和調(diào)度容器化應(yīng)用。本文將詳細(xì)介紹如何將一個(gè) Spring Boot 應(yīng)用從開發(fā)到通過(guò) Docker 打包,最終使用 K8s 進(jìn)行云原生部署的全流程。
二、環(huán)境準(zhǔn)備
2.1 開發(fā)環(huán)境搭建
- Java 開發(fā)環(huán)境
- 確保系統(tǒng)安裝了 JDK 8 或更高版本??梢詮?Oracle 官網(wǎng)或 OpenJDK 官網(wǎng)下載對(duì)應(yīng)系統(tǒng)的安裝包進(jìn)行安裝。安裝完成后,配置
JAVA_HOME、PATH等環(huán)境變量。例如,在 Linux 系統(tǒng)中,可以編輯/etc/profile文件添加如下內(nèi)容:
- 確保系統(tǒng)安裝了 JDK 8 或更高版本??梢詮?Oracle 官網(wǎng)或 OpenJDK 官網(wǎng)下載對(duì)應(yīng)系統(tǒng)的安裝包進(jìn)行安裝。安裝完成后,配置
export JAVA_HOME=/path/to/your/jdk export PATH=$JAVA_HOME/bin:$PATH
- 驗(yàn)證 Java 安裝是否成功,在終端執(zhí)行 `java -version` 命令,若輸出 Java 版本信息,則說(shuō)明安裝成功。
- Maven 或 Gradle 構(gòu)建工具
- Maven:從 Maven 官網(wǎng)下載二進(jìn)制包,解壓到指定目錄。配置
MAVEN_HOME和PATH環(huán)境變量,同樣在/etc/profile文件中添加:
- Maven:從 Maven 官網(wǎng)下載二進(jìn)制包,解壓到指定目錄。配置
export MAVEN_HOME=/path/to/your/maven export PATH=$MAVEN_HOME/bin:$PATH
- 驗(yàn)證 Maven 安裝,執(zhí)行 `mvn -v` 命令,若輸出 Maven 版本信息則安裝成功。 - **Gradle**:也可以選擇 Gradle 作為構(gòu)建工具,從 Gradle 官網(wǎng)下載安裝包,按照官方文檔進(jìn)行安裝和配置。
2.2 Docker 環(huán)境安裝
- Linux 系統(tǒng)
- 對(duì)于 Ubuntu 系統(tǒng),可以使用以下命令安裝 Docker:
sudo apt-get update sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu$(lsb_release -cs) stable" sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io
- 安裝完成后,使用 `sudo docker run hello-world` 命令驗(yàn)證 Docker 是否安裝成功。
- Windows 系統(tǒng)
- 從 Docker 官網(wǎng)下載 Docker Desktop for Windows 安裝包,運(yùn)行安裝程序,按照提示完成安裝。安裝完成后,啟動(dòng) Docker Desktop,在命令提示符或 PowerShell 中執(zhí)行
docker run hello-world進(jìn)行驗(yàn)證。
- 從 Docker 官網(wǎng)下載 Docker Desktop for Windows 安裝包,運(yùn)行安裝程序,按照提示完成安裝。安裝完成后,啟動(dòng) Docker Desktop,在命令提示符或 PowerShell 中執(zhí)行
2.3 Kubernetes 環(huán)境搭建
- 本地開發(fā)環(huán)境 - Minikube
- Minikube 是一個(gè)在本地快速搭建單節(jié)點(diǎn) K8s 集群的工具。從 Minikube 官網(wǎng)下載對(duì)應(yīng)系統(tǒng)的二進(jìn)制文件,添加到系統(tǒng)
PATH中。 - 啟動(dòng) Minikube,執(zhí)行以下命令:
- Minikube 是一個(gè)在本地快速搭建單節(jié)點(diǎn) K8s 集群的工具。從 Minikube 官網(wǎng)下載對(duì)應(yīng)系統(tǒng)的二進(jìn)制文件,添加到系統(tǒng)
minikube start
- 配置 `kubectl` 與 Minikube 集群交互:
kubectl config use-context minikube
- 云環(huán)境 - 以阿里云 ACK 為例
- 登錄阿里云控制臺(tái),進(jìn)入容器服務(wù) ACK 頁(yè)面,創(chuàng)建一個(gè) K8s 集群。按照向?qū)瓿杉旱呐渲?,包括?jié)點(diǎn)數(shù)量、節(jié)點(diǎn)規(guī)格等。
- 下載并配置
kubectl,通過(guò)阿里云提供的憑證信息連接到創(chuàng)建的集群。
三、Spring Boot 項(xiàng)目開發(fā)
3.1 創(chuàng)建 Spring Boot 項(xiàng)目
- 使用 Spring Initializr
- 訪問(wèn) Spring Initializr 網(wǎng)站(https://start.spring.io/),選擇項(xiàng)目的元數(shù)據(jù),如項(xiàng)目類型(Maven Project 或 Gradle Project)、Java 版本、Spring Boot 版本等。
- 添加所需的依賴,例如
Spring Web用于構(gòu)建 Web 應(yīng)用。點(diǎn)擊Generate按鈕下載項(xiàng)目壓縮包,解壓到本地開發(fā)環(huán)境。
- 使用 IDE 創(chuàng)建項(xiàng)目
- 在 IntelliJ IDEA 中,選擇
File->New->Project,在左側(cè)選擇Spring Initializr,按照向?qū)瓿身?xiàng)目創(chuàng)建。
- 在 IntelliJ IDEA 中,選擇
3.2 編寫簡(jiǎn)單的 RESTful API
- 創(chuàng)建 Controller 類
- 在
src/main/java目錄下創(chuàng)建一個(gè) Controller 類,示例代碼如下:
- 在
package com.example.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello, Spring Boot!";
}
}- 運(yùn)行項(xiàng)目進(jìn)行測(cè)試
- 在 IDE 中運(yùn)行 Spring Boot 應(yīng)用的主類(通常是帶有
@SpringBootApplication注解的類)。 - 打開瀏覽器或使用工具(如 Postman)訪問(wèn)
http://localhost:8080/hello,若看到返回Hello, Spring Boot!,則說(shuō)明 API 編寫成功。
- 在 IDE 中運(yùn)行 Spring Boot 應(yīng)用的主類(通常是帶有
3.3 項(xiàng)目打包
- Maven 打包
- 在項(xiàng)目根目錄下執(zhí)行以下命令進(jìn)行打包:
mvn clean package
- 打包完成后,在 `target` 目錄下會(huì)生成一個(gè) `.jar` 文件。
- Gradle 打包
- 若使用 Gradle,執(zhí)行以下命令:
gradle build
- 生成的 `.jar` 文件位于 `build/libs` 目錄下。
四、Docker 鏡像構(gòu)建與管理
4.1 編寫 Dockerfile
在項(xiàng)目根目錄下創(chuàng)建一個(gè)名為 Dockerfile 的文件,內(nèi)容如下:
# 基礎(chǔ)鏡像 FROM openjdk:11-jre-slim # 設(shè)置工作目錄 WORKDIR /app # 將打包好的 Spring Boot 應(yīng)用復(fù)制到容器中 COPY target/demo-0.0.1-SNAPSHOT.jar app.jar # 暴露應(yīng)用端口 EXPOSE 8080 # 啟動(dòng)應(yīng)用 CMD ["java", "-jar", "app.jar"]
4.2 構(gòu)建 Docker 鏡像
在項(xiàng)目根目錄下,執(zhí)行以下命令構(gòu)建 Docker 鏡像:
docker build -t springboot-demo:1.0 .
其中,springboot-demo:1.0 是鏡像的名稱和版本號(hào),. 表示使用當(dāng)前目錄下的 Dockerfile 進(jìn)行構(gòu)建。
4.3 運(yùn)行 Docker 容器進(jìn)行測(cè)試
構(gòu)建完成后,使用以下命令運(yùn)行 Docker 容器:
docker run -p 8080:8080 springboot-demo:1.0
-p 8080:8080 表示將容器的 8080 端口映射到宿主機(jī)的 8080 端口。訪問(wèn) http://localhost:8080/hello,若能看到之前編寫的 API 返回結(jié)果,則說(shuō)明容器運(yùn)行正常。
4.4 推送 Docker 鏡像到鏡像倉(cāng)庫(kù)
- 注冊(cè)鏡像倉(cāng)庫(kù)賬號(hào)
- 可以選擇公共的鏡像倉(cāng)庫(kù),如 Docker Hub,也可以使用云服務(wù)商提供的私有鏡像倉(cāng)庫(kù),如阿里云容器鏡像服務(wù)。注冊(cè)并登錄相應(yīng)的鏡像倉(cāng)庫(kù)。
- 登錄鏡像倉(cāng)庫(kù)
- 以 Docker Hub 為例,在終端執(zhí)行以下命令登錄:
docker login
輸入用戶名和密碼完成登錄。
3. 標(biāo)記鏡像
- 為了將鏡像推送到指定的鏡像倉(cāng)庫(kù),需要給鏡像添加合適的標(biāo)簽:
docker tag springboot-demo:1.0 your-dockerhub-username/springboot-demo:1.0
- 推送鏡像
- 執(zhí)行以下命令將鏡像推送到 Docker Hub:
docker push your-dockerhub-username/springboot-demo:1.0
五、Kubernetes 部署應(yīng)用
5.1 創(chuàng)建 Deployment
在項(xiàng)目根目錄下創(chuàng)建一個(gè)名為 deployment.yaml 的文件,內(nèi)容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: springboot-demo-deployment
spec:
replicas: 3
selector:
matchLabels:
app: springboot-demo
template:
metadata:
labels:
app: springboot-demo
spec:
containers:
- name: springboot-demo
image: your-dockerhub-username/springboot-demo:1.0
ports:
- containerPort: 8080執(zhí)行以下命令創(chuàng)建 Deployment:
kubectl apply -f deployment.yaml
replicas: 3 表示創(chuàng)建 3 個(gè)副本,確保應(yīng)用的高可用性。
5.2 創(chuàng)建 Service
創(chuàng)建一個(gè)名為 service.yaml 的文件,內(nèi)容如下:
apiVersion: v1
kind: Service
metadata:
name: springboot-demo-service
spec:
selector:
app: springboot-demo
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: LoadBalancer執(zhí)行以下命令創(chuàng)建 Service:
kubectl apply -f service.yaml
type: LoadBalancer 表示創(chuàng)建一個(gè)負(fù)載均衡器,將外部流量分發(fā)到后端的 Pod 上。
5.3 查看部署狀態(tài)
使用以下命令查看 Deployment 和 Service 的狀態(tài):
kubectl get deployments kubectl get services
確保 Deployment 的 READY 狀態(tài)為 3/3,Service 分配到了外部 IP 地址。
5.4 訪問(wèn)應(yīng)用
如果使用 Minikube,可以執(zhí)行以下命令獲取應(yīng)用的訪問(wèn)地址:
minikube service springboot-demo-service
如果是云環(huán)境,使用 Service 分配的外部 IP 地址訪問(wèn) http://<external-ip>/hello,若能看到 API 返回結(jié)果,則說(shuō)明應(yīng)用部署成功。
六、持續(xù)集成與持續(xù)部署(CI/CD)
6.1 選擇 CI/CD 工具
可以選擇 Jenkins、GitLab CI/CD、GitHub Actions 等工具實(shí)現(xiàn) CI/CD 流程。這里以 GitHub Actions 為例進(jìn)行介紹。
6.2 配置 GitHub Actions
- 在項(xiàng)目根目錄下創(chuàng)建
.github/workflows目錄。 - 在該目錄下創(chuàng)建一個(gè)名為
ci-cd.yml的文件,內(nèi)容如下:
name: Spring Boot CI/CD
on:
push:
branches:
- main
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Java
uses: actions/setup-java@v1
with:
java-version: 11
- name: Build with Maven
run: mvn clean package
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username:${{ secrets.DOCKERHUB_USERNAME }}
password:${{ secrets.DOCKERHUB_PASSWORD }}
- name: Build and push Docker image
uses: docker/build-push-action@v2
with:
context: .
push: true
tags: your-dockerhub-username/springboot-demo:latest
- name: Set up kubectl
uses: azure/setup-kubectl@v1
- name: Deploy to Kubernetes
run: |
kubectl config set-cluster my-cluster --server=${{ secrets.K8S_SERVER }}
kubectl config set-credentials my-user --token=${{ secrets.K8S_TOKEN }}
kubectl config set-context my-context --cluster=my-cluster --user=my-user
kubectl config use-context my-context
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml- 在 GitHub 項(xiàng)目的設(shè)置中添加
DOCKERHUB_USERNAME、DOCKERHUB_PASSWORD、K8S_SERVER、K8S_TOKEN等 Secrets,確保敏感信息的安全。
6.3 觸發(fā) CI/CD 流程
每次向 main 分支推送代碼時(shí),GitHub Actions 會(huì)自動(dòng)觸發(fā) CI/CD 流程,完成代碼構(gòu)建、鏡像打包、推送和 K8s 部署等操作。
七、總結(jié)
通過(guò)以上步驟,我們完成了從 Spring Boot 項(xiàng)目開發(fā)到 Docker 鏡像構(gòu)建,再到使用 K8s 進(jìn)行云原生部署的全流程。并且通過(guò) CI/CD 工具實(shí)現(xiàn)了代碼的自動(dòng)化部署,提高了開發(fā)和部署效率。在實(shí)際項(xiàng)目中,可以根據(jù)需求對(duì)各個(gè)環(huán)節(jié)進(jìn)行優(yōu)化和擴(kuò)展,確保應(yīng)用的高可用性、可擴(kuò)展性和安全性。
到此這篇關(guān)于SpringBoot+Docker+K8s云原生部署全流程(從零到發(fā)布)的文章就介紹到這了,更多相關(guān)SpringBoot+Docker+K8s云原生部署內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java根據(jù)IP地址實(shí)現(xiàn)歸屬地獲取
Ip2region是一個(gè)離線IP地址定位庫(kù)和IP定位數(shù)據(jù)管理框架,這篇文章主要為大家詳細(xì)介紹了Java如何使用Ip2region實(shí)現(xiàn)根據(jù)IP地址獲取歸屬地,感興趣的小伙伴可以了解下2025-05-05
Java如何避免死鎖和競(jìng)態(tài)條件的實(shí)現(xiàn)
本文主要介紹了Java如何避免死鎖和競(jìng)態(tài)條件的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
SpringBoot實(shí)現(xiàn)對(duì)Http接口進(jìn)行監(jiān)控的代碼
Spring Boot Actuator是Spring Boot提供的一個(gè)模塊,用于監(jiān)控和管理Spring Boot應(yīng)用程序的運(yùn)行時(shí)信息,本文將介紹一下Spring Boot Actuator以及代碼示例,以及如何進(jìn)行接口請(qǐng)求監(jiān)控,需要的朋友可以參考下2024-07-07
Maven中Profile基礎(chǔ)知識(shí)與激活機(jī)制詳解
這篇文章將深入解析Maven?Profile的底層實(shí)現(xiàn)機(jī)制,從Profile標(biāo)識(shí)符的作用域劃分到多維度激活條件的組合應(yīng)用,全面剖析其在不同規(guī)模項(xiàng)目中的最佳實(shí)踐,需要的可以了解下2025-05-05
java&javascript自定義加密數(shù)據(jù)傳輸代碼示例
這篇文章主要介紹了java&javascript自定義加密數(shù)據(jù)傳輸代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11
關(guān)于@Autowired的使用及注意事項(xiàng)
這篇文章主要介紹了關(guān)于@Autowired的使用及注意事項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
SpringBoot整合atomikos實(shí)現(xiàn)跨庫(kù)事務(wù)的詳細(xì)方案
這篇文章主要介紹了SpringBoot整合atomikos實(shí)現(xiàn)跨庫(kù)事務(wù),業(yè)務(wù)主要涉及政府及企業(yè)且并發(fā)量不大,所以采用XA事務(wù),雖然性能有所損失,但是可以保證數(shù)據(jù)的強(qiáng)一致性,需要的朋友可以參考下2022-06-06
Java實(shí)現(xiàn)整合文件上傳到FastDFS的方法詳細(xì)
FastDFS是一個(gè)開源的輕量級(jí)分布式文件系統(tǒng),對(duì)文件進(jìn)行管理,功能包括:文件存儲(chǔ)、文件同步、文件上傳、文件下載等,解決了大容量存儲(chǔ)和負(fù)載均衡的問(wèn)題。本文將提供Java將文件上傳至FastDFS的示例代碼,需要的參考一下2022-02-02
使用SpringMVC在redirect重定向的時(shí)候攜帶參數(shù)的問(wèn)題
這篇文章主要介紹了使用SpringMVC在redirect重定向的時(shí)候攜帶參數(shù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
SpringAOP核心對(duì)象的創(chuàng)建圖解
這篇文章主要介紹了SpringAOP核心對(duì)象的創(chuàng)建詳解,通過(guò)使用AOP,我們可以將橫切關(guān)注點(diǎn)(如日志記錄、性能監(jiān)控、事務(wù)管理等)從業(yè)務(wù)邏輯中分離出來(lái),使得代碼更加模塊化、可維護(hù)性更高,需要的朋友可以參考下2023-10-10

