云原生是现代化大型架构的核心,而Docker作为容器化技术的基石,其底层原理值得深入探讨。
Docker核心技术
Docker 本质上是一种容器化技术,它并非虚拟出一个完整的操作系统,而是利用 Linux 内核的特性在宿主机上运行多个隔离的、轻量级的“容器”。
图1:Docker与Linux内核组件关系架构图

其核心依赖于 Linux 内核的三大技术:Namespaces(命名空间)、Cgroups(控制组) 和 UnionFS(联合文件系统)。这些技术共同协作,实现了容器的资源隔离、资源限制和高效的镜像分层管理。
Namespaces(命名空间)
Namespaces 为每个容器构建了一个独立的系统资源视图,可以将其理解为一个“隔离的平行世界”。
Linux 提供了多种命名空间,例如 PID、NET、MNT、UTS、IPC、USER 等,它们为容器内的进程创建了独立的运行环境。
图2:Docker镜像分层与容器层示意图

具体来说:
- PID Namespace:容器内的进程拥有独立的进程ID编号空间。在容器内看到的 PID 1(初始化进程),在宿主机上只是一个普通的进程。
- Network Namespace:每个容器拥有自己独立的虚拟网络栈,包括网卡、IP地址、路由表和端口空间,实现了容器间的网络隔离。
- Mount Namespace:容器拥有独立的文件系统挂载点视图,使其只能看到自己被允许访问的目录,无法直接访问宿主机的根文件系统。
通过这些命名空间,容器内的进程拥有了独立的进程树、网络环境、文件系统视图和主机名等,实现了良好的隔离性。
Cgroups(控制组)
如果说 Namespaces 负责“隔离”,那么 Cgroups 则负责“限制”。控制组(cgroups)技术用于对进程组使用的资源进行配额、限制和统计管理。
图3:Kubernetes管理Docker与ECS集群架构示意图

Cgroups 可以针对 CPU、内存、磁盘 I/O、网络带宽等关键资源进行精细化控制:
- CPU子系统:可以限制容器对CPU核心的使用比例或时间片配额。
- Memory子系统:限制容器可使用的内存上限,并能在内存不足时触发OOM(内存溢出)控制。
- BlkIO子系统:限制容器的磁盘读写速率。
- Net子系统:设置网络流量的优先级。
Cgroups 确保了单个容器不会无节制地消耗宿主机资源,从而保障了宿主机的稳定性和多容器环境的公平性。
UnionFS(联合文件系统)
UnionFS(联合文件系统)是 Docker 镜像和容器高效存储的基石。它允许将多个目录(称为“层”)透明地叠加在一起,形成一个统一的文件系统视图。
图4:基于基础镜像安装软件的分层过程图

Docker 镜像正是由多个只读的镜像层(Layer)组成。基于 OverlayFS、AUFS 等联合文件系统驱动,Docker 将这些层合并为容器所看到的单一根文件系统。
当启动一个容器时,Docker 会在所有只读层之上添加一个薄薄的可写层(容器层)。所有对容器文件系统的修改都发生在这个可写层中。底层技术采用 写时复制(Copy-on-Write) 策略:只有当需要修改某个文件时,才会将该文件从下层只读层复制到可写层进行修改,从而极大地节省了存储空间并加速了镜像的分发与启动。
这种分层与写时复制的设计,使得不同的镜像可以共享相同的基础层,大大提升了存储效率,也便于进行镜像的构建、分发和版本管理。
|