Docker 与 K8s 题库

这部分你不一定是“平台 owner”,但你一定要准备到:

我知道容器化和编排到底解决什么问题,也知道服务上线、扩缩容、发布和资源隔离为什么要这样做。

一、Docker 是什么

标准回答

Docker 是一种容器化技术,用来把应用及其运行环境一起打包,保证在不同环境里运行一致。

你更好的说法

Docker 的核心价值不是“打包方便”,而是把应用、依赖、配置和运行环境收敛成统一交付单元,解决开发、测试、预发、线上环境不一致的问题。


二、Docker 和虚拟机有什么区别

标准回答

  • 虚拟机是硬件虚拟化,每个虚拟机通常有完整操作系统
  • Docker 容器更像操作系统层的隔离,共享宿主机内核

更通俗的理解

你可以把虚拟机理解成:

  • “每个应用都带一台自己的小电脑”

把容器理解成:

  • “很多应用住在同一台机器里,但有各自独立房间”

为什么容器通常更轻

因为容器不需要每个实例都带一套完整 OS,所以通常:

  • 启动更快
  • 资源更省
  • 部署更轻

三、为什么项目要容器化

你可以直接答

  1. 环境一致
  2. 发布更标准化
  3. 服务隔离更清晰
  4. 更方便做扩容、回滚和 CI/CD

结合你的项目怎么讲

像推广 ROI 线里 Go 消费者、PHP 后台、Kafka 消费服务,如果部署方式不统一,排查和发布成本会很高。容器化至少能把服务交付这层先标准化。


四、镜像和容器的区别

  • 镜像:静态模板
  • 容器:镜像运行起来后的实例

更稳的说法

镜像更像“打包好的运行模板”,容器更像“模板启动后的运行进程”。


五、Docker 常见概念

  • Image
  • Container
  • Volume
  • Network
  • Dockerfile
  • Registry

这些概念最容易怎么讲

  • Image:应用模板
  • Container:运行实例
  • Volume:持久化数据
  • Network:容器通信网络
  • Dockerfile:镜像构建脚本
  • Registry:镜像仓库

六、Dockerfile 怎么理解

标准回答

Dockerfile 是镜像构建脚本,用来定义基础镜像、依赖安装、工作目录、复制文件、启动命令等。

你可以补的点

  • 分层构建
  • 尽量减少层数和无效缓存
  • 多阶段构建
  • 应用镜像尽量轻量

面试更稳的说法

Dockerfile 本质上是在定义“这个应用如何被标准化构建成镜像”。


七、为什么镜像分层很重要

因为 Docker 镜像不是一个大黑盒,而是分层构建的。

这会直接影响:

  • 构建速度
  • 缓存复用
  • 镜像大小
  • 安全扫描效率

你可以顺手补一句

变动少的层,比如:

  • 基础环境
  • 系统依赖
  • 包依赖

应该尽量放前面; 经常变化的代码层尽量放后面,这样缓存更容易命中。


八、为什么多阶段构建有意义

因为构建环境和运行环境往往不一样。

比如:

  • 构建阶段需要编译工具链
  • 运行阶段只需要最终产物

多阶段构建可以把:

  • 编译依赖
  • 构建临时文件

留在前一阶段,不带进最终运行镜像。

好处是:

  • 镜像更小
  • 更安全
  • 启动更快

九、Volume 是干什么的

标准回答

Volume 用于容器数据持久化和宿主机 / 容器之间的数据挂载。

为什么它重要

因为容器本身更像临时运行实例,如果把关键数据只写在容器内部,可重建时很容易丢。

所以像:

  • 数据库数据
  • 上传文件
  • 日志目录

通常都要认真设计挂载方式。


十、Docker Network 怎么理解

容器不是只能各跑各的,它们通常还要互相通信。

Docker Network 主要解决:

  • 容器间通信
  • 服务名解析
  • 网络隔离

项目里怎么讲

比如:

  • PHP 服务调 MySQL
  • 应用调 Redis
  • 后端服务调消息队列

容器网络把这套通信标准化了。


十一、为什么容器不等于绝对安全隔离

这是一个很容易加分的点。

因为容器本质上共享宿主机内核,它不是完整虚拟机级别的彻底隔离。

所以容器更多是:

  • 轻量隔离
  • 工程交付标准化

不是“天然绝对安全沙箱”。


十二、K8s 是什么

标准回答

Kubernetes 是容器编排平台,用来管理容器化应用的部署、扩缩容、服务发现、滚动发布、故障恢复和资源调度。

你更好的说法

Docker 解决的是“怎么打包和运行一个容器”,K8s 解决的是“很多容器和服务怎么稳定管理”。


十三、为什么有了 Docker 还要 K8s

因为只有 Docker,你仍然很难优雅解决:

  • 多副本管理
  • 自动重启
  • 服务发现
  • 滚动发布
  • 自动扩缩容
  • 集群资源调度

一句最稳的话是:

Docker 解决单个容器交付,K8s 解决大量容器实例治理。


十四、K8s 核心对象

  • Pod
  • Deployment
  • Service
  • Ingress
  • ConfigMap
  • Secret
  • Namespace

十五、Pod 和容器是什么关系

Pod 是 K8s 调度的最小单位,里面可以包含一个或多个容器。一般一个主业务容器配一个 sidecar 或辅助容器。

为什么 Pod 不直接等于一个容器

因为 K8s 管理的是“协同运行单元”,不是只关心某一个进程。

这也是为什么:

  • sidecar
  • 代理容器
  • 日志采集容器

可以和主容器放在同一个 Pod 里。


十六、Deployment 的作用

管理无状态服务的副本数、滚动更新和回滚。

更稳一点的回答

Deployment 管的不是“单个 Pod”,而是:

  • 期望跑多少副本
  • 新老版本怎么平滑替换
  • 出问题怎么回滚

十七、Service 和 Ingress 区别

  • Service:集群内部服务发现和负载均衡
  • Ingress:对外统一入口和路由规则

更通俗一点

  • Service 更像“集群内部的稳定门牌号”
  • Ingress 更像“外部流量入口总闸”

十八、ConfigMap 和 Secret 是干什么的

标准回答

  • ConfigMap:管理普通配置
  • Secret:管理敏感配置

面试更稳的说法

它们的核心价值是把:

  • 配置
  • 应用镜像

解耦。

这样同一份镜像可以在不同环境加载不同配置,而不是每改一次配置都重打镜像。


十九、Namespace 的价值是什么

Namespace 主要用来做资源逻辑隔离。

比如:

  • 不同环境
  • 不同团队
  • 不同项目

可以分开管理。


二十、为什么 K8s 适合微服务

微服务天然会带来大量服务实例、不同版本、不同扩容需求和发布动作。K8s 的价值就在于把调度、服务发现、滚动发布、健康检查、扩缩容这些能力统一收敛。


二十一、滚动发布和回滚怎么理解

  • 滚动发布:逐步替换旧版本,保证服务不中断
  • 回滚:新版本有问题时快速恢复到旧版本

为什么这题重要

因为线上发布不是“起新版本就完了”,而是:

  • 怎么平滑替换
  • 怎么控制风险
  • 怎么快速止损

二十二、健康检查为什么重要

  • livenessProbe
  • readinessProbe

readiness 负责能不能接流量,liveness 负责是不是需要重启。

最容易答错的点

很多人会把两者都理解成“活没活着”。

更准确的是:

  • readiness:现在能不能安全接请求
  • liveness:是不是已经死锁、假死、需要重启

二十三、为什么资源限制很重要

K8s 里常见会配:

  • requests
  • limits

它们本质上是在回答:

  • 这个服务至少需要多少资源
  • 最多允许吃到多少资源

这影响:

  • 调度
  • 稳定性
  • 邻居服务是否被抢资源

二十四、HPA 是什么

HPA,Horizontal Pod Autoscaler,主要解决:

  • 副本数自动扩缩容

它会根据指标,比如:

  • CPU
  • 内存
  • 自定义指标

动态调节副本数。

更稳的说法

自动扩缩容不是“副本越多越好”,而是要和:

  • 下游容量
  • 限流
  • 消费速度

一起设计。


二十五、K8s 常见架构组件怎么讲

如果面试官往平台层追问,你至少要知道这些名字:

  • apiserver
  • scheduler
  • controller-manager
  • etcd
  • kubelet
  • kube-proxy

你可以粗略这样理解

  • apiserver:集群控制入口
  • scheduler:决定 Pod 调度到哪个节点
  • controller-manager:负责把“期望状态”往“实际状态”拉齐
  • etcd:保存集群状态
  • kubelet:节点上的执行代理
  • kube-proxy:服务网络转发相关

二十六、CI/CD 怎么讲

一般链路

  1. 代码提交
  2. 自动测试
  3. 构建镜像
  4. 推送镜像仓库
  5. 更新 Deployment
  6. 健康检查
  7. 发布完成或回滚

更好的说法

真正重要的不是“有 CI/CD”,而是:

  • 镜像可追踪
  • 发布可回滚
  • 配置可区分环境
  • 失败能自动停住

二十七、结合你的项目怎么说

海外业务平台

  • 支付、订阅、后台和鉴定链路都比较重,发布要更关注稳定性
  • 如果服务化以后,适合通过容器标准化部署

推广 ROI 平台

  • Go 消费者、PHP 后台、报表服务、回传服务天然适合拆成不同容器
  • 不同服务副本数和资源需求不同,K8s 更适合统一管理

二十八、技术总监最容易问的 5 个点

1. Docker 解决什么问题

解决环境一致性和交付标准化问题。

2. Docker 和虚拟机有什么不同

容器共享宿主机内核,更轻;虚拟机带完整 OS,更重但隔离更强。

3. K8s 解决什么问题

解决多服务部署、扩缩容、服务发现、滚动发布和故障恢复问题。

4. 为什么有了 Docker 还要 K8s

因为 Docker 只解决单容器交付,不解决多服务实例治理。

5. 你项目里为什么需要它

因为多服务系统一旦没有标准化部署和编排,发布、回滚、扩缩容和排障都会很痛苦。


二十九、你最适合背的总结句

我对 Docker 和 K8s 的理解,重点不是平台术语,而是它们分别解决交付标准化和多服务治理问题。前者让应用运行环境一致,后者让多服务的部署、扩缩容、服务发现和发布回滚更标准、更稳定。