Docker 容器的隔离性 就是 使用Linux namespace 来隔离运行环境和成 cgroup 限制容器使用的资源。
namespace 可以顾名思义 命名空间;所以可以理解为每个独立的容器的全局资源空间。
Linux从2.4.19 就开始引入了 namespace 概念;
Linux 内核 实现了6 种namespace :
IPC:隔离system V IPC和POSIX消息队列
Network:隔离网络资源
Mount:隔离文件系统挂载点
PID:隔离进程PID
UTS:隔离主机名和域名
User:隔离用户ID和组ID
Linux control group
Linux cgroup 可以控制对系统资源的分配CPU内存 磁盘IO 网络带宽 和设备访问限制设置。
它可以隔离一个进程的集合,分配限制资源CPU 内核使用。
blkio 这个子系统为块设备设定输入/输出限制,比如物理设备(磁盘,固态硬盘,USB 等等)。
cpu 这个子系统使用调度程序提供对 CPU 的 cgroup 任务访问。
cpuacct 这个子系统自动生成 cgroup 中任务所使用的 CPU 报告。
cpuset 这个子系统为 cgroup 中的任务分配独立 CPU(在多核系统)和内存节点。
devices 这个子系统可允许或者拒绝 cgroup 中的任务访问设备。
freezer 这个子系统挂起或者恢复 cgroup 中的任务。
memory 这个子系统设定 cgroup 中任务使用的内存限制,并自动生成内存资源使用报告。
net_cls 这个子系统使用等级识别符(classid)标记网络数据包,可允许 Linux 流量控制程序(tc)识别从具体 cgroup 中生成的数据包。
net_prio 这个子系统用来设计网络流量的优先级
hugetlb 这个子系统主要针对于HugeTLB系统进行限制,这是一个大页文件系统。
Docker 容器使用 Linux cgroup 限制容器使用基础资源。
Docker 启动一个容器后,会在 /sys/fs/cgroup 目录下的各个资源目录下生成以容器 ID 为名字的目录;