大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
DevOps 入门
这一课你将能做到
- 说清楚 DevOps 是什么、解决什么问题,以及它在软件交付链路中的位置
- 画出一个 Spring Boot 项目从代码提交到线上运行的完整交付流程图
- 说清楚一门编程语言(Java/Go/Python)在 DevOps 工具链里扮演的角色
为什么要学
你写了一个 Spring Boot 接口,本地 localhost:8080 跑得飞起。但用户访问的是 https://api.example.com,中间隔着:代码提交 → 构建打包 → 上传服务器 → 启动进程 → 配置域名和 HTTPS → 监控告警。这一整条链路,就是 DevOps 要管的事。
人话:开发(Dev)负责「把功能做出来」,运维(Ops)负责「让功能稳定跑在线上」。以前这两拨人各干各的,互相甩锅——开发说「我本地是好的」,运维说「服务器没问题」。DevOps 的核心就是:用自动化工具和流程,把「做出来」到「跑起来」之间的墙拆掉,让一个人或一个小团队就能完成从写代码到上线的全过程。
对本站(Spring Boot + MySQL + Redis + Nginx + Docker)而言,DevOps 就是你把自己的项目部署到一台云服务器,并且能做到:改一行代码,一条命令(甚至自动)就完成上线,挂了能第一时间知道。
先建立图像
一条典型的交付流水线长这样:
开发者本地
│ git push
▼
代码仓库 (GitHub)
│ 触发 Webhook
▼
CI 服务器 (GitHub Actions)
│ mvn package → 构建 jar → 构建 Docker 镜像
▼
镜像仓库 (Docker Hub / 阿里云 ACR)
│ 服务器拉取镜像
▼
生产服务器 (云主机)
│ docker compose up -d
▼
Nginx(443) → Spring Boot(8080) → MySQL(3306) / Redis(6379)
│
▼
监控告警 (日志 + 健康检查)
关键认知:每一个环节都可以用代码和工具固化下来,而不是靠人 SSH 上服务器敲命令。固化的好处是可重复、不出错、可追溯。
跟着做
步骤 1:认清你当前的「手动部署」流程
假设你已经有一台云服务器,现在部署一个 Spring Boot 应用的「土办法」是:
# 本地打包
mvn clean package -DskipTests
# 上传 jar 到服务器
scp target/app-0.0.1-SNAPSHOT.jar root@1.2.3.4:/opt/app/
# SSH 上服务器启动
ssh root@1.2.3.4
cd /opt/app
nohup java -jar app-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod > app.log 2>&1 &
把这套流程完整跑一遍,感受其中的「手工环节」:上传慢、启动命令容易写错、进程挂了没人知道、回滚要重新传旧包。这些痛点就是后面每一课要解决的目标。
步骤 2:给部署过程做一次「体检」
在服务器上执行下面的命令,回答对应问题:
# 应用进程还在吗?
ps aux | grep java
# 8080 端口在监听吗?
ss -tlnp | grep 8080
# 最近 100 行日志有没有报错?
tail -n 100 /opt/app/app.log
# 服务器资源还剩多少?
free -h && df -h && uptime
这四条命令是最基本的「运维直觉」:进程、端口、日志、资源。以后每次部署完都应顺手检查。
步骤 3:写一个最简陋的部署脚本
把步骤 1 的手工操作固化成 deploy.sh:
#!/bin/bash
set -e # 任何一步失败立即退出
APP_NAME=app
JAR=target/app-0.0.1-SNAPSHOT.jar
SERVER=root@1.2.3.4
REMOTE_DIR=/opt/app
mvn clean package -DskipTests
scp $JAR $SERVER:$REMOTE_DIR/app.jar
ssh $SERVER << 'EOF'
cd /opt/app
# 杀掉旧进程
pkill -f 'java -jar app.jar' || true
# 启动新进程
nohup java -jar app.jar --spring.profiles.active=prod > app.log 2>&1 &
sleep 10
# 健康检查
curl -f http://localhost:8080/actuator/health || exit 1
echo "部署成功"
EOF
这个脚本还很原始,但已经体现了 DevOps 的第一个原则:能用脚本做的,绝不用手敲。
步骤 4:认识语言在 DevOps 中的角色
路线图的第一个节点是「选择一门编程语言」。对 Java 后端来说,语言栈已经定了(Java),但 DevOps 场景下你还需要:
- Bash/Shell:写部署脚本、日志处理、定时任务,服务器上的「胶水语言」,必须会。
- Python:写复杂的自动化工具、调用云厂商 API、数据处理,运维领域的「瑞士军刀」。
- Go:Docker、Kubernetes、Terraform 这些 DevOps 基础设施本身就是 Go 写的,进阶时再学。
建议路径:Bash 必会 → Python 熟练 → Go 了解。第 4 课会专门展开。
讲清楚要点
- DevOps 不是一个岗位,是一套实践:核心是文化(开发和运维共同为线上负责)+ 自动化(CI/CD、IaC)+ 度量(监控、日志)。工具只是载体。
- 一切皆可代码化:基础设施用 Terraform 描述(IaC),服务器配置用 Ansible 描述,发布流程用 CI/CD 流水线描述。代码化的东西可以进 Git,可以评审,可以回滚。
- 小步快跑,频繁发布:DevOps 追求的不是「一次完美的上线」,而是「每次改动都很小,出问题能快速定位和回滚」。这要求自动化程度足够高。
- 监控和日志是「线上之眼」:没有监控的系统等于闭着眼睛开车。Spring Boot 的 Actuator、日志文件、云厂商的云监控,是你必须最先配好的东西。
- 安全是底线不是可选项:服务器端口最小开放、密钥不进 Git、数据库不暴露公网。这些在第 12 课综合练习里会逐项落实。
你可能会懵的地方
-
DevOps 和运维(Ops)有什么区别? 传统运维重心在「保证系统稳定」,偏被动响应;DevOps 强调用软件工程的方法做运维,主动把重复工作自动化。DevOps 工程师 = 会写代码的运维 + 懂部署的开发。
-
DevOps、SRE、平台工程是一回事吗? SRE(站点可靠性工程)是 Google 对 DevOps 的具体实践,更强调可用性指标(SLI/SLO)和错误预算;平台工程是近两年兴起的方向,给开发团队提供自助式的内部平台。初学者不用纠结,先掌握 DevOps 通用技能,殊途同归。
-
我是学 Java 后端的,为什么要学运维的东西? 因为「写完代码」只占工作的 30%,剩下的 70% 是构建、部署、排查线上问题。而且小团队根本没有专职运维,服务挂了就是你自己上。会 DevOps 的后端工程师在求职市场上明显更值钱。
-
学 DevOps 是不是要背很多命令? 不是。命令可以查,重点是理解「为什么这么设计」:为什么用容器而不是直接跑 jar?为什么要 CI/CD 而不是手动传包?理解了动机,命令自然记住了。
-
Docker、K8s、Jenkins、Ansible……这么多工具都要学吗? 不用一次全学。本课程的路径是:Linux → Git → 网络 → Docker → 云平台 → IaC(Terraform)→ 配置管理(Ansible)→ CI/CD(GitHub Actions)→ Nginx。按顺序学完,工具之间的关系自然清晰。
错法对照
| 错法 | 问题 | 正解 |
|---|---|---|
| 直接在生产服务器上改代码 | 改动无记录、无法回滚 | 所有变更走 Git + 流水线 |
| 用 root 用户跑应用 | 被入侵即全盘失守 | 建普通用户,最小权限 |
nohup java -jar & 裸跑 | 进程挂了就没了,无自动重启 | 用 systemd 或 Docker 管理进程 |
| 把数据库密码写在代码里提交 | 密钥泄露,Git 历史永久留痕 | 用环境变量或密钥管理服务 |
| 上线不看监控不看日志 | 出了问题用户先发现 | 部署后必查健康接口和错误日志 |
卡点急救
- SSH 连不上服务器:先确认安全组/防火墙放行了 22 端口;再用
ssh -v user@ip看详细报错;密钥登录失败检查服务器上~/.ssh/authorized_keys权限是否为 600。 - 应用启动后访问不了:按顺序排查——进程在吗(
ps aux | grep java)→ 端口在监听吗(ss -tlnp)→ 防火墙放行了吗(firewall-cmd --list-all或云安全组)→ Nginx 配置对吗。 - 部署后发现是旧版本:确认 jar 包时间戳(
ls -l)是不是刚传的;确认旧进程真的被杀掉了(有时 pkill 匹配不到);浏览器强刷排除缓存。
面试常问
-
什么是 DevOps?它和敏捷开发的关系? DevOps 是打破开发与运维壁垒的一组实践,核心是文化协作、自动化、快速反馈。敏捷解决的是「开发如何快速响应需求变化」,DevOps 解决的是「开发出来的东西如何快速稳定地交付到线上」,两者是上下游关系,敏捷在左,DevOps 在右。
-
描述一下你做过的项目部署流程? 按「代码提交 → CI 构建(Maven 打包、跑测试)→ 构建 Docker 镜像推送仓库 → 服务器拉取镜像 → docker compose 重启 → Nginx 反代 → Actuator 健康检查确认」这条线讲,并强调哪些环节自动化了、哪些还有待改进。
-
如果线上服务突然挂了,你的排查思路? 自底向上:机器资源(CPU/内存/磁盘)→ 进程和端口 → 应用日志(最近的 ERROR)→ 依赖服务(MySQL/Redis 是否可用)→ 网络链路(Nginx、DNS)。强调「先看监控告警再动手」和「保留现场再重启」。
自测三问
- 用一句话向非技术同事解释 DevOps 是干什么的。
- 你现在项目的部署流程里,哪些环节是手工的?如果用脚本固化,第一步做什么?
- 为什么生产环境不能用
nohup java -jar &裸跑应用?有什么更好的方式?
小结一句话
DevOps 就是用自动化把「代码」到「线上稳定运行」之间的每一步固化下来,让交付又快又稳。
延伸
- roadmap.sh DevOps 路线图(本课程对应的官方路线)
- 下一课:操作系统——所有部署都发生在 Linux 上,先把它用熟。