运维工程师一面复盘:上线流程、Docker 与 Linux 基础
这篇记录来自一次运维工程师一面。公司名这里打码,称为“某教育信息化公司”。
这场面试给我的感觉是:面试官不只问概念,更关心我到底有没有真实部署、排障和上线经历。只要回答偏泛,就会继续追问上线流程、安全性、备份、恢复、权限和规范。
面试方向
这次主要围绕几个方向展开:
- 个人 PVE 环境和 Linux 发行版选择;
- 实习项目里的服务部署、镜像构建和上线方式;
- Nginx、Docker、Linux 命令和网络排障;
- Shell 脚本能力;
- Kubernetes 基础概念;
- 运维规范、安全、备份和回滚。
面试官比较关注“真实做过什么”。如果只是背命令,或者把个人项目流程说成成熟生产流程,很容易被追问出问题。
PVE 与 Linux 发行版
面试官先问了我的个人 PVE 环境,以及虚拟机里一般会选择哪些发行版。
这类问题主要是在判断:
- 是否真的有自己的服务器环境;
- 是否理解不同 Linux 发行版的差异;
- 是否有部署和维护服务的经验;
- 是否知道为什么选某个系统。
更稳妥的回答方式是:
我自己的 PVE 环境主要用于模拟真实运维场景,会跑多台 Linux 虚拟机,用来练习 Docker 服务部署、远程访问、监控和故障排查。
发行版选择上,Debian / Ubuntu 更适合长期服务部署,稳定、文档多;CentOS / RHEL 系更贴近企业服务器环境;Fedora / Arch 更多用于个人学习和新技术验证。选择时主要看软件包生态、维护周期、服务端稳定性、生产环境匹配程度,以及后续排障和维护成本。
这部分不要只说“我用过很多发行版”,要把选择依据说出来。
项目上线经历
面试官重点追问了实习阶段的项目经历,包括:
- 做了哪些内容;
- 负责哪一部分;
- 项目怎么上线;
- 代码如何发布;
- 镜像如何构建和更新;
- 更新过程是否安全;
- 备份和回滚怎么做。
我当时讲的是:代码提交到 GitHub,通过 GitHub Actions 构建 Docker 镜像,服务器侧用容器部署,早期使用过 Watchtower 监测镜像更新。
这个流程可以跑通,但在企业面试里会暴露几个风险:
| 问题 | 风险 |
|---|---|
| Watchtower 自动更新 | 缺少人工确认、灰度和版本锁定 |
| 使用 latest 或自动拉取 | 升级不可控,出问题难定位 |
| token 管理讲不清 | 容易被质疑密钥权限和泄露风险 |
| 备份描述模糊 | 无法证明可恢复 |
| 回滚方案不具体 | 不能说明故障时如何止损 |
更合适的表达不是把它包装成成熟生产流程,而是诚实说明它偏小团队或项目制环境:
这段经历更偏小团队项目实践,不是非常标准化的大厂生产流程。我主要参与的是服务部署、镜像构建、上线协助和基础运维。
当时通过 GitHub Actions 构建 Docker 镜像,服务器侧使用容器方式部署。早期为了方便更新,用过自动检测镜像更新的方式,但后来我意识到生产环境更推荐固定版本号、测试环境验证、人工确认发布,并保留回滚版本。
如果放到更规范的企业环境,我会设计成:CI 执行测试和构建,镜像使用明确版本号,先在测试环境验证,生产发布前备份数据库、配置文件和数据卷,发布后检查日志、接口和监控,异常时回滚到上一稳定版本。
这里关键不是“显得很厉害”,而是让面试官看到风险意识和成长过程。
规范上线流程
后续可以准备一版更工程化的上线流程:
- 开发提交代码;
- CI 执行测试和构建;
- 构建带版本号的镜像;
- 推送到镜像仓库;
- 测试环境部署验证;
- 发布前备份数据库、配置文件和关键数据卷;
- 生产环境按明确版本发布;
- 检查日志、接口、健康检查和监控;
- 如果异常,回滚到上一稳定版本;
- 记录变更内容和问题复盘。
如果面试官继续追问 Watchtower,可以这样答:
Watchtower 更适合个人服务或低风险轻量服务,不适合直接作为生产环境无人值守更新方案。生产环境更需要版本锁定、审批、灰度、备份、健康检查和回滚。即使使用自动化,也应该让流水线按明确版本发布,而不是容器发现新镜像后自动重建。
备份与回滚
我这次回答里比较薄弱的一点是备份。只说“自动备份,可以回档”太模糊。
更完整的备份回答应该包括:
| 维度 | 要说明什么 |
|---|---|
| 备份对象 | 数据库、配置文件、上传文件、Docker volume |
| 备份时机 | 发布前备份、定时备份 |
| 备份位置 | 本机、异地机器、对象存储 |
| 保留策略 | 最近 7 天、30 天或按周保留 |
| 恢复测试 | 定期验证备份能否恢复 |
| 回滚方式 | 回滚镜像版本,必要时恢复数据库和数据卷 |
可以这样说:
备份要先明确对象,比如数据库、配置文件、上传文件和 Docker volume。发布前可以做一次手动备份,平时做定时备份,并设置保留策略。备份最好不要只放本机,也要考虑异地备份或对象存储。最重要的是恢复测试,否则不能证明备份真的可用。回滚时不仅要回滚镜像版本,还要考虑数据库结构和数据是否兼容。
Nginx
面试官问了 Nginx 的功能,以及是否有反向代理实践。
我答到了静态网站和反向代理,但漏掉了负载均衡。
Nginx 常见用途包括:
- 静态资源服务;
- 反向代理;
- 负载均衡;
- HTTPS / TLS 终止;
- 请求转发;
- 访问控制;
- 限流;
- 日志记录;
- 缓存;
- gzip 压缩。
反向代理示例:
server { listen 80; server_name example.com;
location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }}负载均衡示例:
upstream backend { server 192.168.1.10:8080; server 192.168.1.11:8080;}
server { listen 80; server_name example.com;
location / { proxy_pass http://backend; }}更好的回答是:
Nginx 常见用途包括静态资源服务、反向代理、负载均衡和 HTTPS 证书终止。我自己主要用过静态站点部署和反向代理,比如把外部访问的域名转发到后端本地端口。反向代理可以隐藏后端服务端口,统一管理域名、证书和访问入口。如果是多台后端服务,也可以通过 upstream 做负载均衡。
top 与进程查看
面试官问了 top 如何按 CPU / 内存占用排序。
这次我没有答出 top 内部快捷键,只用 ps aux 替代了。
需要记住:
| 操作 | 快捷键 |
|---|---|
| 按 CPU 使用率排序 | P |
| 按内存使用率排序 | M |
| 按 PID 排序 | N |
| 按运行时间排序 | T |
| kill 进程 | k |
| 显示每个 CPU 核心 | 1 |
| 退出 | q |
替代命令也要会:
ps aux --sort=-%cpu | headps aux --sort=-%mem | head面试里可以回答:
如果用 top,可以按
P按 CPU 占用排序,按M按内存占用排序,按1查看每个 CPU 核心的使用情况。如果不用 top,也可以用ps aux --sort=-%cpu | head查看 CPU 占用最高的进程,用ps aux --sort=-%mem | head查看内存占用最高的进程。
网络排障
面试官问了类似“如果 www.baidu.com 访问不了,怎么排查”。
我回答到了换设备、ping、dig 和 DNS,但没有系统化展开,也漏了在线多地域测试。
更完整的排查顺序是:
确认故障范围
先判断:
- 只有本机访问不了,还是同一网络都不行;
- 是所有网站都不行,还是只有这个域名不行;
- 手机热点是否正常;
- 不同浏览器是否正常。
检查本机网络
ip addrip routeping 网关IPping 8.8.8.8如果网关不通,优先查本地网络。如果公网 IP 通但域名不通,重点查 DNS。
检查 DNS
nslookup www.baidu.comdig www.baidu.comcat /etc/resolv.conf检查 HTTP / HTTPS
curl -I https://www.baidu.comcurl -v https://www.baidu.com这里可以判断是 TCP 连不上、TLS 握手失败,还是 HTTP 层返回异常。
检查链路
traceroute www.baidu.commtr www.baidu.com如果怀疑地域或运营商问题,可以使用在线 ping、在线 DNS 或站长工具,从不同地区测试访问情况。
更好的面试回答:
我会先确认故障范围,是本机问题、局域网问题、运营商问题还是目标站点问题。本机侧先测网关和公网 IP 连通性,如果 IP 能通但域名不通,就重点查 DNS,用 dig 或 nslookup 看解析结果。如果 DNS 正常,再用 curl -v 看 HTTPS 连接过程,确认是 TCP、TLS 还是 HTTP 层问题。如果怀疑地域或运营商问题,可以用在线 ping、在线 DNS 或站长工具做多地区测试。
查看端口对应服务
面试官问如何查看某个端口上运行了什么服务。
我答了:
lsof -i:80面试官补充了 ss。
新系统里更推荐先用 ss:
ss -lntpss -lntp | grep :80也可以用:
lsof -i:80netstat -lntp回答可以更简洁:
我一般用
ss -lntp查看当前监听的 TCP 端口和对应进程,也可以用lsof -i:端口号查看某个端口被哪个进程占用。现在新系统里更推荐用ss。
Docker 数据持久化
面试官问 Docker 的两种数据存储方式,以及区别。
常见答案是:
- volume;
- bind mount。
Volume
Volume 是 Docker 管理的数据卷,适合保存数据库、应用数据这类需要持久化的数据。
特点:
- 由 Docker 管理;
- 默认存放在
/var/lib/docker/volumes/; - 适合容器持久化数据;
- 迁移和备份相对方便;
- 与宿主机目录结构耦合较低。
示例:
docker run -v mydata:/data nginxBind mount
Bind mount 是把宿主机上的具体目录挂载进容器。
特点:
- 使用宿主机真实路径;
- 适合挂载配置文件、源码目录、日志目录;
- 和宿主机目录强绑定;
- 更容易遇到权限问题;
- 容器内用户 UID / GID 与宿主机文件属主不一致时,可能导致读写失败;
- 挂错路径或权限过大时有安全风险。
示例:
docker run -v /host/path:/container/path nginx对比:
| 对比项 | Volume | Bind mount |
|---|---|---|
| 管理方 | Docker 管理 | 用户指定宿主机路径 |
| 默认位置 | /var/lib/docker/volumes/ | 任意宿主机目录 |
| 适合场景 | 数据持久化 | 配置文件、源码、日志挂载 |
| 可移植性 | 较好 | 依赖宿主机路径 |
| 权限问题 | 相对少 | 更容易出现 UID / GID 权限问题 |
| 安全性 | 相对可控 | 挂载敏感路径有风险 |
面试里可以这样说:
Docker 常见的数据持久化方式主要是 volume 和 bind mount。Volume 是 Docker 管理的数据卷,适合保存数据库、应用数据,迁移和管理相对方便。Bind mount 是把宿主机指定目录直接挂载到容器里,适合配置文件、源码或日志目录,但它和宿主机路径强相关,也更容易遇到文件权限问题,比如容器内运行用户的 UID / GID 和宿主机文件属主不一致,可能导致容器无法读写。
Shell 脚本
这部分我当时表达得不够准确,容易让人理解成“Shell 命令也不熟”。
实际情况应该拆开说:
- 单条命令和常见命令组合有基础;
- 完整 Shell 脚本组织能力还需要补;
- 复杂脚本可以借助 Agent,但必须自己审查命令含义和执行风险。
更合适的表达是:
Shell 单条命令和常见命令组合我有一定基础,比如日志筛选、进程查看、磁盘检查、服务状态查看这些都能用。但我完整写 Shell 脚本的经验还不多,目前主要在补变量、判断、循环、函数、错误处理和脚本规范。
如果是实际运维场景,我一般会先把核心命令跑通,再逐步封装成脚本,比如加阈值判断、日志输出、退出码和定时任务。复杂脚本我也会借助 Agent 辅助生成,但会自己检查命令含义、执行路径、权限风险和是否有误删风险,不会直接复制到生产环境执行。
后续重点补这些内容:
- 变量和参数;
if判断;for/while循环;- 函数封装;
- 日志输出;
- 退出码;
set -euo pipefail;- cron 定时任务;
- 文件路径和权限风险。
基础命令也要熟:
df -hdf -idu -sh *systemctl status nginxsystemctl is-active nginxjournalctl -u nginxawk '{print $1}' access.log | sort | uniq -c | sort -nr | headfind /data/backup -mtime +7 -deleteKubernetes
面试官也问到了 Kubernetes。
我当时说还在学习中,但其实一些基础概念之前接触过,只是临场没有展开。
后续可以准备一个诚实但不空的回答:
Kubernetes 我目前还在学习和实践阶段,接触过 k3s、Pod、Deployment、Service、Ingress、Helm 和 Prometheus 监控相关内容。虽然还没有生产级经验,但理解它的基本作用是对容器进行编排、调度、服务发现、滚动更新、扩缩容和故障自愈。
基础概念要能说清:
| 概念 | 作用 |
|---|---|
| Pod | Kubernetes 中最小调度单位,一个 Pod 里可以有一个或多个容器 |
| Deployment | 管理 Pod 副本数量、滚动更新和回滚 |
| Service | 给一组 Pod 提供稳定访问入口 |
| Ingress | 提供 HTTP / HTTPS 外部访问入口,通常配合域名使用 |
| ConfigMap | 保存非敏感配置 |
| Secret | 保存密码、token、证书等敏感信息 |
| Namespace | 隔离不同项目或环境 |
| Helm | Kubernetes 的包管理工具,用 chart 部署复杂应用 |
简答模板:
Kubernetes 是容器编排平台,用于管理容器的部署、调度、扩缩容、服务发现、滚动更新和故障自愈。Pod 是最小调度单位,Deployment 管理 Pod 副本和滚动更新,Service 给 Pod 提供稳定访问入口,Ingress 暴露 HTTP / HTTPS 服务,ConfigMap 和 Secret 管理配置。我目前接触过 k3s、Helm、Service、Deployment 和 Prometheus 监控,还没有生产级经验,但这是我后续重点补强方向。
这次暴露的问题
这场面试暴露出一个核心问题:
真实实践不少,但表达还不够工程化、规范化。
具体包括:
- 项目上线流程说得太草率,容易被认为不懂生产规范;
- Watchtower 自动更新没有主动说明风险;
- 备份和回滚没有讲清对象、策略和恢复验证;
top、ss、Docker 权限差异等基础点答得不完整;- Kubernetes 本来接触过,但没有在面试中展开;
- Shell 需要补到能读懂和修改常见运维脚本。
优势也有:
- 有 PVE 和虚拟化环境;
- 有 Linux、Docker、Nginx 实践;
- 能讲出真实排障经历;
- 对运维方向兴趣明确;
- 能承认不足并复盘;
- 面试官对 Agent 辅助脚本并不排斥。
后续复习优先级
1. 上线、备份与回滚
优先补:
- CI / CD;
- 镜像版本管理;
- 发布前备份;
- 回滚策略;
- Watchtower 风险;
- token 和密钥管理;
- 数据库备份与恢复测试。
2. Linux 基础命令
需要熟悉:
topps aux --sort=-%cpups aux --sort=-%memss -lntplsof -i:端口journalctl -u 服务名df -hdf -idu -sh *3. Docker 数据持久化
重点补:
- volume;
- bind mount;
- 匿名卷;
- 命名卷;
- UID / GID 权限问题;
- 数据卷备份;
- 容器日志清理。
4. Nginx
重点补:
- 静态资源;
- 反向代理;
- 负载均衡;
- HTTPS;
- upstream;
- access.log;
- error.log;
nginx -t;systemctl reload nginx。
5. Kubernetes
重点补:
- Pod;
- Deployment;
- Service;
- Ingress;
- ConfigMap;
- Secret;
- Namespace;
- Helm;
- k3s;
- Prometheus 监控。
总结
这次一面说明,我已经有一定运维入门实践,但还需要把经验从“我自己搭过、用过、踩过坑”,升级成“我理解规范流程、风险控制和企业级运维思路”。
后续准备运维面试,不能只背命令,还要能回答:
- 为什么这样做;
- 有什么风险;
- 如何回滚;
- 如何备份;
- 如何验证;
- 如何保证安全;
- 如何写进文档;
- 如何让团队可维护。
这些才是运维岗位真正关心的部分。