Docker容器化实战:将Spring Boot应用部署到K8s
Docker容器化实战:将Spring Boot应用部署到K8s
在现代应用开发中,使用Docker容器化和Kubernetes(K8s)部署Spring Boot应用,能实现高效、可扩展的云原生架构。本指南将通过实战步骤,帮助您逐步完成从应用容器化到K8s集群部署的全过程。确保您已安装Docker和Kubernetes环境(如Minikube或云厂商集群)。整个过程分为三个阶段:准备应用、Docker化、K8s部署。每个步骤都提供代码示例和解释,确保真实可靠。
步骤1: 准备Spring Boot应用
首先,确保您有一个可运行的Spring Boot应用。这里以简单示例为例:一个REST API应用,使用Spring Initializr生成。关键点:
- 应用主类:
DemoApplication.java。 - 控制器:
HelloController.java,提供一个端点返回"Hello, Docker & K8s!"。 - 构建工具:Maven或Gradle。假设使用Maven,项目结构如下:
src/ main/ java/com/example/demo/ DemoApplication.java HelloController.java pom.xml
测试应用本地运行:执行mvn spring-boot:run,访问http://localhost:8080/hello应返回预期响应。
步骤2: Docker化Spring Boot应用
将应用打包成Docker镜像,便于容器化运行。核心是创建Dockerfile,定义构建过程。
操作步骤:
- 编写Dockerfile:在项目根目录创建文件
Dockerfile,内容如下。此文件基于OpenJDK镜像,构建Spring Boot可执行JAR。
# 使用官方OpenJDK基础镜像
FROM openjdk:11-jre-slim
# 设置工作目录
WORKDIR /app
# 复制Maven构建的JAR文件到镜像中
COPY target/demo-0.0.1-SNAPSHOT.jar app.jar
# 暴露应用端口(Spring Boot默认8080)
EXPOSE 8080
# 启动命令
ENTRYPOINT ["java", "-jar", "app.jar"]
- 构建Docker镜像:
- 先构建应用JAR:运行
mvn clean package,生成target/demo-0.0.1-SNAPSHOT.jar。 - 构建镜像:执行
docker build -t spring-boot-demo:latest .,其中spring-boot-demo是镜像名称。 - 验证:运行
docker run -p 8080:8080 spring-boot-demo,访问http://localhost:8080/hello测试。
- 先构建应用JAR:运行
注意事项:
- 镜像大小优化:使用多阶段构建(如
FROM maven:3.8-jdk-11 AS build编译,再复制JAR到轻量镜像)。 - 安全:定期更新基础镜像,避免漏洞。
步骤3: 部署到Kubernetes集群
将Docker镜像部署到K8s,需创建Kubernetes资源配置文件,定义Deployment和Service。
操作步骤:
-
推送镜像到仓库(可选):如果使用远程集群,推送镜像到Docker Hub或私有仓库(如
docker push yourusername/spring-boot-demo:latest)。 -
创建Deployment文件:在项目根目录创建
deployment.yaml,定义Pod副本和容器配置。
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-boot-demo-deployment
spec:
replicas: 2 # 运行2个Pod副本,提高可用性
selector:
matchLabels:
app: spring-boot-demo
template:
metadata:
labels:
app: spring-boot-demo
spec:
containers:
- name: spring-boot-container
image: spring-boot-demo:latest # 若使用远程仓库,改为yourusername/spring-boot-demo:latest
ports:
- containerPort: 8080
resources:
requests:
cpu: "100m" # CPU请求:0.1核,用$0.1$单位表示
memory: "128Mi" # 内存请求:128MB
limits:
cpu: "500m" # CPU限制:0.5核
memory: "512Mi" # 内存限制:512MB
- 创建Service文件:创建
service.yaml,暴露Deployment供外部访问。
apiVersion: v1
kind: Service
metadata:
name: spring-boot-demo-service
spec:
selector:
app: spring-boot-demo # 匹配Deployment的标签
ports:
- protocol: TCP
port: 80
targetPort: 8080 # 映射到容器端口
type: LoadBalancer # 云环境下自动创建负载均衡器;本地测试用NodePort
-
应用配置到K8s集群:
- 部署Deployment:运行
kubectl apply -f deployment.yaml。 - 部署Service:运行
kubectl apply -f service.yaml。 - 检查状态:使用
kubectl get pods确认Pod运行,kubectl get services获取Service外部IP。
- 部署Deployment:运行
-
测试部署:访问Service的IP(如
http://<external-ip>/hello),应返回"Hello, Docker & K8s!"。
注意事项:
- 资源优化:根据应用负载调整
replicas和资源限制,避免资源浪费。例如,CPU使用率公式:$ \text{利用率} = \frac{\text{实际使用}}{\text{请求值}} \times 100% $,目标保持70-80%。 - 高可用:使用K8s的Horizontal Pod Autoscaler自动扩展。
- 监控:集成Prometheus和Grafana跟踪性能指标。
总结
通过以上步骤,您已成功将Spring Boot应用容器化并部署到Kubernetes。关键优势包括弹性伸缩、故障恢复和简化运维。实战中,建议:
- 使用CI/CD流水线(如Jenkins或GitHub Actions)自动化构建和部署。
- 遵循云原生最佳实践,如配置ConfigMap管理环境变量。
- 测试覆盖率:确保单元和集成测试覆盖核心逻辑。
遇到问题?检查K8s日志:kubectl logs <pod-name>。祝您部署顺利!
更多推荐
所有评论(0)