第4章 容器化与Docker面试题
容器化是DevOps自动化工程师的核心技能。本章聚焦镜像优化、多阶段构建、Compose编排、容器网络与存储的高频面试题,提供结构化回答框架与避坑指南。
面试问题:如何优化Docker镜像大小?
| 面试官考察点 | 镜像分层理解、构建效率、安全意识 |
| 回答框架 | 基础镜像选择 → 减少层数 → .dockerignore → 多阶段构建 → 缓存利用 |
| 简短示例回答 | 选用alpine slim为基础镜像,合并RUN命令,使用.dockerignore排除.node_modules,通过多阶段构建分离编译与运行环境,最终镜像从1.2GB降至15MB。 |
| 可能追问 | 如何调试镜像每层大小?答:docker history 查看每层Size。 |
| 避坑提醒 | 不要将依赖目录整体COPY后不清理,勿在构建层写入密码等敏感信息。 |
面试问题:多阶段构建的原理与优势是什么?
| 面试官考察点 | 构建效率、最终镜像安全性、Dockerfile设计能力 |
| 回答框架 | 定义多个FROM → 第一阶段编译 → 第二阶段复制产物 → 仅保留运行环境 |
| 简短示例回答 | 在Dockerfile中使用两个FROM,第一阶段编译Go二进制,第二阶段基于scratch仅复制二进制和c库,最终镜像仅包含可执行文件,体积约10MB。 |
| 可能追问 | 如何传递构建参数到第二阶段?答:使用--from=builder复制文件,变量可通过ARG传递。 |
| 避坑提醒 | 确保阶段名称唯一且对应正确,避免COPY时写错源路径。 |
面试问题:Docker Compose中如何配置网络与持久化存储?
| 面试官考察点 | Compose语法、网络模型、数据持久化方案 |
| 回答框架 | 定义services → 声明networks → 设置volumes → 服务内挂载 |
| 简短示例回答 | 编写docker-compose.yml,在volumes:声明命名卷data_vol,在services.web中挂载./app:/app,在networks:定义mynet(driver: bridge),服务间通过服务名通信。 |
| 可能追问 | 如何给容器固定IP?答:在networks下配置ipam及ipv4_address。 |
| 避坑提醒 | 生产环境下使用overlay网络需配合Swarm,避免单机bridge导致跨宿主机不通。 |
💡 加分技巧:回答时强调“体积优化+安全(不包含构建工具)”,“网络层面区分stateless/stateful服务”,以及“存储方案选型依据(性能 vs 持久性)”。
项目案例:微服务电商平台容器化迁移
| 项目名称 | ShopNow 微服务容器化 |
| 业务背景 | 传统虚拟机部署导致环境不一致、扩容响应慢(需2天),上线故障频发。 |
| 规模指标 | 20+微服务(Java/Python/Go),50台物理机,日均百万请求,200+容器实例。 |
| 技术栈 | Docker 20.10、Docker Compose、Jenkins、Prometheus + Grafana、Harbor镜像仓库 |
| 核心难点 | ①基础镜像过大(每个1.2GB)导致部署慢;②容器间网络不通(跨宿主机);③MySQL/data丢失(未挂载volume)。 |
| 面试高频追问 | 如何设计镜像构建流水线?→ 多阶段+CI构建;如何解决DNS解析?→ 使用自定义overlay网络或Consul;如何备份volume?→ 定期rsync或使用卷插件。 |
| 可迁移回答话术 | “我们使用标准化Dockerfile模板,多阶段构建后镜像平均<100MB;利用docker-compose up -d一键启动全栈环境;结合Jenkins自动构建、推送到Harbor,实现从开发到测试环境一致性。” |
提示:面试中提及项目时,重点突出“技术决策依据”(如为什么选Compose而非直接K8s)和“量化收益”(部署时间从2天缩短到10分钟、故障率下降80%)。