SpringBoot应用打包并在MiniKube部署
-
概览
-
准备环境
- windows下安装Docker Desktop
- 编写一个用于测试的HelloWord的SpringBoot应用
-
基于应用打包docker镜像
- 使用Dockerfile(最通用,本次以这个为准)
- 使用 Spring Boot build-image(免 Dockerfile)
- 使用 Jib(不需要 Docker 环境)
-
发布到K8S集群,编写Deployments和Service运行服务6
-
参考资料
- ((20250805021845-4bl30iz '标准参考步骤'))
- ((20250815014300-yce4q7x '镜像推送到K8S服务的三种方法'))
-
-
详细步骤
-
安装docker desktop 并设置国内镜像源
这样使用 docker build 的时候才能拉得到镜像,否则会访问docker.io网络原因失败。
![image]()
-
创建SpringBoot 工程
└─k8sHello3 - 副本 │ Dockerfile │ pom.xml └─src └─main ├─java │ └─com │ └─example │ HelloworldApplication.java │ HelloWorldController.java └─resources application.properties<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.5.4</version> <relativePath/> </parent> <groupId>org.example</groupId> <artifactId>k8sHello3</artifactId> <version>1.0-SNAPSHOT</version> <properties> <java.version>21</java.version> </properties> <dependencies> <!-- Spring Boot Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- JDBC + 数据源 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!-- MySQL 驱动 --> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.3.0</version> <!-- 可根据需求升级 --> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>3.5.4</version> <!-- 根据你使用的 Spring Boot 版本 --> <executions> <execution> <goals> <goal>repackage</goal> <!-- 关键点! --> </goals> </execution> </executions> </plugin> </plugins> </build> </project> -
创建Dockerfile脚本
FROM maven:3.9.6-eclipse-temurin-21 as builder WORKDIR /app COPY . . RUN mvn clean package -DskipTests FROM eclipse-temurin:21-jdk WORKDIR /app COPY --from=builder /app/target/*.jar app.jar EXPOSE 9000 ENTRYPOINT ["java", "-jar", "app.jar"] -
构建Docker镜像
注意:这里需要用到系统的maven路径,maven的参数,所以需要本地的默认jdk和maven最好和springboot工程的一致
![image]()
![image]()
-
执行构建
PS E:\develop\IdeaCode\MyCode\SpringK8S\k8sHello3> docker build -t mazhiqiang/springboot-demo:1.0 . PS E:\develop\IdeaCode\MyCode\SpringK8S\k8sHello3> docker build -t mazhiqiang/springboot-demo:1.0 . [+] Building 151.3s (13/13) FINISHED docker:desktop-linux => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 795B 0.0s => WARN: FromAsCasing: 'as' and 'FROM' keywords' casing do not match (line 20) 0.0s => [internal] load metadata for docker.io/library/eclipse-temurin:21-jre-alpine 8.6s => [internal] load metadata for docker.io/library/maven:3.9.6-eclipse-temurin-21 5.6s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [builder 1/4] FROM docker.io/library/maven:3.9.6-eclipse-temurin-21@sha256:8d63d4c1902cb12d9e79a70671b18ebe26358cb592561af33ca1808f00d935cb 0.0s => [internal] load build context 2.3s => => transferring context: 24.43MB 2.3s => [stage-1 1/3] FROM docker.io/library/eclipse-temurin:21-jre-alpine@sha256:4ca7eff3ab0ef9b41f5fefa35efaeda9ed8d26e161e1192473b24b3a6c348aef 13.5s => => resolve docker.io/library/eclipse-temurin:21-jre-alpine@sha256:4ca7eff3ab0ef9b41f5fefa35efaeda9ed8d26e161e1192473b24b3a6c348aef 0.0s => => sha256:4ca7eff3ab0ef9b41f5fefa35efaeda9ed8d26e161e1192473b24b3a6c348aef 2.68kB / 2.68kB 0.0s => => sha256:3408c45e1faee20e4e68808939a75f87efa469b927d20e12309689ead053daba 1.94kB / 1.94kB 0.0s => => sha256:1ab59740150ab3beff6f26cb814b36f6b3d51aae8959b288d98c2df258e093f5 3.98kB / 3.98kB 0.0s => => sha256:9824c27679d3b27c5e1cb00a73adb6f4f8d556994111c12db3c5d61a0c843df8 3.80MB / 3.80MB 1.4s => => sha256:6a46580b98941ec4960dce678993b8f83a0b4d2d146c9d4e59e3aa6e788c13e2 16.28MB / 16.28MB 4.1s => => sha256:57f9d657519484ce2f35f23c98dec4ef4411ffbb8df53ae594b3563de635b94c 53.14MB / 53.14MB 12.6s => => extracting sha256:9824c27679d3b27c5e1cb00a73adb6f4f8d556994111c12db3c5d61a0c843df8 0.1s => => sha256:cf466e9ba1cfaf9351b9b793d92033975eb18f8b2ffadf9b5720caea1fcb9f48 127B / 127B 2.6s => => sha256:fb760d495f93020b467e7edca17a273394c877a25c14ce0d90a9a039e90bcb08 2.28kB / 2.28kB 3.6s => => extracting sha256:6a46580b98941ec4960dce678993b8f83a0b4d2d146c9d4e59e3aa6e788c13e2 0.4s => => extracting sha256:57f9d657519484ce2f35f23c98dec4ef4411ffbb8df53ae594b3563de635b94c 0.7s => => extracting sha256:cf466e9ba1cfaf9351b9b793d92033975eb18f8b2ffadf9b5720caea1fcb9f48 0.0s => => extracting sha256:fb760d495f93020b467e7edca17a273394c877a25c14ce0d90a9a039e90bcb08 0.0s => CACHED [builder 2/4] WORKDIR /app 0.0s => [builder 3/4] COPY . . 0.9s => [builder 4/4] RUN mvn clean package -DskipTests 138.9s => [stage-1 2/3] WORKDIR /app 0.1s => [stage-1 3/3] COPY --from=builder /app/target/*.jar app.jar 0.0s => exporting to image 0.1s => => exporting layers 0.0s => => writing image sha256:a2aa390e0f30a3a35fb0821f003e1ce9ec15e11c53ed7a832a5006cd4511049c 0.0s => => naming to docker.io/mazhiqiang/springboot-demo:1.0 0.0s 1 warning found (use docker --debug to expand): - FromAsCasing: 'as' and 'FROM' keywords' casing do not match (line 20) View build details: docker-desktop://dashboard/build/desktop-linux/desktop-linux/6dzxj7h5mtsxefsnptlkl5lwt PS E:\develop\IdeaCode\MyCode\SpringK8S\k8sHello3>![image]()
-
尝试本地启动
PS E:\develop\IdeaCode\MyCode\SpringK8S\k8sHello3> docker run -p 9001:9000 a2aa390e0f30 . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.5.4) 2025-08-13T15:45:14.109Z INFO 1 --- [ main] com.example.HelloworldApplication : Starting HelloworldApplication v1.0-SNAPSHOT using Java 21.0.8 with PID 1 (/app/app.jar started by root in /app) 2025-08-13T15:45:14.111Z INFO 1 --- [ main] com.example.HelloworldApplication : No active profile set, falling back to 1 default profile: "default" 2025-08-13T15:45:14.985Z INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 9000 (http) 2025-08-13T15:45:14.999Z INFO 1 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2025-08-13T15:45:14.999Z INFO 1 --- [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.43] 2025-08-13T15:45:15.022Z INFO 1 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2025-08-13T15:45:15.023Z INFO 1 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 859 ms 2025-08-13T15:45:15.452Z INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 9000 (http) with context path '/' 2025-08-13T15:45:15.462Z INFO 1 --- [ main] com.example.HelloworldApplication : Started HelloworldApplication in 1.712 seconds (process running for 2.03) 2025-08-13T15:46:16.120Z INFO 1 --- [nio-9000-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' 2025-08-13T15:46:16.120Z INFO 1 --- [nio-9000-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' 2025-08-13T15:46:16.120Z INFO 1 --- [nio-9000-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 0 ms![image]()
-
-
将镜像部署到K8S
-
从开发主机将镜像导出,并在K8S服务器上导入
PS E:\develop\IdeaCode> docker images REPOSITORY TAG IMAGE ID CREATED SIZE mazhiqiang/springboot-demo 1.0 a2aa390e0f30 26 hours ago 230MB <none> <none> bad723415641 28 hours ago 1.09GB springboot-demo 1.0 0536d6d59796 9 days ago 472MB PS E:\develop\IdeaCode> docker save mazhiqiang/springboot-demo:1.0 -o myapp.tar -
在服务器导入镜像
root@mzq-VMware-Virtual-Platform:/home/mzq# docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver v1.22.1 f30469a2491a 3 years ago 128MB registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy v1.22.1 36c4ebbc9d97 3 years ago 104MB registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager v1.22.1 6e002eb89a88 3 years ago 122MB registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler v1.22.1 aca5ededae9c 3 years ago 52.7MB registry.cn-hangzhou.aliyuncs.com/google_containers/dashboard <none> e1482a24335a 4 years ago 220MB registry.cn-hangzhou.aliyuncs.com/google_containers/etcd 3.5.0-0 004811815584 4 years ago 295MB registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-scraper <none> 7801cfc6d5c0 4 years ago 34.4MB registry.cn-hangzhou.aliyuncs.com/google_containers/coredns v1.8.4 8d147537fb7d 4 years ago 47.6MB registry.cn-hangzhou.aliyuncs.com/google_containers/storage-provisioner v5 6e38f40d628d 4 years ago 31.5MB registry.cn-hangzhou.aliyuncs.com/google_containers/pause 3.5 ed210e3e4a5b 4 years ago 683kB root@mzq-VMware-Virtual-Platform:/home/mzq# docker load -i myapp.tar 418dccb7d85a: Loading layer [==================================================>] 8.596MB/8.596MB c2d2b55d55c7: Loading layer [==================================================>] 34.3MB/34.3MB 1eb3de508cc3: Loading layer [==================================================>] 164.2MB/164.2MB bb64f233ca86: Loading layer [==================================================>] 2.048kB/2.048kB 880a6d9a5a59: Loading layer [==================================================>] 7.168kB/7.168kB 4e89c95e0e62: Loading layer [==================================================>] 1.536kB/1.536kB 0a30d1234cb0: Loading layer [==================================================>] 24.41MB/24.41MB Loaded image: mazhiqiang/springboot-demo:1.0 root@mzq-VMware-Virtual-Platform:/home/mzq# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mazhiqiang/springboot-demo 1.0 a2aa390e0f30 26 hours ago 230MB registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver v1.22.1 f30469a2491a 3 years ago 128MB registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler v1.22.1 aca5ededae9c 3 years ago 52.7MB registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy v1.22.1 36c4ebbc9d97 3 years ago 104MB registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager v1.22.1 6e002eb89a88 3 years ago 122MB registry.cn-hangzhou.aliyuncs.com/google_containers/dashboard <none> e1482a24335a 4 years ago 220MB registry.cn-hangzhou.aliyuncs.com/google_containers/etcd 3.5.0-0 004811815584 4 years ago 295MB registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-scraper <none> 7801cfc6d5c0 4 years ago 34.4MB registry.cn-hangzhou.aliyuncs.com/google_containers/coredns v1.8.4 8d147537fb7d 4 years ago 47.6MB registry.cn-hangzhou.aliyuncs.com/google_containers/storage-provisioner v5 6e38f40d628d 4 years ago 31.5MB registry.cn-hangzhou.aliyuncs.com/google_containers/pause 3.5 ed210e3e4a5b 4 years ago 683kB -
在dashboard创建depolyment
apiVersion: apps/v1 kind: Deployment metadata: name: springboot-demo spec: replicas: 1 selector: matchLabels: app: springboot-demo template: metadata: labels: app: springboot-demo spec: containers: - name: springboot-demo image: mazhiqiang/springboot-demo:1.0 ports: - containerPort: 9000![image]()
![image]()
![image]()
-
在dashboard创建service
apiVersion: v1 kind: Service metadata: name: springboot-service spec: type: NodePort selector: app: springboot-demo ports: - protocol: TCP port: 80 # Service 对外暴露的端口(集群内部访问用) targetPort: 9000 # 转发到 Pod 容器的端口 nodePort: 30080 # 节点映射端口(集群外访问用)![image]()
![image]()
-
访问应用
![image]()
-
其他
-
-
最终概览
![image]()
-
阿斯蒂芬













浙公网安备 33010602011771号