📝 前言

在看了上一篇的 Docker 基础部分后,到了在简历里写“精通 Docker”或者“熟练使用 Docker 独立完成项目部署”被拷问的时候了。面试官在这部分最喜欢问:网络模式、存储分配、镜像如何优化,以及让你讲讲自己真实遇到的坑!
废话不多说,大白话安排上,直接进入正题!


1. 面试官:Docker 的 4 种网络模式了解吗?有什么区别?(⭐⭐⭐⭐⭐ 必考)

📌 标准回答:
Docker 提供了以下 4 种核心的网络模式(Network drivers):

  1. Bridge 模式(桥接/默认)
    • 不指定 --net 时默认使用此模式。Docker 会在宿主机上虚拟一个默认网桥 docker0,给每个容器分配独立的内部 IP。容器通过 NAT 技术与外部网络通信,必须靠端口映射(-p 8080:80 外界才能访问。
  2. Host 模式
    • 使用 --net=host。容器不再拥有自己独立的网络 IP 和端口,而是直接与宿主机共用所在的网络栈! 比如你的微服务容器开了 8080 端口,那宿主机的 8080 就直接被占用了,这也是性能最好的一种通信方式。
  3. None 模式
    • 使用 --net=none。Docker 这时只给容器分配独立的 Network Namespace 隔离环境,但一丁点网卡、IP全都不给你配,相当于一个彻彻底底的黑屋子单机环境(适用于安全性极高不需要外界联网程序的运算跑批)。
  4. Container 模式
    • 使用 --net=container:其它容器名。这个容器不会创建自己的网卡,而是直接和一个已经存在的某个指定容器共享 IP 和端口范围

💡 大白话解析:

  • Bridge 就是你在北京租房,路由器在你家客厅;外卖小哥在小区大门(宿主)把餐递给保安(NAT 端口转发),然后小哥才能送到你租的屋(容区内)。
  • Host 就是你不租房了,你直接住在小区的保安亭里,想要什么直接伸手拿出去喊,零延迟!最快!但位置只有那一个!

2. 面试官:你怎么优化你打包打出来的 Docker 镜像体积?

📌 标准回答:
在我的全栈项目中,前端和后端打包经常遇到镜像体积膨胀的问题。我主要使用以下几招优化:

  1. 多阶段构建(Multi-stage build)
    像 Spring Boot 项目,第一阶段我用体积巨大的 maven:*-openjdk 镜像去作为 builder 编译装载所有环境。打好 Jar 包后,第二阶段我只用一个极小的 jre-alpine 去把刚才的 Jar 拷过来跑。直接把原本 600MB 丢在镜像里的依赖源干掉,最终上线不到 150MB。
  2. 使用更小的基础镜像
    无论是 Java、Node 还是 Nginx,只要条件允许,全部从原本的完整基础镜像切换为带 alpine 标签的基础版(基于高度精简的 Linux 发行版)。
  3. 合理编写 .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退出),你怎么去排查它?

📌 标准回答:
排查挂掉的容器有套“三板斧”操作流程被我记在心里了:

  1. 看日志:docker logs <容器名>docker logs -f <容器名>。看看报错有没有抛出 MySQL 密码不正确,或是 SpringBoot 跑的时候连接拒绝。百分之八十都能立刻看出问题。
  2. 看元数据详情:docker inspect <容器名> 去查。查什么?查它绑定的环境变量(Env)是不是漏传了,查它的 Mounts 挂载硬盘是不是宿主机的路径没有权限读。
  3. 重写 Entrypoint 进容器探案: 很多时候容器起不来是因为内部文件缺失,但容器必须活着有进程才能进控制台。我们可以用:
    docker run -it --entrypoint /bin/sh <报错的镜像名>
    强行剥夺它的启动脚本,把它变成一个可以敲命令进去看看为什么配置乱掉。这招百试百灵!

🎯 总结与简历建议

如果这份基础+进阶篇能把它啃熟,那么只要涉及 Docker 的面试基本上 95% 你都能对答如流了。
对于简历,“熟悉”和“精通”其实取决于你踩过多少坑。只要你在描述最后能带上“熟练使用多阶段构建削减镜像体积、能手写 Compose 编排前后端分离架构和处理复杂网络挂载问题”,面试官就会对你的实战能力刮目相看!

更多推荐