🌟博主介绍:Java、Python、js全栈开发 “多面手”,精通多种编程语言和技术,痴迷于人工智能领域。秉持着对技术的热爱与执着,持续探索创新,愿在此分享交流和学习,与大家共进步。
📖全栈开发环境搭建运行攻略:多语言一站式指南(环境搭建+运行+调试+发布+保姆级详解)
👉感兴趣的可以先收藏起来,希望帮助更多的人
Spring Boot Docker 化部署全流程:从打包到 K8s 集群编排
一、引言
在当今的软件开发和部署领域,容器化技术和编排工具已经成为了主流。Docker 作为一种轻量级的容器化解决方案,能够将应用程序及其依赖项打包成一个独立的容器,实现了应用的快速部署和迁移。而 Kubernetes(K8s)作为一个强大的容器编排工具,能够自动化地管理和调度这些容器,提高了应用的可靠性和可扩展性。本文将详细介绍 Spring Boot 应用从打包成 Docker 镜像到在 K8s 集群中进行编排部署的全流程。
二、Spring Boot 项目准备
2.1 创建 Spring Boot 项目
我们可以使用 Spring Initializr(https://start.spring.io/)来快速创建一个 Spring Boot 项目。选择所需的依赖,如 Web、Actuator 等,然后下载项目压缩包并解压到本地。
2.2 编写简单的 Spring Boot 应用
在 src/main/java
目录下创建一个简单的控制器类,例如:
package com.example.demo;
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!";
}
}
2.3 测试本地运行
在 IDE 中运行 DemoApplication
类,访问 http://localhost:8080/hello
,如果看到 Hello, Spring Boot!
则说明项目可以正常运行。
三、Spring Boot 项目打包
3.1 使用 Maven 打包
在项目根目录下,打开终端并执行以下命令:
mvn clean package
该命令会清理项目并将项目打包成一个可执行的 JAR 文件,通常位于 target
目录下。
3.2 验证打包结果
在 target
目录下可以看到生成的 JAR 文件,例如 demo-0.0.1-SNAPSHOT.jar
。可以通过以下命令来验证 JAR 文件是否可以正常运行:
java -jar target/demo-0.0.1-SNAPSHOT.jar
再次访问 http://localhost:8080/hello
,确保应用可以正常响应。
四、Docker 化 Spring Boot 应用
4.1 安装 Docker
根据不同的操作系统,从 Docker 官方网站(https://www.docker.com/get-started)下载并安装 Docker。安装完成后,通过以下命令验证 Docker 是否安装成功:
docker --version
4.2 创建 Dockerfile
在项目根目录下创建一个名为 Dockerfile
的文件,内容如下:
# 基础镜像
FROM openjdk:11-jre-slim
# 设置工作目录
WORKDIR /app
# 复制 JAR 文件到容器中
COPY target/demo-0.0.1-SNAPSHOT.jar app.jar
# 暴露端口
EXPOSE 8080
# 启动应用
CMD ["java", "-jar", "app.jar"]
4.3 构建 Docker 镜像
在项目根目录下,打开终端并执行以下命令来构建 Docker 镜像:
docker build -t spring-boot-demo:1.0 .
其中,-t
用于指定镜像的名称和标签,.
表示使用当前目录下的 Dockerfile
进行构建。
4.4 验证 Docker 镜像
执行以下命令查看本地的 Docker 镜像列表:
docker images
可以看到刚刚构建的 spring-boot-demo:1.0
镜像。
4.5 运行 Docker 容器
执行以下命令来运行刚刚构建的 Docker 镜像:
docker run -p 8080:8080 spring-boot-demo:1.0
其中,-p
用于将容器的 8080 端口映射到主机的 8080 端口。访问 http://localhost:8080/hello
,确保应用在 Docker 容器中可以正常运行。
五、将 Docker 镜像推送到镜像仓库
5.1 选择镜像仓库
常见的镜像仓库有 Docker Hub、阿里云镜像仓库等。这里以 Docker Hub 为例进行介绍。
5.2 登录 Docker Hub
在终端中执行以下命令登录 Docker Hub:
docker login
输入 Docker Hub 的用户名和密码进行登录。
5.3 为镜像打标签
为了将镜像推送到 Docker Hub,需要为镜像打上正确的标签。执行以下命令:
docker tag spring-boot-demo:1.0 your-dockerhub-username/spring-boot-demo:1.0
其中,your-dockerhub-username
是你的 Docker Hub 用户名。
5.4 推送镜像到 Docker Hub
执行以下命令将镜像推送到 Docker Hub:
docker push your-dockerhub-username/spring-boot-demo:1.0
推送完成后,可以在 Docker Hub 的网页上看到刚刚推送的镜像。
六、K8s 集群准备
6.1 安装和配置 K8s 集群
可以使用 Minikube 来快速搭建一个本地的 K8s 集群,也可以使用云提供商(如阿里云、腾讯云等)提供的 K8s 服务。这里以 Minikube 为例进行介绍。
6.1.1 安装 Minikube
根据不同的操作系统,从 Minikube 官方网站(https://minikube.sigs.k8s.io/docs/start/)下载并安装 Minikube。
6.1.2 启动 Minikube
在终端中执行以下命令启动 Minikube:
minikube start
6.1.3 配置 kubectl
kubectl
是 K8s 的命令行工具,用于与 K8s 集群进行交互。可以通过以下命令来配置 kubectl
:
minikube kubectl -- get po -A
6.2 验证 K8s 集群
执行以下命令查看 K8s 集群的节点信息:
kubectl get nodes
如果可以看到节点信息,则说明 K8s 集群已经正常启动。
七、在 K8s 集群中部署 Spring Boot 应用
7.1 创建 Deployment
在项目根目录下创建一个名为 deployment.yaml
的文件,内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-boot-demo-deployment
spec:
replicas: 3
selector:
matchLabels:
app: spring-boot-demo
template:
metadata:
labels:
app: spring-boot-demo
spec:
containers:
- name: spring-boot-demo-container
image: your-dockerhub-username/spring-boot-demo:1.0
ports:
- containerPort: 8080
执行以下命令来创建 Deployment:
kubectl apply -f deployment.yaml
7.2 验证 Deployment
执行以下命令查看 Deployment 的状态:
kubectl get deployments
7.3 创建 Service
为了能够从外部访问 Spring Boot 应用,需要创建一个 Service。在项目根目录下创建一个名为 service.yaml
的文件,内容如下:
apiVersion: v1
kind: Service
metadata:
name: spring-boot-demo-service
spec:
selector:
app: spring-boot-demo
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: LoadBalancer
执行以下命令来创建 Service:
kubectl apply -f service.yaml
7.4 验证 Service
执行以下命令查看 Service 的状态:
kubectl get services
如果使用的是 Minikube,可以通过以下命令来获取 Service 的访问地址:
minikube service spring-boot-demo-service
访问该地址,确保 Spring Boot 应用可以正常访问。
八、总结
通过以上步骤,我们完成了 Spring Boot 应用从打包到 Docker 化,再到在 K8s 集群中进行编排部署的全流程。容器化和编排技术为应用的部署和管理带来了极大的便利,提高了应用的可靠性和可扩展性。在实际项目中,可以根据需求对 Deployment 和 Service 进行进一步的配置和优化。