现如今,Docker容器大行其道,容器技术可以看做是沙盒,被装入沙盒的应用可以独立运行,不会互相干扰,也最方便四处搬移。
这个沙盒主要用三种技术隔离出来。
一、Linux namespace
Namespace是基于Linux内核的底层概念,以一种抽象的方式封装内核资源,通过将内核资源放在不同的Namespace中,来实现资源隔离的效果。Linux已提供了以下隔离机制(不同内核版本可能不同)
- Mount:隔离文件系统挂载点
- IPC:隔离进程通信
- Network:隔离网络资源
- PID:进程PID隔离
- User:隔离用户和用户组
- UTS:隔离主机名
虽然Linux提供了如此多的内核资源隔离技术,但需要明确的是,容器本身只是一个应用了多种Namespace的进程而已,多个容器之间仍然共享同一个宿主机的操作系统内核。
二、Linux Cgroup
全称是 Linux Control Group。最主要的作用就是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。同时还有诸如优先级分配,资源统计和任务恢复挂起控制的功能。
在Linux系统中以文件和目录的方式暴露在/sys/fs/cgroup 路径下。在这个目录下,有很多像cpuset、cpu、 memory的子目录,这些就是可以被Cgroups进行限制的资源种类。
三、rootfs根文件系统
rootfs就是所谓的容器镜像,包括了一个完整的操作系统的文件、目录和配置,并不包含操作系统内核。
正是由于rootfs的存在,容器技术所宣传的‘一致性’才得到保证。对于一个镜像而言,打包的不只是应用,还包含操作系统,那么无论在任何一台机器上解压镜像,应用运行的环境就已经重现了出来。
Docker容器的rootfs使用AuFS将多个rootfs联合挂载成一个rootfs。
Docker的rootfs由三部分组成。
- 只读层:包含操作系统的一部分
- 可读写层:存放修改rootfs后产生的增量
-
Init 层:存放 /etc/hosts、/etc/resolv.conf 等只对当前的容器有效的配置