第4章 容器化与Docker面试题

容器化是DevOps自动化工程师的核心技能。本章聚焦镜像优化、多阶段构建、Compose编排、容器网络与存储的高频面试题,提供结构化回答框架与避坑指南。

Docker面试 核心框架 镜像优化 减层 + .dockerignore 多阶段构建 分离构建/运行 Compose编排 多容器服务定义 容器网络 bridge/host/overlay 持久化存储 volume与bind挂载 回答路径:从基础镜像→多阶段→编排→网络→存储,层层递进

面试问题:如何优化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%)。