1.5 容器相关面试题

📅 2026/6/24 8:03:46
1.5 容器相关面试题
这三个工具是云原生和微服务时代的“铁三角”分别解决了**“怎么打包”、“怎么调度”、“怎么观测”**这三个核心问题。面试官通过这个问题能快速判断你是否具备生产级系统的部署思维。结合你之前的大模型LLM / Agent背景我来给你拆解清楚并附上面试中的“AI 视角”加分回答。1. Docker容器化——“标准化集装箱”它是干什么的把代码、运行环境Python 依赖、模型权重、配置文件打包成一个轻量级的、可移植的“容器”。它解决了“在我机器上能跑在你机器上跑不了”的千古难题。本质利用 Linux 的 Namespace隔离和 Cgroups资源限制技术实现进程级的隔离。AI 场景中的应用把你的 FastAPI 智能体服务打包成镜像。把带有依赖的 Chroma / Milvus 向量数据库打包。当你需要加载 10GB 的嵌入模型时Docker 可以限定该容器内存上限避免因内存溢出OOM拖垮宿主机。2. Kubernetes / K8s容器编排——“集装箱调度指挥官”它是干什么的当你的机器从 1 台变成 100 台Docker 就管不过来了。K8s 负责自动部署、弹性伸缩、故障自愈和服务发现。核心能力高频考点PodK8s 的最小调度单位一个 Pod 里可以运行一个或多个 Docker 容器。HPA水平自动伸缩根据 CPU 使用率或自定义指标如队列长度自动增加或减少 Pod 数量。自愈如果 Agent 服务挂了K8s 会自动重启它。AI 场景中的应用面试重点GPU 调度通过nvidia.com/gpu资源申明K8s 能将推理任务调度到带 GPU 的节点上。金丝雀发布升级智能体时先让新版本承接 5% 的流量验证无问题后再全量切换避免新版的 Prompt 调整导致大面积报错。3. Prometheus普罗米修斯——“监控与报警眼睛”它是干什么的它是一个指标采集和时序数据库TSDB。它会定期比如每 15 秒去你的服务里拉取Pull指标并存储下来。核心概念高频考点Metrics指标比如http_requests_total请求总数、llm_token_usageToken 消耗量。Pull 模型服务方需要暴露一个/metrics接口Prometheus 主动来抓取而不是服务方上报Push。AlertManager当指标异常时如 Agent 的 500 错误率超过 10%发送告警到钉钉、邮件或电话。AI 场景中的应用面试亮点监控 GPU 显存如果你的 Agent 用了开源模型进行本地推理Prometheus 结合dcgm-exporter可以监控 GPU 温度、显存占用率。Token 消耗计费可以在 Agent 代码里暴露token_consumed_total用 Prometheus 统计每天花费了多少 API 费用。️ 它们是怎么协同工作的必答逻辑链面试时你最好能画出这个“生命周期”开发期你写好了 Python 智能体代码。构建期用Docker把代码 环境打包成一个镜像docker build -t my-agent:v1。部署期把这个镜像地址告诉KubernetesK8s 拉取镜像并启动容器Pod。运行期当用户请求量暴增K8s自动扩展出 10 个 Pod 副本。观测期这些 Pod 上运行的/metrics接口被Prometheus发现实时抓取性能数据。报警期当 10 个 Pod 中有 3 个崩溃了Prometheus检测到可用率下降发送报警。 面试常见追问与“AI 版”加分回答Q1Docker 和虚拟机VM有什么区别答Docker 共享宿主机内核启动毫秒级资源占用 MB 级VM 模拟完整操作系统启动分钟级占用 GB 级。AI 加分项“在大模型训练场景中我们坚决不用虚拟机因为虚拟化层带来的 I/O 损耗对读取大规模权重文件影响非常大Docker 几乎是零损耗。”Q2K8s 的 HPA 在 AI 场景下有什么局限答HPA 基于 CPU/内存扩容但 LLM 服务往往受显存和并发请求数限制。我们可以部署KEDA基于事件驱动的弹性伸缩根据队列深度比如 RabbitMQ 的积压数来提前扩容而不是等 CPU 满了再扩那时候已经超时了。Q3你用过 Prometheus 的哪些指标来优化智能体答我们通过histogram类型指标监控langgraph_node_duration_seconds。发现“向量检索节点”耗时占整个链路的 60%从而促使我们将 Chroma 迁移到了性能更强的 Milvus并启用了 GPU 加速的 IVF-PQ 索引。 一句话总结面试收尾金句Docker 是标准化“打包”K8s 是自动化“管理”Prometheus 是全天候“监控”。这三者构成了现代 AI 应用从开发到上线再到运维的完整闭环。Docker 面试题的核心逻辑是“为什么需要 Docker解决了什么问题→ 怎么构建Dockerfile 优化→ 怎么运行网络/存储/资源→ 怎么保生产安全”。结合你正在做 AI Agent FastAPI 云原生的背景我为你整理了 8 道必考高频题并附带了面试官期待的“加分细节”尤其是关于镜像瘦身和PID 1 信号处理这两点非常容易让面试官眼前一亮。1. Docker 镜像和容器的区别基础必问答题逻辑类比 OOP 编程。镜像Image是一个只读的模板包含了运行应用程序所需的所有代码、依赖库、环境变量和配置文件。相当于“类Class”。容器Container是镜像的运行实例。相当于“对象Object”有生命周期创建、启动、停止、删除。2. Dockerfile 中RUN、CMD、ENTRYPOINT的区别几乎 100% 问这是区分“背题党”和“实战派”的关键特别注意CMD和ENTRYPOINT的组合使用。指令执行时机核心特点能否被docker run覆盖RUN构建镜像时docker build用于安装软件包apt-get、生成文件。❌ 不能CMD容器启动时docker run提供默认的执行命令如python app.py。✅ 能docker run ... /bin/bash会覆盖ENTRYPOINT容器启动时docker run将容器配置为可执行程序。docker run后面追加的参数会作为ENTRYPOINT的参数附加。❌ 需加--entrypoint才能覆盖面试加分金句实战最佳实践“在生产环境中我通常采用ENTRYPOINT CMD组合写法ENTRYPOINT [python, app.py] CMD [--port, 8000]这样既能固定启动程序避免运维误改入口又能允许灵活传入启动参数如docker run ... --port 9000。另外注意CMD必须是 JSON 数组格式[exec]如果写成CMD python app.pyshell 格式会导致应用收不到SIGTERM信号docker stop会卡住 10 秒强制杀死。”3. 什么是 Docker 镜像层Layer如何利用缓存加速构建答题逻辑Dockerfile 每一条指令都会生成一个只读层Layer。docker build时会检查本地缓存如果指令未变且上下文未变则直接复用缓存。黄金规则必须提到“为了最大化利用缓存我会把变化频率低的指令放前面变化频率高的放后面。顺序应该是FROM基础镜像WORKDIRCOPY requirements.txt先拷依赖清单RUN pip install -r requirements.txt这层会被缓存只要依赖不改COPY . .最后拷源码这是变化最频繁的”4.COPY和ADD的区别容易记混指令功能推荐度COPY仅将本地文件复制到镜像中。功能单一、行为透明。✅强烈推荐安全、可预测ADD除了复制还支持自动解压 tar 压缩包以及从URL 下载文件。❌ 不推荐网络下载行为不可控且无法断点续传面试金句“如果只是复制文件永远用COPY。只有明确需要解压本地压缩包时才考虑用ADD。”5. 容器数据持久化Volume卷和 Bind Mount绑定挂载的区别Volume由 Docker 管理存储在宿主机/var/lib/docker/volumes/。最推荐适合生产环境存储数据库数据。Bind Mount映射宿主机任意目录如/home/user/code。适合开发环境代码热更新但安全性较低。面试加分结合你的 AI 项目“在我们的 LangGraph 智能体项目中我使用Bind Mount把本地的./chroma_excel_db向量库持久化目录映射进容器方便我在宿主机直接用 Python 脚本检查向量库状态。而对于 MySQL 或 Redis我用Volume确保容器重启后数据不丢失。”6. 容器网络模式Bridge、Host、Overlay 的区别模式原理适用场景Bridge桥接默认模式。创建虚拟网桥容器间通过 NAT 通信。单机多容器最常用。Host主机容器共享宿主机网络栈没有 IP 转换开销。对网络性能要求极高的场景。Overlay覆盖网络跨多台物理机让不同机器的容器处于同一子网。Kubernetes / Docker Swarm集群通信。7. 如何对 Docker 容器进行资源限制防止容器把宿主机搞崩“我会在docker run时显式限制dockerrun-d\--memory4g\# 硬限制 4GB超了会被 OOM Killer 杀掉--memory-swap4g\# 禁用 swap防止内存不够时用磁盘拖垮性能--cpus2.5\# 限制使用 2.5 个 CPU 核心--restartalways\# 异常退出时自动重启my-agent:v1特别是在 GPU 场景我会用--gpus all配合NVIDIA_VISIBLE_DEVICES环境变量来限定特定显卡防止多个容器争抢显存导致 OOM。”8. 什么是 Docker 多阶段构建Multi-stage Build超级加分项痛点Go、Java 或 Python 编译/安装依赖时需要大量构建工具如gcc导致最终镜像体积达到 1GB。解决方案在 Dockerfile 中声明多个FROM阶段。前一阶段负责“编译/构建”后一阶段只负责“运行”仅复制最终产物。# 阶段1构建大镜像 FROM python:3.11 AS builder COPY requirements.txt . RUN pip install --user -r requirements.txt # 阶段2运行小镜像 FROM python:3.11-slim COPY --frombuilder /root/.local /root/.local COPY ./app /app CMD [python, /app/main.py]面试金句“我们将镜像从1.2GB缩减到了120MB不仅节省了磁盘空间更重要的是极大缩短了 CI/CD 推拉镜像的时间。”9. Docker 容器中的 PID 1 问题与tini的作用高能硬核考点问题容器启动时默认的第一个进程PID 1是你的 Python 进程。在 Linux 中PID 1 有特殊的职责它必须负责回收孤儿进程wait()并响应SIGTERMdocker stop发的信号。如果你的 Python 进程不处理SIGTERMdocker stop会等待10 秒后强制SIGKILL杀进程导致应用来不及优雅下线比如正在写数据库、释放连接池。解决方案在ENTRYPOINT前加上tini或dumb-initRUN apt-get update apt-get install -y tini ENTRYPOINT [/usr/bin/tini, --] CMD [python, app.py]面试金句“在高并发生产环境中优雅停机至关重要。我们强制在基础镜像中集成了tini确保容器能在 2 秒内完成流量摘除、连接池关闭和状态保存。” 结合你背景的实战包装面试开口跪如果面试官问“你在 AI 项目里遇到过什么 Docker 难题”答“我们遇到过大模型依赖包torchtransformers体积过大构建超时的问题。我们用了三招解决1使用nvidia/cuda:12.1-runtime-ubuntu22.04作为基础镜像而不是python:3.11因为后者自带 Python 但不带 CUDA 运行时装了 PyTorch 反而会重复下载 CUDA 库导致镜像从 800MB 膨胀到 6GB。2利用 Docker BuildKit 的--mounttypecache缓存pip包二次构建从 15 分钟缩短到 3 分钟。3针对 LangGraph 这种频繁改动的代码我们开启了docker build --targetbuild只重建变更层CI 流水线速度提升了 70%。”