模拟面试 18 题复盘(CloudLab 项目实战版)
定位:基于 CloudLab 真实项目的一轮完整模拟面试,含开场话术、题目、标准答案、答题要点与个人薄弱点
日期:2026-10-22 · 形式:面试官提问 → 我作答 → 即时点评
配套:基础题见《Linux运维面试题整理》,运维通识见《运维基础概念》
〇、答题情况自评
强项(答得有底气):
- 文件权限、软/硬链接
- 容器/数据卷、Shell 脚本、Prometheus
- CloudLab 项目讲解
短板(需重点复习):
- HTTP 状态码分类(一开始记反了:3xx 是重定向、4xx 客户端、5xx 服务器)
- df/du、LVM、RAID
- 防火墙(iptables/firewalld)
- MySQL 索引/EXPLAIN
一、面试开场
1. 自我介绍(1 分钟,约 200 字)
面试官您好,我叫唐俊豪,2025 年毕业于佛山大学智能科学与技术专业,求职方向是 Linux 运维。我对运维很感兴趣,毕业后自己在一台云服务器上,用 Docker 从零搭建了一个多服务的自托管平台,包括网关、监控、密码管理、云盘这些,部署、配置和排错都是我独立完成的。之前我还在北京三维天地做过 ERP 实施实习,有驻场和客户沟通的经验。我学习能力比较强,也能踏实做事,希望能找一个运维岗位稳定下来,从基础做起,慢慢成长。
要点:读几遍改成自己的口气,能不看稿说出大意即可,不用逐字背。
2. CloudLab 项目讲解(3 分钟)
按这个顺序讲:
- 开场:"毕业后在华为云买了一台 2核2G 的服务器,用 Docker 搭了 7 个服务,把运维常用的东西都实际跑了一遍。"
- 架构:"最外面是 Nginx Proxy Manager,统一入口、子域名分流、负责 HTTPS;后面有 Vaultwarden、Uptime Kuma、Prometheus+Grafana、Alist、Halo,都用 Docker Compose 编排。"
- 亮点:
- 证书:HTTP 验证失败,改 DNS 验证(阿里云 DNS 接口)成功签发;
- 监控:两层(Prometheus+Node Exporter 主机指标,Uptime Kuma 探活),"对外走公网、对内走内网";
- 备份:Shell 脚本打包配置和数据卷,crontab 每天跑。 - 踩坑:"内存只有 2G,Halo 是 Java 服务吃内存,限制 JVM 堆和容器内存、加 1G swap 才稳定;还处理了防火墙和 Docker 冲突、镜像加速。"
- 收获:"完整走了部署、配置、监控、排错、备份全流程,证书验证、内存优化这些不自己踩一遍记不牢。"
二、容器与 Docker(第 1-4 题)
第 1 题:容器 vs 虚拟机
本质区别(关键词):
- 虚拟机:虚拟化硬件,每台有独立的 Guest OS 和内核;
- 容器:共享宿主机内核,只隔离进程和运行环境。
| 维度 | 虚拟机 | 容器 |
|---|---|---|
| 内核/系统 | 独立 Guest OS | 共享宿主机内核 |
| 启动 | 分钟级 | 秒级(本质是进程) |
| 体量 | 几 GB~几十 GB | 几 MB~几百 MB |
| 隔离性 | 强 | 相对弱 |
底层原理(加分):
- Namespace(命名空间):负责隔离(PID、网络、文件系统等);
- Cgroups(控制组):限制 CPU/内存。
我的答题情况:资源开销、环境隔离、可复制性都答到了,但漏了"共享内核"这个最关键的词。
第 2 题:Docker 网络模式
| 模式 | 说明 |
|---|---|
| bridge(默认) | docker0 网桥,容器拿内网 IP,外部访问靠 -p 端口映射 |
| host | 直接用宿主机网络,不用 -p |
| none | 无网络,只有 lo |
| container | 与另一个容器共享网络 |
Compose 网络(重点):
- docker-compose 启动多服务时,自动建一个自定义 bridge 网络,内置 DNS;
- 容器间可直接用"服务名"互访(如 NPM 填 halo:8090)。
我的项目实际情况:
- 每个服务独立 compose → 各自独立网络、互相隔离;
- 所以 NPM 无法直接用服务名,改用 172.17.0.1(docker0 网关)+ 端口映射绕路:
NPM 容器 → 172.17.0.1:8090(宿主机)→ 端口映射 → halo 容器
第 3 题:外部共享网络(怎么改)
① 建外部网络:
docker network create cloudlab
② 每个 compose 声明加入:
services:
halo:
image: halohub/halo:latest
networks:
- cloudlab
networks:
cloudlab:
external: true
③ NPM 配置:
- Forward Hostname 填服务名/容器名(如 halo);
- Forward Port 填容器内部端口(Halo 8090、Vaultwarden 80、Alist 5244,不是宿主映射端口)。
走容器名后,后端可不做
-p映射,只给 NPM 保留 80/443。理解即可,真要改等入职后或有空再弄,别借"优化项目"占投递时间。
第 4 题:数据持久化(Volume vs Bind mount)
数据能放三个地方:
- 容器可写层:不挂载时,容器删除数据即失;
- Volume(数据卷):独立于容器,由 Docker 管理(
/var/lib/docker/volumes/),容器删除卷还在; - Bind mount(绑定挂载):挂宿主机指定目录(
-v /宿主路径:/容器路径),数据是宿主机普通文件。
| Volume | Bind mount | |
|---|---|---|
| 位置 | Docker 管理 | 用户指定宿主机路径 |
| 管理 | docker volume |
普通目录操作 |
| 容器删除 | 卷保留 | 目录保留 |
| 适合 | 数据库、应用数据 | 配置文件、源码 |
我的项目:
monitor_grafana-data、monitor_prometheus-data是 named volume,独立于容器,所以能单独打包备份。
易错点:我一开始说"数据卷容器删除就消失",说反了——消失的是容器可写层,不是数据卷。
三、排查与进程(第 5、11 题)
第 5 题:服务器卡顿 / 服务慢排查
核心方法论:先整体后局部,先定位瓶颈层(CPU/内存/磁盘/网络)再深入,同时第一时间看日志。
- 整体负载:
-uptime:load average(1/5/15 分钟),对比 CPU 核数;
-top:load、%Cpu(s)、内存,按P/M排序。 - CPU:
%us(用户态高=程序吃 CPU)、%wa(iowait 高=瓶颈在 IO)。 - 内存:
-free -h:看 available(不是 free,buff/cache 可回收);
-dmesg | grep -i oom:看 OOM Killer。 - 磁盘:
-df -h:空间是否满;df -i:inode 是否满(高频故障);
-iostat -x 1:%util、await。 - 网络:
ss -tlnp(端口监听、连接数);ping、mtr、curl -I。 - 日志:
journalctl -xe、/var/log/messages、应用日志。
测试磁盘读写别轻易用
dd写盘(生产环境风险),用 iostat 观察,专业压测用fio且在维护窗口。
第 11 题:进程管理
查看进程:
- ps -ef:标准格式,PPID 看父子关系;
- ps aux:%CPU、%MEM、STAT 状态;
- STAT:R 运行、S 可中断睡眠、D 不可中断睡眠(等 IO)、Z 僵尸、T 停止;
- ps aux --sort=-%cpu | head:按 CPU 排序。
kill 信号:
- kill PID 默认 15(SIGTERM):优雅退出;
- kill -9(SIGKILL):强制杀,不可捕获,可能丢数据,最后手段;
- kill -1(SIGHUP):重载配置;
- 顺序:先 15 后 9。
僵尸进程:
- 子进程退出、父进程没回收(没 wait),停在 Z 状态;
- 不占 CPU/内存,但占 PID 和进程表项,大量会耗尽 PID;
- 不能直接 kill,要处理父进程(父死后被 systemd 收养回收)。
后台运行:
- &:后台但受终端控制;
- nohup command > out.log 2>&1 &:忽略 SIGHUP,关终端继续;
- Ctrl+Z 暂停,jobs/fg/bg;
- 更现代:screen/tmux;生产用 systemd/Docker。
四、网络(第 6、12、16 题)
第 6 题:输入 URL 到页面显示全过程
- DNS 解析:
- 浏览器缓存 → 系统缓存(hosts)→ 本地 DNS(递归);
- 本地 DNS 依次问:根 → 顶级域(.cloud)→ 权威 DNS(阿里云);
- 我的项目:cloud321.cloud 权威在阿里云,泛解析到服务器 IP。 - TCP 三次握手。
- TLS 握手(HTTPS,重点):
- 协商加密套件、服务器返回证书、客户端验证证书、交换会话密钥;
- 之后 HTTP 加密;我项目里申请了证书、用 DNS 验证,必须能讲 TLS。 - 发 HTTP 请求:请求行 +
Host头(vault.cloud321.cloud)。 - 服务端处理:请求先到 NPM(网关,443),按 Host 子域名反代到对应容器。
- 浏览器渲染:HTML→DOM、CSS→CSSOM、渲染树→布局→绘制;断开(四次挥手)。
第 12 题:常见端口 + HTTP 状态码
常见端口:
| 端口 | 服务 |
|---|---|
| 22 | SSH(不是 SSL) |
| 80 / 443 | HTTP / HTTPS |
| 3306 | MySQL |
| 6379 | Redis |
| 8080 | HTTP 备用(不是数据库) |
补充:53 DNS、21 FTP、25 SMTP、110 POP3、143 IMAP。
状态码分类(我一开始记反了):
- 2xx 成功;3xx 重定向;4xx 客户端错误;5xx 服务器错误。
常见码:
- 200 成功;301 永久重定向;302 临时重定向;
- 400 请求错误;401 未认证;403 禁止;404 不存在(不是后端挂了);
- 500 内部错误;
- 502 网关错误(后端挂了/端口没监听);
- 503 服务不可用(过载/维护);
- 504 网关超时(后端太慢)。
502/503/504 记忆:502 后端挂了、503 忙不过来、504 后端太慢。
第 16 题:TCP 握手/挥手 + 端口排查
三次握手:
1. 客户端 → 服务器:SYN(SYN_SENT);
2. 服务器 → 客户端:SYN+ACK(SYN_RCVD);
3. 客户端 → 服务器:ACK(ESTABLISHED)。
为什么三次:确认双方收发能力;两次无法确认客户端收到;防止失效历史连接。
四次挥手:
1. 主动方 → 被动方:FIN(FIN_WAIT_1);
2. 被动方 → 主动方:ACK(CLOSE_WAIT,主动方 FIN_WAIT_2);
3. 被动方发完 → 主动方:FIN(LAST_ACK);
4. 主动方 → 被动方:ACK(TIME_WAIT,等 2MSL 关闭)。
为什么四次:TCP 全双工,两方向分别关闭;收到 FIN 时可能还有数据要发,先 ACK 后 FIN,不能合并。
TIME_WAIT(2MSL):保证最后 ACK 可重传;让旧连接滞留报文消散。
端口连不上排查:
1. ss -tlnp 看服务是否监听;
2. 监听地址:127.0.0.1(只本机)vs 0.0.0.0(对外);
3. 本机 nc -zv 127.0.0.1 端口;
4. 防火墙 iptables/firewalld;
5. 云安全组;
6. ping/mtr。
五、Nginx(第 7 题)
第 7 题:反向代理 / 负载均衡
反向代理:客户端请求发给代理,由代理转发给后端,客户端不知道真正后端。
正向 vs 反向:
- 正向代理:代理客户端(如 VPN),服务器不知道客户端;
- 反向代理:代理服务端(如 NPM),客户端不知道后端。
作用:统一入口、隐藏后端、SSL 终止(证书装在 NPM)、负载均衡、缓存压缩。
负载均衡算法:
| 算法 | 说明 |
|---|---|
| 轮询 round-robin | 默认,依次分配 |
| 加权轮询 weight | 性能好的多分 |
| ip_hash | 按客户端 IP 哈希,会话保持 |
| least_conn | 发给连接数最少的 |
底层是 Nginx 的 upstream 块。
关系:负载均衡是反向代理的功能之一;单后端只做转发,多后端才谈负载均衡。
六、Shell(第 9 题)
第 9 题:Shell 结构 + crontab
脚本结构:
- 开头 #!/bin/bash(shebang);
- 代码体;
- 生产脚本开头加 set -euo pipefail。
crontab 格式:分 时 日 月 周 命令
- 我的备份:30 3 * * * /opt/cloudlab/backup/backup.sh;
- 常见:*/5 * * * *、0 9 * * 1-5。
常见坑:
1. PATH 精简(只有 /usr/bin:/bin)→ 命令用绝对路径或脚本开头 export PATH;
2. 任务重叠 → flock -n /tmp/lock;
3. 日志膨胀 → >> 追加 + logrotate;
4. 相对路径 → 用绝对路径或开头 cd;
5. 输出不处理会发邮件 → >/dev/null 2>&1。
七、监控(第 10 题)
第 10 题:Prometheus 原理
Pull 模型:Prometheus Server 主动按周期(scrape_interval)去各目标抓取指标。
Exporter:
- 跑在被监控机器上的小程序,采集指标并暴露 /metrics,被动等 Prometheus 拉;
- 不是 push 模型;
- Node Exporter:9100 端口,采集主机指标。
Pushgateway:
- 短生命周期任务主动 push 给 Pushgateway,Prometheus 再拉;
- 这才是 push。
数据链路:
1. Node Exporter 暴露 9100/metrics;
2. Prometheus 按 prometheus.yml 的 scrape_configs 周期 pull;
3. 存入 TSDB(时序数据库),用 PromQL 查询;
4. Grafana 配 Prometheus 为数据源,渲染图表。
八、数据库(第 13 题)
第 13 题:MySQL
索引:
- 类似书的目录,底层主要是 B+树(O(log n));
- 没索引要全表扫描(O(n));
- 代价:占空间、拖慢写入,不是越多越好;
- 分类:主键、普通、唯一、联合索引。
慢 SQL 排查:
- EXPLAIN(核心):
- type:ALL 是全表扫描;
- key:NULL 没走索引;
- rows:扫描行数;
- Extra:Using filesort/Using temporary 危险;
- 慢查询日志:slow_query_log=ON、long_query_time=1;
- show full processlist:看运行中的 SQL、锁等待;
- 索引失效:对索引列用函数、like '%xx' 左模糊、隐式类型转换、不满足最左前缀。
连接命令:
- mysql -u root -p(回车输密码);远程加 -h -P;
- show databases;(有 s);
- 先 use 库名; 才能 show tables;;
- desc 表名;;
- 建用户/授权:
create user 'user'@'localhost' identified by '密码';
grant all on db.* to 'user'@'localhost';
flush privileges;
九、文件与文本处理(第 14 题)
第 14 题:find/grep/awk/sed + 链接
find:-name、-type f/d、-size +100M、-mtime -7;-exec rm {} \;(慎用)。
grep:-r、-i、-n、-v、-E。
awk:$1 第一列、$0 整行、NF 列数、NR 行号;-F: 指定分隔符。
sed:s/old/new/g 替换;-i 直接改文件(先预览);-n '1,10p' 打印行。
软/硬链接:
- 软链接(ln -s):独立 inode,存路径,源文件删了失效,可跨文件系统/目录,像快捷方式;
- 硬链接(ln):同 inode,链接数归零才删除,不跨文件系统;
- ls -i 看 inode。
十、服务与存储(第 15、17 题)
第 15 题:systemctl / systemd
常用命令:
- start/stop/restart/reload/status;
- enable/disable(开机自启);
- daemon-reload;list-units --type=service。
看日志:journalctl
- -u 服务名;-f 实时;--since;-xe。
systemd vs init:
- CentOS 7 前(SysVinit,service):串行启动,shell 脚本;
- CentOS 7 后(systemd):并行启动,unit 文件,依赖管理,自动重启,集成 journald,cgroups;
- 现在 service 是兼容包装。
unit 文件(/etc/systemd/system/xxx.service):
[Unit]
Description=My Service
After=network.target
[Service]
ExecStart=/opt/app/start.sh
Restart=always
[Install]
WantedBy=multi-user.target
改完 systemctl daemon-reload && systemctl enable --now xxx。
第 17 题:存储(df/du、LVM、RAID)
df vs du:
- df:整个文件系统容量(-h);df -i 看 inode;
- du:目录/文件大小(-sh)。
df 满但 du 没那么大:
- 最经典:文件被删但进程还占用 → lsof | grep deleted,重启进程释放;
- 挂载点覆盖;inode 耗尽。
LVM:
- PV(物理卷)→ VG(卷组)→ LV(逻辑卷);
- 好处:加盘进 VG,给 LV 在线扩容,不丢数据;支持快照。
RAID:
| 级别 | 最少盘 | 容量 | 特点 |
|---|---|---|---|
| RAID 0 | 2 | 全部 | 最快,一块坏全丢 |
| RAID 1 | 2 | 50% | 镜像,可坏一块 |
| RAID 5 | 3 | n-1 | 校验,可坏一块,常用 |
| RAID 10 | 4 | 50% | 又快又安全,贵 |
十一、防火墙(第 18 题)
第 18 题:iptables / firewalld
iptables 四表:
- filter(过滤,默认)、nat(地址转换)、mangle(改标记)、raw(豁免追踪)。
五链:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING。
实用命令:
- 查看:iptables -L -n --line-numbers;
- 放行:iptables -I INPUT -p tcp --dport 8080 -j ACCEPT;
- 动作:ACCEPT/DROP/REJECT;
- 删除:iptables -D INPUT 序号;
- iptables-save 保存。
firewalld:
- firewall-cmd --list-all;
- --add-port=8080/tcp(--permanent 永久,--reload);
- --add-service=http。
Docker 与防火墙(重点):
- Docker 靠 iptables 实现网络:
- -p 端口映射靠 nat 表 DNAT;
- 容器上网靠 MASQUERADE(SNAT);
- 容器间转发靠 FORWARD 和 DOCKER 链;
- 所以 Docker 一启动,iptables 多出 DOCKER 链;
- 冲突:手动 iptables -F 或 firewalld 可能误删 Docker 规则;
- 正确:自定义规则加到 DOCKER-USER 链(Docker 不清空,最先执行)。
复习清单(按优先级)
必补短板:
1. HTTP 状态码分类 + 502/503/504;
2. df/du、LVM、RAID;
3. iptables/firewalld、DOCKER-USER;
4. MySQL EXPLAIN、索引。
保持强项:权限、链接、容器/数据卷、Shell、Prometheus、项目讲解。
原则:会用、能举例,不死背理论;重心回到投递,面试前过一遍,临场自然答得出来。
🔗 相关笔记
- Linux运维面试题整理
- nginx01 综合项目实战笔记
评论