docker使用chroot+namespace+cgroup实现沙箱隔离。
- namespace:命名空间,容器隔离的基础,保证A容器看不到B容器.
7个命名空间:cggroup、User,Mnt,Network,UTS,IPC,Pid。
一个namespace相当于一台独立的裸机。 - cggroup:是 Control Group 的缩写,控制组。通过cgroup可限制每个容器可使用的cpu、内存、磁盘、带宽等资源。实现容器资源的统计与隔离。
主要用到的cgroups子系统:cpu,blkio,device,freezer,memory
一个cgroup相当于限定了通过namespece创建的裸机的各个硬件配置。 - unionfs 联合文件系统(或AUFS):docker分层镜像的实现理论依据。典型:aufs/overlayfs,分层镜像实现的基础。
UnionFS 其实是一种为 Linux 操作系统设计的用于把多个文件系统通过mount命令『联合』到同一个挂载点的文件系统服务。Docker Image 就是一个文件系统,对外是以一个文件的形式展示的(更准确的说是一个 mount 点)。Image 是 Docker 部署的基本单位,一个 Image 包含了我们的程序文件,以及这个程序依赖的资源的环境。
AUFS 即 Advanced UnionFS 其实就是 UnionFS 的升级版,它能够提供更优秀的性能和效率。AUFS 作为先进联合文件系统,它能够将不同文件夹中的层联合(Union)到了同一个文件夹中,这些文件夹在 AUFS 中称作分支,整个『联合』的过程被称为联合挂载(Union Mount)。
Docker容器的文件系统最早是建立在Aufs基础上的,Aufs是一种Union FS,简单来说就是支持将不同的目录挂载到同一个虚拟文件系统之下并实现一种laver的概念,
由于Aufs未能加入到linux内核中,考虑到兼容性的问题,便加入了Devicemapper的支持,Docker目前默认是建立在Devicemapper基础上,
devicemapper用户控件相关部分主要负责配置具体的策略和控制逻辑,比如逻辑设备和哪些物理设备建立映射,怎么建立这些映射关系等,而具体过滤和重定向IO请求的工作有内核中相关代码完成,因此整个device mapper机制由两部分组成–内核空间的device mapper驱动,用户控件的device mapper库以及它提供的dmsetup工具;
namespace+cggroup相当于一台指定硬件配置的裸机,但上面还没有安装操作系统,而docker镜像就像是一个操作系统的安装包,通过unionfs服务安装到了这台电脑上。 - docker容器:namespace+cgroup+unionfs相当于一台计算机+操作系统的制造模板,真正运行起来的实例才是一台具体的计算机,这就是docker容器。一个docker容器实例就是一台真正意义上的计算机,每个docker容器都具备不同的namespace+cgroup+unionfs,多个容器之间彼此互相隔离。
namespace
命名空间(namespaces)是 Linux 为我们提供的用于分离进程树、网络接口、挂载点以及进程间通信等资源的方法。在日常使用 Linux 或者 macOS 时,我们并没有运行多个完全分离的服务器的需要,但是如果我们在服务器上启动了多个服务,这些服务其实会相互影响的,每一个服务都能看到其他服务的进程,也可以访问宿主机器上的任意文件,这是很多时候我们都不愿意看到的,我们更希望运行在同一台机器上的不同服务能做到完全隔离,就像运行在多台不同的机器上一样。
Linux 的命名空间机制提供了以下七种不同的命名空间,通过这七个选项, 我们能在创建新的进程时, 设置新进程应该在哪些资源上与宿主机器进行隔离。具体如下:
Chroot
为了保证当前的容器进程没有办法访问宿主机器上其他目录,我们在这里还需要通过 libcotainer 提供的 pivor_root 或者 chroot 函数改变进程能够访问个文件目录的根节点。
在这里不得不简单介绍一下 chroot(change root),在 Linux 系统中,系统默认的目录就都是以 / 也就是根目录开头的,chroot 的使用能够改变当前的系统根目录结构,通过改变当前系统的根目录,我们能够限制用户的权利,在新的根目录下并不能够访问旧系统根目录的结构个文件,也就建立了一个与原系统完全隔离的目录结构。
总结
总之:dockers=LXC+AUFS
docker为LXC+AUFS组合:
LXC负责资源管理
AUFS负责镜像管理;
而LXC包括cgroup,namespace,chroot等组件,并通过cgroup资源管理,那么,从资源管理的角度来看,Docker,Lxc,Cgroup三者的关系是怎样的呢?
cgroup是在底层落实资源管理,LXC在cgroup上面封装了一层,随后,docker有在LXC封装了一层;
【云原生-Kubernetes篇】深入刨析Kubernetes_掂掂三生有幸的博客-CSDN博客_深入刨析kubernetes