⭐ 2026年最新!Docker高频面试题通关宝典(下):网络原理、存储与实战调优
·
📝 前言
在看了上一篇的 Docker 基础部分后,到了在简历里写“精通 Docker”或者“熟练使用 Docker 独立完成项目部署”被拷问的时候了。面试官在这部分最喜欢问:网络模式、存储分配、镜像如何优化,以及让你讲讲自己真实遇到的坑!
废话不多说,大白话安排上,直接进入正题!
1. 面试官:Docker 的 4 种网络模式了解吗?有什么区别?(⭐⭐⭐⭐⭐ 必考)
📌 标准回答:
Docker 提供了以下 4 种核心的网络模式(Network drivers):
- Bridge 模式(桥接/默认):
- 不指定
--net时默认使用此模式。Docker 会在宿主机上虚拟一个默认网桥docker0,给每个容器分配独立的内部 IP。容器通过 NAT 技术与外部网络通信,必须靠端口映射(-p 8080:80) 外界才能访问。
- 不指定
- Host 模式:
- 使用
--net=host。容器不再拥有自己独立的网络 IP 和端口,而是直接与宿主机共用所在的网络栈! 比如你的微服务容器开了 8080 端口,那宿主机的 8080 就直接被占用了,这也是性能最好的一种通信方式。
- 使用
- None 模式:
- 使用
--net=none。Docker 这时只给容器分配独立的 Network Namespace 隔离环境,但一丁点网卡、IP全都不给你配,相当于一个彻彻底底的黑屋子单机环境(适用于安全性极高不需要外界联网程序的运算跑批)。
- 使用
- Container 模式:
- 使用
--net=container:其它容器名。这个容器不会创建自己的网卡,而是直接和一个已经存在的某个指定容器共享 IP 和端口范围!
- 使用
💡 大白话解析:
- Bridge 就是你在北京租房,路由器在你家客厅;外卖小哥在小区大门(宿主)把餐递给保安(NAT 端口转发),然后小哥才能送到你租的屋(容区内)。
- Host 就是你不租房了,你直接住在小区的保安亭里,想要什么直接伸手拿出去喊,零延迟!最快!但位置只有那一个!
2. 面试官:你怎么优化你打包打出来的 Docker 镜像体积?
📌 标准回答:
在我的全栈项目中,前端和后端打包经常遇到镜像体积膨胀的问题。我主要使用以下几招优化:
- 多阶段构建(Multi-stage build):
像 Spring Boot 项目,第一阶段我用体积巨大的maven:*-openjdk镜像去作为 builder 编译装载所有环境。打好 Jar 包后,第二阶段我只用一个极小的jre-alpine去把刚才的 Jar 拷过来跑。直接把原本 600MB 丢在镜像里的依赖源干掉,最终上线不到 150MB。 - 使用更小的基础镜像:
无论是 Java、Node 还是 Nginx,只要条件允许,全部从原本的完整基础镜像切换为带alpine标签的基础版(基于高度精简的 Linux 发行版)。 - 合理编写
.dockerignore:
像前端的node_modules本地目录或者多余的.git日志,必须要被.dockerignore忽略掉,防止不小心传进容器中拖慢docker build耗时和内存。
3. 面试官:Docker Compose 常见在工作里怎么用?他和 Docker 的关系?
📌 标准回答:
- 关系: Docker 操作主要是基于单机的单容器指令。但在真实的企业或者全栈微服务架构部署中,我们有 MySQL、后端的 Java 微服务、前端的 Nginx 并且它们有强启动先后顺序依赖!总不能靠人手把这十几个容器挨个
run起来?这使得“容器编排”成为刚需。 - 使用: Docker Compose 就是用来进行单机下多容器应用的编排与一键管理的利器。在一个
docker-compose.yml中宣告全部微服务,定义它们共同的 Network,并通过depends_on设置必须等某一个组件启动后另一个再启动。 - 实战运用避坑谈: 在实战部署时,我在 Compose 中踩过环境变量失效导致数据库空密码被拒绝的坑。因为 Docker Compose 默认会将与 yml 一起的
.env文件注册全局环境变量(比如MYSQL_ROOT_PASSWORD)。如果.env文件当时丢失了直接跑docker compose up -d,会在磁盘里制造一个无密码残次品数据库卷。发现后必须用docker compose down -v把脏卷删除后加回.env重新执行。
4. 面试官:如果我的一个 Docker 容器刚运行起来就一直崩溃卡死(Exit退出),你怎么去排查它?
📌 标准回答:
排查挂掉的容器有套“三板斧”操作流程被我记在心里了:
- 看日志: 用
docker logs <容器名>或docker logs -f <容器名>。看看报错有没有抛出 MySQL 密码不正确,或是 SpringBoot 跑的时候连接拒绝。百分之八十都能立刻看出问题。 - 看元数据详情: 用
docker inspect <容器名>去查。查什么?查它绑定的环境变量(Env)是不是漏传了,查它的 Mounts 挂载硬盘是不是宿主机的路径没有权限读。 - 重写 Entrypoint 进容器探案: 很多时候容器起不来是因为内部文件缺失,但容器必须活着有进程才能进控制台。我们可以用:
docker run -it --entrypoint /bin/sh <报错的镜像名>。
强行剥夺它的启动脚本,把它变成一个可以敲命令进去看看为什么配置乱掉。这招百试百灵!
🎯 总结与简历建议
如果这份基础+进阶篇能把它啃熟,那么只要涉及 Docker 的面试基本上 95% 你都能对答如流了。
对于简历,“熟悉”和“精通”其实取决于你踩过多少坑。只要你在描述最后能带上“熟练使用多阶段构建削减镜像体积、能手写 Compose 编排前后端分离架构和处理复杂网络挂载问题”,面试官就会对你的实战能力刮目相看!
更多推荐




所有评论(0)