Docker 基础:从虚拟化到容器化
理解虚拟化和容器化
在深入 Docker 之前,我们需要厘清几个核心概念。物理机指的是实际的服务器或计算机,相对于虚拟机而言,它是实体硬件的称呼。
虚拟化是指通过技术将一台计算机虚拟为多台逻辑计算机。在一台物理机上同时运行多个逻辑环境,每个环境可运行不同的操作系统,且应用相互独立,互不影响,从而显著提高资源效率。
容器化则是操作系统层级的虚拟化技术。它将操作系统内核虚拟化,允许用户空间软件实例被分割成几个独立的单元在内核中运行。这些实例被称为容器(Containers)。对使用者来说,容器就像专用的服务器。Docker 是目前容器技术的事实标准。
形象类比
- 物理机:像一座庄园,独立占用土地,花园、设施全归自己,无法共享。
- 虚拟机:像开发商的一个楼盘。一栋楼一套房,大家共享宅基地、小区花园和游乐设施,但每户人家相对独立。
- 容器:像在一个房子里开辟出的胶囊公寓。共享卫生间、厨房、WiFi,只有私人物品是自己的。体积更小,启动更快。
为什么要用虚拟化和容器化?
随着技术发展,资源隔离带来了显著收益:
- 资源利用率高:整合低利用率服务器,用更少硬件跑更多业务。比如复用土地,成本不变但使用人数增加。
- 环境标准化:一次构建,随处执行。解决开发、测试、生产环境不一致导致的 Bug,确保「在我机器上没问题」的场景不再发生。
- 弹性伸缩:根据业务动态调整资源。例如双 11 扩容 100 个服务,活动结束后回收。
- 差异化环境提供:无需购买多物理机即可同时提供 Ubuntu 和 CentOS 等不同环境。
- 沙箱安全:避免不安全软件影响系统稳定性。容器内执行破坏性操作(如
rm -rf /*)不会搞死宿主机。 - 轻量快速:传统虚拟机启动需数分钟,Docker 容器直接运行于宿主内核,秒级甚至毫秒级启动。
- 维护扩展容易:分层存储和镜像技术便于复用和维护。基于官方镜像定制成本低。
虚拟化实现方式
应用程序执行环境分层
从下往上依次为:
- 硬件层:指令集架构、设备及访问接口。
- 操作系统层:系统调用接口,管理硬件资源。
- 程序库层:数据结构定义及函数调用接口。
常见类别
- 虚拟机:存在于硬件层和操作系统层间。通过伪造硬件抽象接口,将整个操作系统嫁接到硬件上。功能接近物理机。
- 容器:存在于操作系统层和函数库层之间。通过伪造操作系统接口,将应用层置于操作系统上。Docker 基于 Linux 的 Namespace 和 Cgroup 实现。相比虚拟机封装整个 OS,容器封装单个应用,体积小、资源占用少。
- JVM 等虚拟机:存在于函数库层和应用程序之间。Java 虚拟机建立抽象层,适应不同操作系统函数库,提供统一运行环境。
主机虚拟化实现
- Type1 Hypervisor:直接运行在硬件之上,无宿主机 OS。典型如 Xen、Vmware ESX。
- Type2 Hypervisor:运行在宿主机 OS 之上。Hypervisor 作为应用程序存在,客户机是宿主机上的进程。典型如 Vmware Workstation。
容器虚拟化核心机制
容器虚拟化是操作系统层的虚拟化,核心依靠 Namespace 进行隔离,Cgroups 进行资源控制。


