📝 前言

在如今的后端开发与运维面试中,Docker 已经成了“必问考点”。很多同学简历上写着“熟练使用 Docker 部署项目”,但一被问到底层原理就开始结巴。
本系列面试宝典分为上、下两篇,针对秋招/春招高频考点,为你整理了最核心的 Docker 面试题,同时秉配**【💡 大白话通俗解析】**,保证你看完不仅能背下来,还能真正理解!


1. 面试官:请你谈谈 Docker 和传统的虚拟机(VMware)有什么区别?

📌 标准回答:

  • 架构层级:虚拟机是在操作系统之上,通过 Hypervisor(虚拟化层)虚拟出一整套硬件和完整的 Guest OS(客户操作系统)。而 Docker 是操作系统级别的虚拟化,不仅没有虚拟硬件,也没有属于自己的完整 OS,只包含必需的运行库和应用。
  • 隔离性:虚拟机的隔离性更好,属于完全的硬件与系统隔离;Docker 只是利用 Linux 的 Namespace 和 Cgroups 技术进行进程隔离,安全性稍弱于虚拟机。
  • 启动速度与体积:虚拟机启动是分钟级,体积几十 GB;Docker 启动是秒级甚至是毫秒级,体积只在 MB 级别。

💡 大白话解析:
虚拟机就像是“买地盖楼”,必须从地基打起,还要造水电系统(Guest OS),极其笨重;
Docker 就像是“在写字楼租格子间”,水电都是共用写字楼的(宿主机宿主内核),你只需要把你自己的桌椅搬进去(项目运行库)就能直接开干!所以很轻、很快。


2. 面试官:Docker 的三大核心组件是什么?

📌 标准回答:

  1. 镜像(Image):一个只读的模板,包含了应用运行所需要的所有环境、依赖、代码。
  2. 容器(Container):镜像是静态的,当镜像被运行起来之后,就成了一个动态的“容器”。容器是完全独立运行的一个或一组应用。
  3. 仓库(Repository):用来集中存放镜像文件的地方(类似 GitHub 存放代码),最大的公开仓库是 Docker Hub。

💡 大白话解析:
拿面向对象编程来比喻:**镜像(Image)其实就是 Class(类),容器(Container)就是被 new 出来的一堆 Object(对象/实例)。**仓库就像是 Maven 中央仓库,你从里面下载别人写好的类。


3. 面试官:能说说 Docker 镜像的分层(Layer)结构和 UnionFS(联合文件系统)吗?

📌 标准回答:
Docker 镜像是由多层文件系统叠加而成的。除了最底层的 bootfs,其上方每一层都是只读的(Read-only)。
这种层层叠加的技术依赖于 UnionFS(联合文件系统),它允许将不同物理位置的目录挂载到同一个虚拟文件系统下。当我们基于一个镜像启动容器时,Docker 会在只读的镜像层外面,再挂载一层可写层(读写层 / Container layer)

💡 大白话解析:
镜像就像是一个“极其豪华的巨无霸汉堡”,一层面包、一层牛肉、一层蔬菜。每一层准备好了都不准再改了
当你要吃的时候(启动容器),Docker 就在最上面加了一层“透明的保鲜膜”(可读写层)。你在容器里的所有新建、删除操作,比如写日志、传图片,其实都只是写在这层保鲜膜上,并没有去弄脏底下的汉堡本身。这叫做 写时复制(Copy-on-Write)机制


4. 面试官:当我们敲下 docker run -d nginx 时,背后究竟发生了什么?

📌 标准回答:

  1. Docker Client 将指令发送给本地的 Docker Daemon(守护进程)。
  2. Daemon 首先检查本地是否有 nginx 镜像。如果有,直接使用;如果没有,就会去配置的 Docker Registry(如 Docker Hub)拉取(Pull)该镜像。
  3. 拿到镜像后,Daemon 调用操作系统的内核分配隔离环境(Namespace 和 Cgroups)。
  4. 在镜像文件系统(只读层)的最上层,添加一层读写层。
  5. 配置网络桥接端口,分配 IP。
  6. 最后,执行镜像里指定的 ENTRYPOINTCMD 指令,把 Nginx 进程跑起来。

5. 面试官:如果不用数据卷,把 Docker 容器删掉重启,里面的文件还在吗?

📌 标准回答:
不在了,会全部丢失。
因为正如刚才提到的,容器里的所有文件增删改操作实际上都是写在容器的**顶层读写层(生命周期层)**上的。当执行 docker rm 删掉这个容器时,这层读写层也会被彻底销毁。为了做到数据持久化(比如 MySQL 的表数据、用户上传的头像),必须使用 Volume(数据卷)将宿主的物理目录映射到容器内,绕过这层联合文件系统。

💡 大白话解析:
这也是为什么我们跑 MySQL 容器,必须老老实实写一句 -v mysql_data:/var/lib/mysql 的原因!不挂载数据卷,手抖删错容器的代价就是你辛苦填的数据库瞬间化为乌有,直接拎包跑路!


👉 【下篇预告】:
在下一篇《Docker高级面试宝典》中,我们会直击痛点,剖析 Docker 最难的网络模式(Bridge/Host 等)、Dockerfile 打包优化策略以及实战遇到的 Docker Compose 致命天坑!敬请期待!

更多推荐