容器内的文件系统
容器的进程理应是一份完整独立的文件系统。这样就可以在自己的文件系统下进行操作,而不会受宿主机及其他容器的影响。
Mount Namespace
我们很容易就想到了mount namespace。
int pid = clone(main_function, stack_size, CLONE_NEWNS | SIGCHLD, NULL);
创建一个新的进程,声明启动mount namespace(CLONE_NEWNS标志),但是这样的方式容器内部还是看到的是宿主机的文件系统。
问题:mount namespace修改的是容器进程对文件系统“挂载点”的认知。这意味,只有在“挂载”这个操作发生之后,进程的视图才会被改变。在此之前,容器进程会继承宿主机的各个挂载点。
这个时候,就要在创建容器进程时,除了声明启用mount namespace之外,还要告诉容器进程,有哪些目录需要重新挂载。
如:
mount("none", "/tmp", "tmpfs", 0, "")
告诉容器以temps(内存盘)格式,重新挂载/tmp目录
这样:
在容器中,就发现/tmp挂载成功,查看是个空的目录
在宿主机,因为有启动了namespace隔离,所以是不存在的。
所以mount namespace跟其他namespace的使用略有不同:它对容器进程视图的改变,一定伴随着挂载(mou