🐳 Docker + Kubernetes 面试10题(2026 Java实习版)

面试官问"用过Docker吗"——别只说"用过"。下面这10道题覆盖了Docker+K8s在Java后端面试中90%的考点,背下来直接答出高级感。

Q1: Docker镜像、容器、仓库三者关系?
镜像是只读模板(类似Java的Class)
容器是镜像的运行实例(类似Java的Object)
仓库是镜像的存储和分发中心(类似Maven中央仓库)

面试金句:"镜像是构建时产物,容器是运行时实体。Docker利用UnionFS实现镜像分层,不同镜像共享相同的Base Layer,这就是为什么拉取镜像这么快。"
Q2: Dockerfile常用指令有哪些?COPY和ADD区别?
FROM openjdk:17-slim          # 基础镜像
WORKDIR /app                   # 工作目录
COPY target/*.jar app.jar     # 复制文件
RUN apt-get update             # 构建时执行
EXPOSE 8080                    # 声明端口
CMD ["java","-jar","app.jar"] # 容器启动命令
COPY vs ADD:COPY只复制本地文件;ADD还能解压tar和下载URL。面试官想听的是"ADD有隐式行为,推荐用COPY保持Dockerfile可预测性"。
Q3: Docker镜像分层是什么?为什么重要?
每个Dockerfile指令创建一个新层,层之间是增量存储。关键价值: - 不同镜像共享相同层(如都基于openjdk:17) - 更新时只推送变化的层,不是整个镜像 - 写时复制(CoW):容器运行时修改文件会拷贝到可写层
面试金句:"这就是为什么Docker镜像构建要按变化频率排序——把不常变的放在前面(如apt-get),常在变的(如COPY代码)放最后,最大化缓存命中。"
Q4: K8s核心组件有哪些?各自做什么?
Master节点: - API Server — 整个集群的入口,所有操作都通过它 - etcd — 分布式KV存储,保存集群所有状态 - Scheduler — 决定Pod调度到哪个Node - Controller Manager — 维护期望状态(如副本数不够就自动拉起) Worker节点: - kubelet — 每个节点的Agent,负责Pod生命周期 - kube-proxy — 网络代理,实现Service的负载均衡
Q5: Pod、Deployment、Service三者区别?
Pod — K8s最小调度单元,1+容器共享网络和存储。一般1 Pod = 1应用容器
Deployment — 管理Pod的"期望状态"。声明"我要3个副本"→Deployment自动保活。支持滚动更新和回滚
Service — Pod的网络抽象。Pod IP会变,Service提供稳定的VIP和DNS名

面试金句:"Pod是'谁干活',Deployment是'干多少',Service是'怎么找到干活的人'。"
Q6: K8s的Service有哪几种类型?
ClusterIP(默认)— 集群内部访问,不对外暴露
NodePort — 在每个Node上开端口 → 外部可访问
LoadBalancer — 云厂商的LB直接指向Service
ExternalName — DNS CNAME映射

面试金句:"Java微服务部署到K8s,服务间调用用ClusterIP+服务名(Nacos/Eureka在这里就被K8s Service替代了)。对外暴露API用Ingress+ClusterIP,不直接用NodePort。"
Q7: K8s探针(Probe)是什么?三种探针区别?
Liveness Probe(存活探针)— 容器还活着吗?失败→杀掉重启
Readiness Probe(就绪探针)— 能接流量吗?失败→从Service摘除
Startup Probe(启动探针)— 启动完了吗?在它成功之前禁用其他探针

Java场景:Readiness写/actuator/health,Spring Boot Actuator自带。防止Pod还在初始化就被流量打挂了。
Q8: docker-compose和K8s什么关系?什么时候用哪个?
docker-compose — 单机多容器编排。开发环境/测试环境/小项目
K8s — 集群级别容器编排。生产环境/多机/自动伸缩

面试金句:"docker-compose.yml就像是租房合同——单机够用。K8s就像是物业管理公司——管理整个小区的房子。我的项目开发阶段用docker-compose本地调试,生产部署到K8s集群。"
Q9: Docker网络模式有哪些?
bridge(默认)— 容器通过docker0网桥通信
host — 容器直接用宿主机网络,性能最高但端口冲突
none — 完全隔离
overlay — 跨主机的容器通信(Swarm/K8s用)

Java项目常用:docker-compose默认bridge,多个容器用服务名互访。
Q10: 你的项目里Docker怎么用的?踩过什么坑?
用法:"我的微服务秒杀项目写了Dockerfile+docker-compose.yml,一键启动MySQL+Redis+Nacos+应用。RAG知识库项目也是Docker部署。"

坑(面试加分): - MySQL容器重启后数据丢失 → 加了volume持久化
- 容器间通信用localhost不行 → 改成服务名(docker-compose自动DNS)
- Java应用OOM被K8s杀掉 → 加了-XX:+UseContainerSupport让JVM感知容器内存限制
- 镜像太大 → 改用多阶段构建,最终镜像从500MB降到150MB

面试题库 · 模拟器 · 简历生成器 · 脚手架