Docker是如何“隔离”一切的?底层原理深度剖析!

Docker隔离核心

Docker 实现“隔离”的核心:在于利用 Linux 内核提供的“Namespace”、和“Control Groups (cgroups) ”这两个特性。

Docker是如何“隔离”一切的?底层原理深度剖析!-mikechen

它们共同构建了一个容器运行时的基本隔离环境。

 

Linux Namespace

Namespace是Linux内核提供的隔离机制,Docker利用Namespace实现容器间的资源隔离。

Namespace 的核心作用:是为一组进程创建一个隔离的执行环境。

Docker是如何“隔离”一切的?底层原理深度剖析!-mikechen

使得这些进程只能看到和操作属于它们自己“虚拟”的系统资源实例,而感知不到宿主机或其他 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 、和网络带宽…等。

Docker是如何“隔离”一切的?底层原理深度剖析!-mikechen

可控制的资源 举例说明
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)

也称为资源控制器,用于控制特定类型的资源。

常见的子系统包括 cpumemoryblkio (块设备 I/O)、net_cls (网络分类)、net_prio (网络优先级) 等。

mikechen

mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

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

评论交流
    说说你的看法