之前学习了docker的一些原理和文件系统,对于其核心技术namespace和cgroup没有一个很好的认识,下面将记录其知识点
Namespace
概念
namespce资源隔离,又称为命名空间,它主要做访问隔离。其原理是针对一类资源进行抽象,并将其封装在一起提供给一个容器使用,对于这类资源,因为每个容器都有自己的抽象,而他们彼此之间是不可见的,所以就可以做到访问隔离。
docker就是通过这样一种技术,使自己内部进程在不同于外部namespce下进行,以达到独立的隔离的目的
容器6六项隔离
想要实现一个资源隔离的容器,也许第一反应就是chroot命令,隔离文件系统。接着为了在分布式的环境下进行通信和定位,容器必然有独立的IP,端口,路由等,进行网络隔离。同时,容器还需要一个独立的主机名以便在网络中标识自己。有了网络,自然离不开通信,进程间也要隔离。对用户和用户组的隔离实现了用户权限隔离,最后,容器中所运行应用的进程号自然也与宿主机中的PID进行隔离,这样就形成了容器的六项隔离
用图来表述整个隔离过程
图中可以看到宿主机和容器之间有相同的UTS,IPC,PID,Network,Mount,User,
通过隔离使其在不同的命名空间下,这就形成相互不干扰
Namespace API实际操作
namespace的API包括clone()、setns()以及unshare(),还有/proc下的部分文件。为了确定隔离的到底是哪种namespace,在使用这些API时,通常需要指定以下六个常数的一个或多个,通过|(位或)操作来实现。你可能已经在上面的表格中注意到,这六个参数分别是CLONE_NEWIPC、CLONE_NEWNS、CLONE_NEWNET、CLONE_NEWPID、CLONE_NEWUSER