一,chroot

要了解容器技术,我们就要先了解chroot技术。

什么是chroot呢?通俗来说,其就是用来改变某一个进程的根目录,使得这个进程不能访问该新的根目录之外的其他目录,容器技术则就需要达到这样的一个效果。

以上操作就是将busybox镜像中的目录导出到了该rootfs目录之下。

然后,我们用以上操作,启动一个sh进程,并且把 /root/rootfs作为了 sh 进程的根目录。在这个经进程下,我们会发现根目录已经变成了新的/root/rootfs,访问不了主机上其他的目录了。

这样就实现了容器的目录的隔离机制。

但是我们执行IProute命令查看时,却发现网络信息还是没有隔离,主机上的网络信息照常显示。

实际上,进程等信息此时也没有被隔离。

要想实现一个容器的,我们还需要Linux系统的其他三项技术。

那就是Namespace,Cgroup,UnionFS(联合文件系统)

二,Namespace

Namespace是Linux系统内核中的一项功能,其对内核资源进行隔离,使得容器中的进程都可以在单独的命名空间中运行,并且只可以访问当前容器命名空间中的资源。

Namespace可以用来隔离 进程ID ,主机名 ,用户ID,文件名,网络访问和进程间通信等相关资源。

Docker 主要用到以下的六种命名空间。

pid namespace:主要用于隔离进程ID

net namespace:主要用于隔离网络接口,使用容器内的用户可以拥有独立的IP,路由,端口等

mnt namespace:文件系统挂载点隔离

ipc namespace:信号量,消息队列和共享内存的隔离

uts namespace:主机名和域名的隔离

user namespace:隔离用户和用户组

三,Cgroup(Control Groups)

Cgroup也是一种Linux内核功能,其可以限制和隔离进程的资源使用情况。包括有 CPU,内存,磁盘I/O,网络等。

四,UnionFS(联合文件系统)

是一种通过创建文件层进程操作的文件系统,常用的联合文件系统有AUFS,Overlay和Devicemapper。

Docker使用联合文件系统为容器来提供构建层,使得容器可以实现写时复制和镜像的分层构建和存储。

更多推荐