DevOps 入门
语言与 DevOps 关系。
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