Namespace
Namespace它可以隔离一系列的系统资源,包括进程数、网络接口、挂载点等。它帮助进程隔离出自己单独的空间。
Linux中的6种不同类型的Namespace
| Namespace类型 | 系统调用参数 | | —– | ——- | |Mount Namespace|CLONE_NEWNS| |UTS Namespace|CLONE_NEWUTS| |IPC Namespace|CLONE_NEWIPC| |PID Namespace|CLONE_NEWPID| |Network Namespace|CLONE_NEWNET| |User Namespace|CLONE_NEWWSER|
- UTS Namespace : 对nodename和domainname进行隔离;
- IPC Namespace : 隔离System V IPC和POSIX message queues进行隔离
- PID Namespace : 隔离进程PID;同样的进程在不同的地方看它的pid是不同的,因为它们隔离了;
- Mount Namespace : 隔离各个进程的挂载点视图;不同的Namespace进程中,看到的文件系统层次是不一样的。
- User Namespace : 隔离用户的用户组ID;
- Netword Namespace : 隔离网络设备、IP地址端口等网络栈的Namespace。Namespace可以让每个容器拥有自己独立的网络设备(虚拟的)。每个容器内的端口都不会互相冲突 。
Linux Cgroups
上述是Namspace帮助进程之间隔离出单独的空间。而限制每个空间的大小就要用到Cgroup技术。它提供了一组进程及将来子进程的资源限制控制和统计的能力。资源包括CPU、内存、存储、网络等。
subsystem(子系统)
是一组对资源控制的模块。包含以下几项。
- blkio: 这个 subsystem 可以为块设备设定输入 / 输出限制,比如物理驱动设备(包括磁盘、固态硬盘、USB 等)。
- cpu: 这个 subsystem 使用调度程序控制 task 对 CPU 的使用。
- cpuacct: 这个 subsystem 自动生成 cgroup 中 task 对 CPU 资源使用情况的报告。
- cpuset: 这个 subsystem 可以为 cgroup 中的 task 分配独立的 CPU(此处针对多处理器系统)和内存。
- devices 这个 subsystem 可以开启或关闭 cgroup 中 task 对设备的访问。
- freezer 这个 subsystem 可以挂起或恢复 cgroup 中的 task。
- memory 这个 subsystem 可以设定 cgroup 中 task 对内存使用量的限定,并且自动生成这些 task 对内存资源使用情况的报告。
- perfevent 这个 subsystem 使用后使得 cgroup 中的 task 可以进行统一的性能测试。{
- *net_cls 这个 subsystem Docker 没有直接使用,它通过使用等级识别符 (classid) 标记网络数据包,从而允许 Linux 流量控制程序(TC:Traffic Controller)识别从具体 cgroup 中生成的数据包。
Cgroups(控制组)
对进程分组管理,一个Cgroup包含一组进程。一组Cgroup和一组subsystem系统参数关联起来
hierarchy(层级树)
将一组cgroup串成一个树状结构。通过这种结构,cgroup可以做到继承,即一个cgroup可以继承自另外一个cgroup而不会相互影响到其他cgroup中的进程。
三者的关系
- 一个subsystem只能附加到一个hierarchy上
- 一个hierarchy可以有多个subsystem附加
- 一个进程可以作为多个cgroup中的成员,但是I这些cgroup必须在不同的hierarchy中。
如下图 cpu 和 memory 的 subsystem 附加到了一个 hierarchy。
## Union File System 使用branch把不同文件系统的文件和目录“透明的”覆盖,形成一个单一一致的文件系统。这些branch或者是read-only的,或者是read-write的,所以当对这个虚拟后的联合文件系统进行写操作时,==系统是真正写到一个新的文件中==。表面看起来这个虚拟的联合文件系统是可以对任何文件进行操作的,但是其实它并没有改变原来的文件,而是使用了写时复制,在写资源的时候copy原来资源的副本,然后对其进行写操作,在没写之前该资源就是共享的。
AUFS-Advanced Multi-Layered Unification FIlesystem
完全重写了早起的UnionFX。Docker使用AUFS来作为存储驱动类型,==用来存储image和container==。
我们知道docker是由一层层的r-o layer层堆叠起来的,而下面的镜像层又是可以共用的,而之所以能共用就是因为使用了AUFS存储。当我们拉取一个镜像,该镜像可能由好几个layer层堆叠起来,在该镜像的基础上在创建一个镜像,查看其内部存储便可以发现他下层的layer是共享的,而只会创建出新建的那一层layer。
所以Docker便是利用了AUFS以及COW(写时复制技术)共享和减少磁盘空间的使用。