Docker隔离核心
Docker 实现“隔离”的核心:在于利用 Linux 内核提供的“Namespace”、和“Control Groups (cgroups) ”这两个特性。
它们共同构建了一个容器运行时的基本隔离环境。
Linux Namespace
Namespace是Linux内核提供的隔离机制,Docker利用Namespace实现容器间的资源隔离。
Namespace 的核心作用:是为一组进程创建一个隔离的执行环境。
使得这些进程只能看到和操作属于它们自己“虚拟”的系统资源实例,而感知不到宿主机或其他 Namespace 中存在的相同资源。
Namespace 是通过内核中的 clone()
系统调用 实现的,Docker 在创建容器时,会给每个容器分配一组独立的 Namespace。
// 简化版伪代码 clone(fn, child_stack, CLONE_NEWUTS | CLONE_NEWNET | CLONE_NEWPID, arg);
每类 namespace 在内核中都有对应的实现结构体,如:
-
struct pid_namespace;
-
struct net;
-
struct uts_namespace;
Namespace 类型 | 隔离资源 | 示例效果 |
---|
pid |
进程编号空间 | 容器内进程从 PID 1 开始 |
net |
网络设备、端口、协议栈 | 容器有自己的 IP、端口、路由表 |
mnt |
文件系统挂载点 | 每个容器拥有自己的 / 根目录 |
uts |
主机名、域名 | 容器可定义 hostname |
Control Groups
Control Groups (cgroups) :是 Linux 内核提供的另一种关键特性,其主要作用:是对一组进程的资源使用进行限制。
限制进程组 (容器) 可以使用的各种资源,如 :CPU、内存、磁盘 I/O 、和网络带宽…等。
可控制的资源 | 举例说明 |
---|---|
CPU | 限制 CPU 核心数、调度权重 |
内存 | 限制最大内存占用、触发 OOM 杀死 |
磁盘 I/O | 控制磁盘读写速度 |
网络带宽 | 限制发送/接收速率(结合 tc 实现) |
子进程数 | 控制最大进程数(防 fork 炸弹) |
Cgroups :是一种 层级化的资源管理机制。
其本质是:进程通过被“打标签”绑定到某个资源控制组中,资源限制通过 cgroup 文件系统进行下发、和监控。
控制组的本质是一个 目录结构 + 控制文件,如:
/sys/fs/cgroup/memory/docker/<container-id>/memory.limit_in_bytes
cgroups 的实现基于以下核心:
控制组 (Control Group)
一个或多个进程的集合,可以对其应用相同的资源限制/和控制策略。
层级 (Hierarchy)
cgroups 以树状层级结构进行组织,每个层级可以关联一个或多个子系统。
子系统 (Subsystem)
也称为资源控制器,用于控制特定类型的资源。
常见的子系统包括 cpu
、memory
、blkio
(块设备 I/O)、net_cls
(网络分类)、net_prio
(网络优先级) 等。
mikechen
mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!

后台回复【架构】即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》