我们在学习和理解一个技术,我们首先需要知道他是什么,能给我们带来什么好处,它的使用场景是什么,核心的理论、原理是什么,有什么相关的技术栈。
1.首先我们先来理解DevOps是什么,DevOps 是一种结合 软件开发(Development) 和 IT 运维(Operations) 的方法论与实践文化。
2.目标或者说好处是让软件 更快、更稳定地开发、测试、发布和运行。
1️⃣ DevOps 核心理念
DevOps 强调 协作、自动化、持续改进:
-
开发和运维协作 🤝
打破传统"开发写完就丢给运维"的模式。
-
自动化流程 ⚙️
自动构建、测试、部署软件。
-
持续交付 🔁
小版本快速上线,而不是大版本长周期发布。
2️⃣ DevOps 典型流程
|----------------------------------------------------------------------------|
| 代码开发 ↓ 代码提交 (Git) ↓ CI 持续集成 自动构建 + 自动测试 ↓ CD 持续交付 / 持续部署 ↓ 上线部署 ↓ 监控 & 反馈 |
3️⃣ DevOps 常用工具
常见 DevOps 技术栈:
|---------|----------------------------------------|
| 过程 | 技术栈 |
| 代码管理 | * Git * GitLab * GitHub |
| CI/CD | * Jenkins * GitHub Actions * GitLab CI |
| 容器化 | Docker |
| 容器编排 | Kubernetes |
| 基础设施自动化 | * Terraform * Ansible |
| 监控 | * Prometheus * Grafana |
4️⃣ DevOps 能解决什么问题
传统模式问题:
开发:
我这边代码没问题
运维:
服务器上跑不了
DevOps 解决:
✔ 自动部署
✔ 自动测试
✔ 快速发布
✔ 可回滚
✔ 实时监控
5️⃣ DevOps 的好处
✨ 更快发布
✨ 更少故障
✨ 自动化运维
✨ 团队协作更好
---------------------------------------------------------------------
具体流程步骤
下面是一个 从写代码 → 自动部署到服务器 → 上线运行 的完整 DevOps 实战流程。我用目前企业最常见的一套技术栈来举例:
-
代码管理:Git
-
CI/CD:Jenkins
-
容器化:Docker
-
容器编排:Kubernetes
-
监控:Prometheus + Grafana
我把整个流程拆成 6 个真实公司里的步骤。
一、开发阶段(写代码)
开发人员在本地写代码,例如:
-
Java(Spring Boot)
-
Python(Django / FastAPI)
-
Node.js
-
Go
开发完成后:
|--------------------------------------------------------------|
| git add . git commit -m "add login api" git push origin main |
代码被提交到代码仓库,比如:
-
GitHub
-
GitLab
二、触发 CI(持续集成)
当代码 push 后,CI 自动触发。
例如在 Jenkins 中会自动执行 pipeline:
|---------------------------------|
| 代码提交 ↓ 触发 Jenkins ↓ 自动构建 ↓ 自动测试 |
Jenkins pipeline 示例:
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| pipeline { agent any stages { stage('Checkout') { steps { git 'https://github.com/example/project.git' } } stage('Build') { steps { sh 'mvn clean package' } } stage('Test') { steps { sh 'mvn test' } } } } |
三、构建 Docker 镜像
CI 会把应用打包成 Docker 镜像。
使用 Docker:
Dockerfile 示例:
|-------------------------------------------------------------------------------------|
| FROM openjdk:17 COPY target/app.jar app.jar ENTRYPOINT ["java","-jar","/app.jar"] |
构建镜像:
|-----------------------------|
| docker build -t myapp:1.0 . |
四、推送镜像到镜像仓库
镜像需要上传到仓库,例如:
-
Docker Hub
-
Harbor
|--------------------------------------------------------------------|
| docker tag myapp:1.0 myrepo/myapp:1.0 docker push myrepo/myapp:1.0 |
五、CD 自动部署到服务器
CI 完成后,CD 开始部署。
如果使用 Kubernetes:
部署文件:
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| apiVersion: apps/v1 kind: Deployment metadata: name: myapp spec: replicas: 3 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp image: myrepo/myapp:1.0 ports: - containerPort: 8080 |
部署:
|----------------------------------|
| kubectl apply -f deployment.yaml |