docker基础-运维工程师面试
docker基础-运维工程师面试
架构原理”、“镜像与容器生命周期”、“网络与存储” 这三大支柱展开。
三大核心:容器、镜像、仓库
Docker 的完整运行依赖三大基石(Namespace、Cgroups、UnionFS(联合文件系统))
一、Docker 与虚拟机的区别?即docker与kvm的区别
💡 形象比喻
- KVM (虚拟机) 就像是 独栋别墅****。
- 每栋别墅都有自己的地基、水管、电路、厨房(独立内核)。
- 你想住进去,得先把房子盖好(启动慢)。
- 邻居着火了很难烧到你(隔离性好)。
- 但是占地大,成本高。
- Docker (容器) 就像是 胶囊旅馆的隔间****。
- 大家共享大楼的地基、总水管、总电路(共享内核)。
- 你只需要拎包入住(启动极快)。
- 空间利用率极高,一栋楼能住很多人。
- 但如果大楼地基(内核)塌了,所有人都得遭殃;隔音效果也没别墅好(隔离性稍弱)。
1、核心架构区别 (最本质的不同)
| 维度 | KVM (虚拟机) | Docker (容器) |
|---|---|---|
| 启动速度 | 慢 (分钟级)。 需要经历完整的 BIOS 自检、内核加载、系统初始化过程。 |
极快 (秒级/毫秒级)。 本质是启动一个进程,无需加载内核。 |
| 资源开销 | 大。 每个 VM 都要占用几百 MB 甚至几 GB 内存来运行完整的操作系统内核和系统服务。 |
极小。 只有应用本身及其依赖库的内存占用,几乎没有额外损耗。 |
| 性能损耗 | 有损耗。 I/O 和网络需要经过 Hypervisor 转换,损耗约 5%-15%。 |
接近原生。 直接调用宿主机内核,损耗几乎可以忽略不计 (<1%)。 |
| 密度 | 低。 一台物理机可能只能跑几十个 VM。 |
高。 一台物理机可以跑成千上万个容器。 |
2、性能与资源对比
| 维度 | KVM (虚拟机) | Docker (容器) |
|---|---|---|
| 启动速度 | 慢 (分钟级)。 需要经历完整的 BIOS 自检、内核加载、系统初始化过程。 |
极快 (秒级/毫秒级)。 本质是启动一个进程,无需加载内核。 |
| 资源开销 | 大。 每个 VM 都要占用几百 MB 甚至几 GB 内存来运行完整的操作系统内核和系统服务。 |
极小。 只有应用本身及其依赖库的内存占用,几乎没有额外损耗。 |
| 性能损耗 | 有损耗。 I/O 和网络需要经过 Hypervisor 转换,损耗约 5%-15%。 |
接近原生。 直接调用宿主机内核,损耗几乎可以忽略不计 (<1%)。 |
| 密度 | 低。 一台物理机可能只能跑几十个 VM。 |
高。 一台物理机可以跑成千上万个容器。 |
3. 隔离性与安全性
| 维度 | KVM (虚拟机) | Docker (容器) |
|---|---|---|
| 隔离级别 | 强隔离。 完全独立的操作系统,一个 VM 崩溃或中毒通常不影响其他 VM 或宿主机。 |
进程级隔离。 共享内核,如果内核出现漏洞,所有容器都可能受影响;一个容器耗尽资源可能影响宿主机(虽有 Cgroups 限制,但风险略高于 VM)。 |
| 安全性 | 高。 适合运行不可信代码或多租户环境。 |
中。 适合运行可信的应用微服务。不建议在容器中运行完全不可信的恶意代码。 |
| 系统兼容性 | 高。 可以在 Linux 宿主机上跑 Windows VM,或者跑不同版本内核的 Linux。 |
低。 Linux 容器必须依赖 Linux 内核。 (注:Windows 上跑 Docker 是通过 Hyper-V 起了一个 Linux VM 来容纳容器的) |
4、镜像与管理
| 维度 | KVM (虚拟机) | Docker (容器) |
|---|---|---|
| 镜像大小 | 大 (GB 级)。 包含完整的操作系统文件。 |
小 (MB 级)。 只包含应用和依赖库,分层存储。 |
| 传输与分发 | 慢,难以版本控制。 | 快,支持分层增量更新,易于 CI/CD 流水线集成。 |
| 状态持久性 | 通常被视为“宠物” (Pet),长期运行,状态保存在磁盘。 | 通常被视为“牲畜” (Cattle),无状态,随时销毁重建,数据挂载卷存储。 |
🚀 总结:什么时候用哪个?
- 使用 KVM (虚拟机) 的场景****:
- 需要运行不同的操作系统(如在 Linux 服务器上跑 Windows 应用)。
- 需要极强的安全隔离(如公有云的多租户底层)。
- 遗留系统迁移,应用强依赖特定的旧内核版本。
- 作为基础设施层(IaaS),为上层提供计算资源。
- 使用 Docker (容器) 的场景****:
- 微服务架构,应用需要频繁迭代、快速部署。
- 追求极致的资源利用率和启动速度。
- DevOps 和 CI/CD 流程。
- 云原生应用(Cloud Native)。
- **最佳实践 (混合使用)**:
- 底层****:物理服务器 -> KVM 虚拟机 (提供安全隔离和资源切分)。
- 上层****:虚拟机内部 -> Docker 容器 (提供应用打包和敏捷交付)。
- 编排****:Kubernetes (管理这些运行在 VM 里的容器)。
面试回答金句****:
“KVM 解决了硬件资源的虚拟化和强隔离问题,是云计算的基石;而 Docker 解决了应用交付的一致性和敏捷性问题,是云原生的核心。在现代架构中,我们通常是在 KVM 创建的虚拟机中运行 Docker 容器,结合两者的优势。”
二、Docker 默认使用以下 6 种 Namespace **来实现全方位的隔离
类比:像给进程戴上“VR 眼镜”,它只能看到自己虚拟出来的世界。
namespace 就像一个 隔板,把原本全局共享的大空间分隔成多个小房间,
每个进程只能在自己的房间里活动。进程看不到房间外的东西,所以它“以为”自己独占了系统。
1、namespace
| Namespace 类型 | 隔离内容 | 作用详解 |
|---|---|---|
| PID (Process ID) | 进程隔离 | 容器内的进程拥有独立的 PID 空间。容器内的第一个进程 PID 永远是 1,它看不到宿主机上的其他进程。 |
| Net (Network) | 网络隔离 | 容器拥有独立的网络设备、IP 地址、端口、路由表和防火墙规则。容器内看到的eth0和宿主机完全不同。 |
| Mnt (Mount) | 文件系统隔离 | 容器拥有独立的目录挂载结构。容器看到的根目录/是基于镜像构建的,看不到宿主机的真实文件系统(除非显式挂载)。 |
| UTS (Unix Time-sharing System) | 主机名隔离 | 容器可以拥有独立的主机名(Hostname)和域名,与宿主机不同。 |
| IPC (Inter-Process Communication) | 进程间通信隔离 | 隔离信号量、消息队列等 IPC 资源。容器内的进程只能与同容器内的进程通信。 |
| User (User ID) | 用户隔离 | (可选/高版本默认) 容器内的 root 用户在宿主机上映射为普通用户,防止容器逃逸提权,增强安全性。 |
1、容易混淆的概念:Cgroups 是做什么的?
很多人会误以为 Cgroups 也负责隔离,这是错误的。
- Namespace = 隔离 (Isolation) -> “我看不到你” (视线阻断)。
- Cgroups = 限制 (Limitation) -> “我不能抢你的资源” (资源配额)。
2、 第三个支柱:UnionFS (联合文件系统)
虽然 UnionFS (如 Overlay2) 不直接负责运行时的“隔离”,但它实现了****镜像的分层存储和**写时复制 (Copy-on-Write)**。
- 它让多个容器可以共享同一个基础镜像层,节省磁盘空间。
- 它保证了容器对文件系统的修改不会影响到镜像本身或其他容器(这也是一种数据层面的隔离)。
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment


