CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
DevOps 入门实战/课时/DevOps 入门
RawBlame
课时目录12 节

DevOps 入门实战

  1. 01DevOps 入门
  2. 02操作系统
  3. 03Git 与 GitHub
  4. 04脚本语言
  5. 05网络协议
  6. 06Docker
  7. 07AWS
  8. 08Terraform
  9. 09Ansible
  10. 10GitHub Actions
  11. 11Nginx
  12. 12综合练习

DevOps 入门

语言与 DevOps 关系。

25 分钟

DevOps 入门

这一课你将能做到

  1. 说清楚 DevOps 是什么、解决什么问题,以及它在软件交付链路中的位置
  2. 画出一个 Spring Boot 项目从代码提交到线上运行的完整交付流程图
  3. 说清楚一门编程语言(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 课会专门展开。

讲清楚要点

  1. DevOps 不是一个岗位,是一套实践:核心是文化(开发和运维共同为线上负责)+ 自动化(CI/CD、IaC)+ 度量(监控、日志)。工具只是载体。
  2. 一切皆可代码化:基础设施用 Terraform 描述(IaC),服务器配置用 Ansible 描述,发布流程用 CI/CD 流水线描述。代码化的东西可以进 Git,可以评审,可以回滚。
  3. 小步快跑,频繁发布:DevOps 追求的不是「一次完美的上线」,而是「每次改动都很小,出问题能快速定位和回滚」。这要求自动化程度足够高。
  4. 监控和日志是「线上之眼」:没有监控的系统等于闭着眼睛开车。Spring Boot 的 Actuator、日志文件、云厂商的云监控,是你必须最先配好的东西。
  5. 安全是底线不是可选项:服务器端口最小开放、密钥不进 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 历史永久留痕用环境变量或密钥管理服务
上线不看监控不看日志出了问题用户先发现部署后必查健康接口和错误日志

卡点急救

  1. SSH 连不上服务器:先确认安全组/防火墙放行了 22 端口;再用 ssh -v user@ip 看详细报错;密钥登录失败检查服务器上 ~/.ssh/authorized_keys 权限是否为 600。
  2. 应用启动后访问不了:按顺序排查——进程在吗(ps aux | grep java)→ 端口在监听吗(ss -tlnp)→ 防火墙放行了吗(firewall-cmd --list-all 或云安全组)→ Nginx 配置对吗。
  3. 部署后发现是旧版本:确认 jar 包时间戳(ls -l)是不是刚传的;确认旧进程真的被杀掉了(有时 pkill 匹配不到);浏览器强刷排除缓存。

面试常问

  • 什么是 DevOps?它和敏捷开发的关系? DevOps 是打破开发与运维壁垒的一组实践,核心是文化协作、自动化、快速反馈。敏捷解决的是「开发如何快速响应需求变化」,DevOps 解决的是「开发出来的东西如何快速稳定地交付到线上」,两者是上下游关系,敏捷在左,DevOps 在右。

  • 描述一下你做过的项目部署流程? 按「代码提交 → CI 构建(Maven 打包、跑测试)→ 构建 Docker 镜像推送仓库 → 服务器拉取镜像 → docker compose 重启 → Nginx 反代 → Actuator 健康检查确认」这条线讲,并强调哪些环节自动化了、哪些还有待改进。

  • 如果线上服务突然挂了,你的排查思路? 自底向上:机器资源(CPU/内存/磁盘)→ 进程和端口 → 应用日志(最近的 ERROR)→ 依赖服务(MySQL/Redis 是否可用)→ 网络链路(Nginx、DNS)。强调「先看监控告警再动手」和「保留现场再重启」。

自测三问

  1. 用一句话向非技术同事解释 DevOps 是干什么的。
  2. 你现在项目的部署流程里,哪些环节是手工的?如果用脚本固化,第一步做什么?
  3. 为什么生产环境不能用 nohup java -jar & 裸跑应用?有什么更好的方式?

小结一句话

DevOps 就是用自动化把「代码」到「线上稳定运行」之间的每一步固化下来,让交付又快又稳。

延伸

  • roadmap.sh DevOps 路线图(本课程对应的官方路线)
  • 下一课:操作系统——所有部署都发生在 Linux 上,先把它用熟。
加载本节练习…
下一课 →操作系统