🏆本文收录于「滚雪球学SpringBoot」专栏,专业攻坚指数级提升持续更新中,up!up!up!!欢迎点赞&&收藏&&订阅。
Hello,朋友们!如果你最近在学习或者使用现代软件开发技术,Docker和Kubernetes这两个词一定频频出现在你的视线中。是不是感觉有点熟悉又有点陌生?要理解这两者的魅力,咱们得从头开始慢慢拆解。今天,我就带大家完成一次从零到一的技术旅程:从构建一个简单的Java Web应用,到容器化,再到Kubernetes集群的部署,最后实现CI/CD自动化的全过程。
这篇文章不仅是一份“说明书”,更是一次生动有趣的学习之旅!带着你的好奇心和执行力,动手实践的同时,慢慢感受这些技术在实际场景中的魅力,轻松迈入DevOps的大门。坐稳了,我们出发吧!🚗💨
还记得你第一次部署一个应用程序时遇到的坑吗?开发环境和生产环境总是差异巨大,配置不一致、依赖缺失、部署效率低下等问题让人抓狂。这种困境催生了容器化技术和自动化部署流程。Docker与Kubernetes的结合,不仅让你告别“配置地狱”,还让你的应用程序具备跨环境的稳定性和强大的扩展能力。
通过完成这些步骤,你将掌握现代化软件开发流程的精髓,具备处理真实项目的能力。
Docker是一个开源的容器化平台,允许你把应用程序及其所有依赖环境打包到一个轻量级、可移植的容器中。换句话说,Docker是软件开发和运维之间的桥梁,解决了“在我机器上运行没问题”的经典矛盾。
如果Docker是跑步的鞋子,那Kubernetes就是专业的教练。Kubernetes(简称K8s)是一款容器编排工具,能让你管理大量容器,确保它们稳定运行、按需扩展、自动恢复。
CI/CD是现代开发流程的核心。CI(持续集成)强调频繁地将代码集成到主分支,通过自动化测试保证代码质量。CD(持续部署)则在CI的基础上,自动将代码部署到生产环境。两者结合,实现了开发与运维的无缝衔接。
如下我将展示如何从创建一个简单的 Java Web 应用到通过 Docker 容器化该应用,并最终部署到 Kubernetes 集群的完整流程。下面逐步解析每个步骤。
首先,我们需要创建一个简单的 Spring Boot 应用,并定义一个简单的 REST API,响应请求时返回一个字符串。
@RestController
public class HelloController {
@GetMapping("/")
public String sayHello() {
return "Hello, Kubernetes!";
}
}
解释:
@RestController
: 该注解表示该类是一个 RESTful 控制器,可以处理 HTTP 请求。@GetMapping("/")
: 这是一个处理 GET 请求的注解,映射到根路径 (/
),即访问时会触发该方法。sayHello()
: 该方法返回了一个简单的字符串 "Hello, Kubernetes!"
,它将在浏览器中显示。在 src/main/resources/application.properties
文件中,Spring Boot 默认监听端口为 8080
,因此应用会在该端口上提供服务。
接下来,我们需要编写一个 Dockerfile,以便将我们的 Spring Boot 应用容器化。
FROM openjdk:11-jdk-slim
WORKDIR /app
COPY target/hello-kubernetes.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
解释:
FROM openjdk:11-jdk-slim
: 基于 openjdk
镜像来构建我们的容器,使用的是 Java 11 的 JDK 镜像。WORKDIR /app
: 在容器内部创建并设置工作目录 /app
。COPY target/hello-kubernetes.jar app.jar
: 将 Spring Boot 应用的打包 JAR 文件 (hello-kubernetes.jar
) 复制到容器内的 /app
目录。EXPOSE 8080
: 向外暴露容器的 8080 端口。ENTRYPOINT ["java", "-jar", "app.jar"]
: 设置容器启动时的命令,执行 JAR 文件以启动 Spring Boot 应用。首先确保已经安装了 Maven。运行以下命令来构建你的 Spring Boot 应用:
mvn package
该命令会生成一个 JAR 文件,通常在 target/
目录下,名为 hello-kubernetes.jar
。
然后使用 Docker 命令构建镜像:
docker build -t hello-kubernetes .
解释:
docker build -t hello-kubernetes .
: 使用当前目录下的 Dockerfile
构建镜像,并将其命名为 hello-kubernetes
。构建好镜像后,可以通过以下命令运行容器:
docker run -d -p 8080:8080 hello-kubernetes
解释:
docker run -d -p 8080:8080 hello-kubernetes
: 以后台模式 (-d
) 启动容器,并将容器的 8080 端口映射到本机的 8080 端口。此时,你可以访问 http://localhost:8080
,应该能够看到 "Hello, Kubernetes!"
的页面,表示应用已经成功运行。
现在我们将容器化的应用部署到 Kubernetes 集群中。
首先,创建一个 deployment.yaml
文件,定义 Kubernetes 中的部署资源:
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-kubernetes
spec:
replicas: 3
selector:
matchLabels:
app: hello-kubernetes
template:
metadata:
labels:
app: hello-kubernetes
spec:
containers:
- name: hello-kubernetes
image: hello-kubernetes:latest
ports:
- containerPort: 8080
解释:
apiVersion: apps/v1
: 指定使用 Kubernetes 1.9+ 版本的 apps/v1
API。kind: Deployment
: 这表示资源类型是 Deployment
,它定义了如何管理和扩展应用的副本。replicas: 3
: 规定部署应用时创建 3 个副本(副本数根据实际需求调整)。selector
: 用于选择该 Deployment
中包含哪些 Pods。template
: 定义 Pods 的模板,containers
下的 image
为之前构建的 Docker 镜像。接着,创建一个 service.yaml
文件,定义 Kubernetes 服务资源,允许外界访问该应用:
apiVersion: v1
kind: Service
metadata:
name: hello-kubernetes-service
spec:
selector:
app: hello-kubernetes
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: LoadBalancer
解释:
apiVersion: v1
: 使用 v1
API 版本。kind: Service
: 表示定义一个服务。selector
: 用于选择与 hello-kubernetes
标签匹配的 Pods(即与前面创建的 Deployment
匹配的 Pods)。ports
: 这里映射的是服务的端口(80)到容器内的端口(8080)。type: LoadBalancer
: 创建一个负载均衡服务,使得外部可以通过云提供商的负载均衡器来访问该服务(如果你使用的是云平台,如 GCP 或 AWS,可以自动创建负载均衡器)。将部署和服务配置应用到 Kubernetes 集群中:
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
这会创建 Deployment
和 Service
,并将其部署到 Kubernetes 集群中。
在 Kubernetes 集群中创建服务后,您可以使用以下命令查看 Pod 和服务状态:
kubectl get pods
kubectl get svc
如果使用的是 LoadBalancer
类型的服务,Kubernetes 会为你分配一个外部的 IP 地址,你可以使用该 IP 访问应用。
kubectl get svc hello-kubernetes-service
访问负载均衡器的 IP 地址(或通过域名),应该能够看到与本地访问相同的 Hello, Kubernetes!
页面。
通过上述步骤,我们成功地:
这个流程为你提供了一个标准的从本地开发到容器化、再到 Kubernetes 集群部署的完整过程,可以作为应用部署到生产环境的参考。
Kubernetes中,每个Pod都有自己的IP,通过Service实现负载均衡和访问。常用插件包括Flannel、Calico等。
通过Sidecar模式实现辅助功能,结合Istio进行微服务流量管理,使用Prometheus和Grafana监控集群健康。
Docker与Kubernetes为开发与运维注入了新的活力。这篇文章从基础到进阶、从理论到实践,带你全方位理解容器化与自动化部署的核心理念。未来的技术世界在等待你的创造,快动手试试吧!🌈
无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。
码字不易,如果这篇文章对你有所帮助,帮忙给bug菌来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。 同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 ;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!
我是bug菌,CSDN | 掘金 | 腾讯云 | 华为云 | 阿里云 | 51CTO | InfoQ 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,掘金等平台签约作者,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计30w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。
-End-
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。