Docker 与 K8s 题库
这部分你不一定是“平台 owner”,但你一定要准备到:
我知道容器化和编排到底解决什么问题,也知道服务上线、扩缩容、发布和资源隔离为什么要这样做。
一、Docker 是什么
标准回答
Docker 是一种容器化技术,用来把应用及其运行环境一起打包,保证在不同环境里运行一致。
你更好的说法
Docker 的核心价值不是“打包方便”,而是把应用、依赖、配置和运行环境收敛成统一交付单元,解决开发、测试、预发、线上环境不一致的问题。
二、Docker 和虚拟机有什么区别
标准回答
- 虚拟机是硬件虚拟化,每个虚拟机通常有完整操作系统
- Docker 容器更像操作系统层的隔离,共享宿主机内核
更通俗的理解
你可以把虚拟机理解成:
- “每个应用都带一台自己的小电脑”
把容器理解成:
- “很多应用住在同一台机器里,但有各自独立房间”
为什么容器通常更轻
因为容器不需要每个实例都带一套完整 OS,所以通常:
- 启动更快
- 资源更省
- 部署更轻
三、为什么项目要容器化
你可以直接答
- 环境一致
- 发布更标准化
- 服务隔离更清晰
- 更方便做扩容、回滚和 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 常见架构组件怎么讲
如果面试官往平台层追问,你至少要知道这些名字:
apiserverschedulercontroller-manageretcdkubeletkube-proxy
你可以粗略这样理解
- apiserver:集群控制入口
- scheduler:决定 Pod 调度到哪个节点
- controller-manager:负责把“期望状态”往“实际状态”拉齐
- etcd:保存集群状态
- kubelet:节点上的执行代理
- kube-proxy:服务网络转发相关
二十六、CI/CD 怎么讲
一般链路
- 代码提交
- 自动测试
- 构建镜像
- 推送镜像仓库
- 更新 Deployment
- 健康检查
- 发布完成或回滚
更好的说法
真正重要的不是“有 CI/CD”,而是:
- 镜像可追踪
- 发布可回滚
- 配置可区分环境
- 失败能自动停住
二十七、结合你的项目怎么说
海外业务平台
- 支付、订阅、后台和鉴定链路都比较重,发布要更关注稳定性
- 如果服务化以后,适合通过容器标准化部署
推广 ROI 平台
- Go 消费者、PHP 后台、报表服务、回传服务天然适合拆成不同容器
- 不同服务副本数和资源需求不同,K8s 更适合统一管理
二十八、技术总监最容易问的 5 个点
1. Docker 解决什么问题
解决环境一致性和交付标准化问题。
2. Docker 和虚拟机有什么不同
容器共享宿主机内核,更轻;虚拟机带完整 OS,更重但隔离更强。
3. K8s 解决什么问题
解决多服务部署、扩缩容、服务发现、滚动发布和故障恢复问题。
4. 为什么有了 Docker 还要 K8s
因为 Docker 只解决单容器交付,不解决多服务实例治理。
5. 你项目里为什么需要它
因为多服务系统一旦没有标准化部署和编排,发布、回滚、扩缩容和排障都会很痛苦。
二十九、你最适合背的总结句
我对 Docker 和 K8s 的理解,重点不是平台术语,而是它们分别解决交付标准化和多服务治理问题。前者让应用运行环境一致,后者让多服务的部署、扩缩容、服务发现和发布回滚更标准、更稳定。