4187 字
21 分钟

运维工程师一面复盘:上线流程、Docker 与 Linux 基础

这篇记录来自一次运维工程师一面。公司名这里打码,称为“某教育信息化公司”。

这场面试给我的感觉是:面试官不只问概念,更关心我到底有没有真实部署、排障和上线经历。只要回答偏泛,就会继续追问上线流程、安全性、备份、恢复、权限和规范。

面试方向#

这次主要围绕几个方向展开:

  1. 个人 PVE 环境和 Linux 发行版选择;
  2. 实习项目里的服务部署、镜像构建和上线方式;
  3. Nginx、Docker、Linux 命令和网络排障;
  4. Shell 脚本能力;
  5. Kubernetes 基础概念;
  6. 运维规范、安全、备份和回滚。

面试官比较关注“真实做过什么”。如果只是背命令,或者把个人项目流程说成成熟生产流程,很容易被追问出问题。

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 执行测试和构建,镜像使用明确版本号,先在测试环境验证,生产发布前备份数据库、配置文件和数据卷,发布后检查日志、接口和监控,异常时回滚到上一稳定版本。

这里关键不是“显得很厉害”,而是让面试官看到风险意识和成长过程。

规范上线流程#

后续可以准备一版更工程化的上线流程:

  1. 开发提交代码;
  2. CI 执行测试和构建;
  3. 构建带版本号的镜像;
  4. 推送到镜像仓库;
  5. 测试环境部署验证;
  6. 发布前备份数据库、配置文件和关键数据卷;
  7. 生产环境按明确版本发布;
  8. 检查日志、接口、健康检查和监控;
  9. 如果异常,回滚到上一稳定版本;
  10. 记录变更内容和问题复盘。

如果面试官继续追问 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

替代命令也要会:

Terminal window
ps aux --sort=-%cpu | head
ps 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 访问不了,怎么排查”。

我回答到了换设备、pingdig 和 DNS,但没有系统化展开,也漏了在线多地域测试。

更完整的排查顺序是:

确认故障范围#

先判断:

  • 只有本机访问不了,还是同一网络都不行;
  • 是所有网站都不行,还是只有这个域名不行;
  • 手机热点是否正常;
  • 不同浏览器是否正常。

检查本机网络#

Terminal window
ip addr
ip route
ping 网关IP
ping 8.8.8.8

如果网关不通,优先查本地网络。如果公网 IP 通但域名不通,重点查 DNS。

检查 DNS#

Terminal window
nslookup www.baidu.com
dig www.baidu.com
cat /etc/resolv.conf

检查 HTTP / HTTPS#

Terminal window
curl -I https://www.baidu.com
curl -v https://www.baidu.com

这里可以判断是 TCP 连不上、TLS 握手失败,还是 HTTP 层返回异常。

检查链路#

Terminal window
traceroute www.baidu.com
mtr www.baidu.com

如果怀疑地域或运营商问题,可以使用在线 ping、在线 DNS 或站长工具,从不同地区测试访问情况。

更好的面试回答:

我会先确认故障范围,是本机问题、局域网问题、运营商问题还是目标站点问题。本机侧先测网关和公网 IP 连通性,如果 IP 能通但域名不通,就重点查 DNS,用 dig 或 nslookup 看解析结果。如果 DNS 正常,再用 curl -v 看 HTTPS 连接过程,确认是 TCP、TLS 还是 HTTP 层问题。如果怀疑地域或运营商问题,可以用在线 ping、在线 DNS 或站长工具做多地区测试。

查看端口对应服务#

面试官问如何查看某个端口上运行了什么服务。

我答了:

Terminal window
lsof -i:80

面试官补充了 ss

新系统里更推荐先用 ss

Terminal window
ss -lntp
ss -lntp | grep :80

也可以用:

Terminal window
lsof -i:80
netstat -lntp

回答可以更简洁:

我一般用 ss -lntp 查看当前监听的 TCP 端口和对应进程,也可以用 lsof -i:端口号 查看某个端口被哪个进程占用。现在新系统里更推荐用 ss

Docker 数据持久化#

面试官问 Docker 的两种数据存储方式,以及区别。

常见答案是:

  • volume;
  • bind mount。

Volume#

Volume 是 Docker 管理的数据卷,适合保存数据库、应用数据这类需要持久化的数据。

特点:

  • 由 Docker 管理;
  • 默认存放在 /var/lib/docker/volumes/
  • 适合容器持久化数据;
  • 迁移和备份相对方便;
  • 与宿主机目录结构耦合较低。

示例:

Terminal window
docker run -v mydata:/data nginx

Bind mount#

Bind mount 是把宿主机上的具体目录挂载进容器。

特点:

  • 使用宿主机真实路径;
  • 适合挂载配置文件、源码目录、日志目录;
  • 和宿主机目录强绑定;
  • 更容易遇到权限问题;
  • 容器内用户 UID / GID 与宿主机文件属主不一致时,可能导致读写失败;
  • 挂错路径或权限过大时有安全风险。

示例:

Terminal window
docker run -v /host/path:/container/path nginx

对比:

对比项VolumeBind 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 定时任务;
  • 文件路径和权限风险。

基础命令也要熟:

Terminal window
df -h
df -i
du -sh *
systemctl status nginx
systemctl is-active nginx
journalctl -u nginx
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head
find /data/backup -mtime +7 -delete

Kubernetes#

面试官也问到了 Kubernetes。

我当时说还在学习中,但其实一些基础概念之前接触过,只是临场没有展开。

后续可以准备一个诚实但不空的回答:

Kubernetes 我目前还在学习和实践阶段,接触过 k3s、Pod、Deployment、Service、Ingress、Helm 和 Prometheus 监控相关内容。虽然还没有生产级经验,但理解它的基本作用是对容器进行编排、调度、服务发现、滚动更新、扩缩容和故障自愈。

基础概念要能说清:

概念作用
PodKubernetes 中最小调度单位,一个 Pod 里可以有一个或多个容器
Deployment管理 Pod 副本数量、滚动更新和回滚
Service给一组 Pod 提供稳定访问入口
Ingress提供 HTTP / HTTPS 外部访问入口,通常配合域名使用
ConfigMap保存非敏感配置
Secret保存密码、token、证书等敏感信息
Namespace隔离不同项目或环境
HelmKubernetes 的包管理工具,用 chart 部署复杂应用

简答模板:

Kubernetes 是容器编排平台,用于管理容器的部署、调度、扩缩容、服务发现、滚动更新和故障自愈。Pod 是最小调度单位,Deployment 管理 Pod 副本和滚动更新,Service 给 Pod 提供稳定访问入口,Ingress 暴露 HTTP / HTTPS 服务,ConfigMap 和 Secret 管理配置。我目前接触过 k3s、Helm、Service、Deployment 和 Prometheus 监控,还没有生产级经验,但这是我后续重点补强方向。

这次暴露的问题#

这场面试暴露出一个核心问题:

真实实践不少,但表达还不够工程化、规范化。

具体包括:

  1. 项目上线流程说得太草率,容易被认为不懂生产规范;
  2. Watchtower 自动更新没有主动说明风险;
  3. 备份和回滚没有讲清对象、策略和恢复验证;
  4. topss、Docker 权限差异等基础点答得不完整;
  5. Kubernetes 本来接触过,但没有在面试中展开;
  6. Shell 需要补到能读懂和修改常见运维脚本。

优势也有:

  • 有 PVE 和虚拟化环境;
  • 有 Linux、Docker、Nginx 实践;
  • 能讲出真实排障经历;
  • 对运维方向兴趣明确;
  • 能承认不足并复盘;
  • 面试官对 Agent 辅助脚本并不排斥。

后续复习优先级#

1. 上线、备份与回滚#

优先补:

  • CI / CD;
  • 镜像版本管理;
  • 发布前备份;
  • 回滚策略;
  • Watchtower 风险;
  • token 和密钥管理;
  • 数据库备份与恢复测试。

2. Linux 基础命令#

需要熟悉:

Terminal window
top
ps aux --sort=-%cpu
ps aux --sort=-%mem
ss -lntp
lsof -i:端口
journalctl -u 服务名
df -h
df -i
du -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 监控。

总结#

这次一面说明,我已经有一定运维入门实践,但还需要把经验从“我自己搭过、用过、踩过坑”,升级成“我理解规范流程、风险控制和企业级运维思路”。

后续准备运维面试,不能只背命令,还要能回答:

  • 为什么这样做;
  • 有什么风险;
  • 如何回滚;
  • 如何备份;
  • 如何验证;
  • 如何保证安全;
  • 如何写进文档;
  • 如何让团队可维护。

这些才是运维岗位真正关心的部分。

运维工程师一面复盘:上线流程、Docker 与 Linux 基础
https://blog.yangyus8.top/posts/ops-interview-review-linux-docker-release/
作者
杨与S8
发布于
2026-06-30
许可协议
CC BY-NC-SA 4.0

评论