如果2个进程namespace号相同,说明它们在同一个namespace下。
/proc/[pid]/ns里设置这些符号链接的另一个作用是,一旦上述链接文件被打开,那么就算该namespace下的所有进程都已经结束,这个namespace也会一直存在,后续进程也可以再加进来。在Docker中,通过文件描述符定位和加入一个存在的namespace是最基本的方式。
另外,把/proc/[pid]/ns目录文件使用–bind方式挂载起来可以直到同样的作用:
# mount --bind /proc/2454/ns/uts uts通过setns()加入一个已经存在的namespace
上面提到,在进程都结束的情况下,也可以通过挂载的形式把namespace保留下来,保留namespace的目的是为以后有进程加入做准备。在Docker中,使用docker exec命令在已经运行着的容器中执行一个新命令,就需要用到该方法。通过setns()系统调用,进程从原先的namespace加入某个已经存在的namespace,使用方法如下。通常为了不影响进程的调用者,也为了使新加入的pid namespace生效,会在setns()函数执行后使用clone创建子进程继续执行命令,让原先的进程结束。
NAME
setns - reassociate thread with a namespace
SYNOPSIS
#define _GNU_SOURCE /* See feature_test_macros(7) */
#include <sched.h>
int setns(int fd, int nstype);
fd = open(argv[1],O_RDONLY);
setns(fd,0);
execvp(argv[2],&argv[2]); 假设编译后的程序为”setns-test”
# ./setns-test ~/uts /bin/bash
至此,就可以在新加入的namespace中执行shell命令了。
通过unshare()在原先进程上进行namespace隔离
它与clone()很像,不同的是,unshare()运行在原先的进程上,不需要启动一个新进程。
NAME
unshare - disassociate parts of the process execution context
SYNOPSIS
#include <sched.h>
int unshare(int flags); 调用unshare()的主要作用就是不启动一个新进程就可以起到隔离的效果,相当跳出原先的namespace进行操作。这样,就可以在原进程进行一些需要隔离的操作。Linux自带的unshare命令,就是通过unshare()系统调用实现的。Docker目前并没有使用这个系统调用。
总结
以上就是本文关于Docker探索namespace详解的全部内容,希望对大家有所帮助,感兴趣的朋友可以继续参阅本站:浅谈Docker安全机制内核安全与容器之间的网络安全、详解Docker使用Linux iptables 和 Interfaces管理容器网络等,有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对本站的支持!










