Docker+K8s 部署 Spring Boot 应用全流程
·
将 Spring Boot 应用通过 Docker 容器化并部署到 Kubernetes (K8s) 集群,可实现应用的高效管理、弹性伸缩和故障自愈。以下是完整流程:
一、准备工作
- 环境要求
- 安装 Docker(用于构建镜像)
- 准备 K8s 集群(单节点 minikube 或多节点集群)
- 安装 kubectl(K8s 命令行工具)
- 一个可运行的 Spring Boot 项目(示例使用
demo-app)
二、Spring Boot 应用容器化(Docker)
1. 编写 Dockerfile
在 Spring Boot 项目根目录创建Dockerfile:
dockerfile
# 基础镜像(Java 17)
FROM openjdk:17-jdk-slim
# 工作目录
WORKDIR /app
# 复制打包好的Jar文件到容器
COPY target/demo-app-0.0.1-SNAPSHOT.jar app.jar
# 暴露端口(与Spring Boot应用端口一致)
EXPOSE 8080
# 启动命令
ENTRYPOINT ["java", "-jar", "app.jar"]
2. 打包 Spring Boot 应用
使用 Maven/Gradle 打包生成 Jar 文件:
bash
# Maven
mvn clean package -DskipTests
# Gradle
gradle clean bootJar
3. 构建 Docker 镜像
bash
# 构建镜像(标签格式:仓库地址/镜像名:版本)
docker build -t demo-app:v1 .
# 可选:推送到镜像仓库(如Docker Hub、Harbor)
docker tag demo-app:v1 your-registry/demo-app:v1
docker push your-registry/demo-app:v1
三、K8s 部署配置
1. 创建 Deployment 配置(deployment.yaml)
定义应用的部署规则(副本数、镜像、端口等):
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-app-deployment # Deployment名称
spec:
replicas: 2 # 副本数
selector:
matchLabels:
app: demo-app
template:
metadata:
labels:
app: demo-app
spec:
containers:
- name: demo-app
image: demo-app:v1 # 镜像地址(若使用远程仓库需填完整路径)
ports:
- containerPort: 8080 # 容器内端口
resources:
requests:
memory: "256Mi"
cpu: "200m"
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe: # 存活探针(检测应用是否运行)
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 60
periodSeconds: 10
2. 创建 Service 配置(service.yaml)
暴露应用访问入口(ClusterIP/NodePort/LoadBalancer):
yaml
apiVersion: v1
kind: Service
metadata:
name: demo-app-service
spec:
selector:
app: demo-app # 关联Deployment的标签
ports:
- port: 80 # Service端口
targetPort: 8080 # 容器端口
type: NodePort # 暴露到集群节点(测试用),生产可用LoadBalancer
3. 可选:Ingress 配置(ingress.yaml)
通过域名访问应用(需集群安装 Ingress Controller):
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo-app-ingress
spec:
rules:
- host: demo-app.example.com # 访问域名
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: demo-app-service
port:
number: 80
四、部署到 K8s 集群
1. 应用配置文件
bash
# 创建Deployment
kubectl apply -f deployment.yaml
# 创建Service
kubectl apply -f service.yaml
# 可选:创建Ingress
kubectl apply -f ingress.yaml
2. 验证部署状态
bash
# 查看Pod状态
kubectl get pods -l app=demo-app
# 查看Deployment
kubectl get deployment demo-app-deployment
# 查看Service(获取NodePort端口)
kubectl get service demo-app-service
# 查看日志
kubectl logs -f <pod-name>
3. 访问应用
- NodePort 方式:
http://<节点IP>:<NodePort> - Ingress 方式:配置本地 hosts 后访问
http://demo-app.example.com
五、更新与运维
-
更新应用
bash
# 构建新镜像 docker build -t demo-app:v2 . # 滚动更新Deployment kubectl set image deployment/demo-app-deployment demo-app=demo-app:v2 # 查看更新状态 kubectl rollout status deployment/demo-app-deployment -
伸缩副本数
bash
kubectl scale deployment demo-app-deployment --replicas=5 -
回滚版本
bash
# 查看历史版本 kubectl rollout history deployment/demo-app-deployment # 回滚到上一版本 kubectl rollout undo deployment/demo-app-deployment
总结
- 容器化:通过 Docker 将 Spring Boot 应用打包为镜像,保证环境一致性。
- K8s 部署:用 Deployment 管理副本,Service 暴露服务,Ingress 配置域名。
- 优势:自动扩缩容、故障自愈、滚动更新,适合生产环境大规模部署。
如需更复杂的配置(如配置中心、持久化存储),可进一步添加 ConfigMap、Secret、Volume 等 K8s 资源。
更多推荐


所有评论(0)