Linux.中国 - 开源社区

 找回密码
 骑士注册

QQ登录

微博登录


Docker背后的内核知识:命名空间资源隔离

2015-3-15 21:34    评论: 5 收藏: 2 分享: 16    

3. IPC(Interprocess Communication)namespace

容器中进程间通信采用的方法包括常见的信号量、消息队列和共享内存。然而与虚拟机不同的是,容器内部进程间通信对宿主机来说,实际上是具有相同PID namespace中的进程间通信,因此需要一个唯一的标识符来进行区别。申请IPC资源就申请了这样一个全局唯一的32位ID,所以IPC namespace中实际上包含了系统IPC标识符以及实现POSIX消息队列的文件系统。在同一个IPC namespace下的进程彼此可见,而与其他的IPC namespace下的进程则互相不可见。

IPC namespace在代码上的变化与UTS namespace相似,只是标识位有所变化,需要加上CLONE_NEWIPC参数。主要改动如下,其他部位不变,程序名称改为ipc.c。{测试方法参考自:http://crosbymichael.com/creating-containers-part-1.html}

//[...]
int child_pid = clone(child_main, child_stack+STACK_SIZE,
           CLONE_NEWIPC | CLONE_NEWUTS | SIGCHLD, NULL);
//[...]

我们首先在shell中使用ipcmk -Q命令创建一个message queue。

root@local:~# ipcmk -Q
Message queue id: 32769

通过ipcs -q可以查看到已经开启的message queue,序号为32769。

root@local:~# ipcs -q
------ Message Queues --------
key        msqid   owner   perms   used-bytes   messages
0x4cf5e29f 32769   root    644     0            0

然后我们可以编译运行加入了IPC namespace隔离的ipc.c,在新建的子进程中调用的shell中执行ipcs -q查看message queue。

root@local:~# gcc -Wall ipc.c -o ipc.o && ./ipc.o
程序开始:
在子进程中!
root@NewNamespace:~# ipcs -q
------ Message Queues --------
key   msqid   owner   perms   used-bytes   messages
root@NewNamespace:~# exit
exit
已退出

上面的结果显示中可以发现,已经找不到原先声明的message queue,实现了IPC的隔离。

目前使用IPC namespace机制的系统不多,其中比较有名的有PostgreSQL。Docker本身通过socket或tcp进行通信。

查看其它分页:

发表评论


最新评论

我也要发表评论

sailingsz 2015-3-16 09:53  新浪微博网友评论
@我的印象笔记
回复
_BrianChen 2015-3-16 00:33  新浪微博网友评论
@我的印象笔记
回复
lestat_henry 2015-3-15 23:33  新浪微博网友评论
@我的印象笔记 比起2.6的时候,内核对ns的支持完善不少啊
回复
颓颓熊 2015-3-15 22:03  新浪微博网友评论
@我的印象笔记
7 回复
大水坛坛 2015-3-15 22:03  新浪微博网友评论
@mywiz
7 回复

热点评论

大水坛坛 2015-3-15 22:03
@mywiz
7
颓颓熊 2015-3-15 22:03
@我的印象笔记
7
返回顶部

分享到微信朋友圈

打开微信,点击底部的“发现”,
使用“扫一扫”将网页分享至朋友圈。