我在一个具有不同进程的应用程序上工作,我被要求包含这些进程以实现更多的隔离。
问题在于,为了交换数据,这些进程与单个“系统管理程序”进程共享内存(它们使用经典的共享缓冲区)。这个解决方案是为了满足性能要求而实现的,并且由于它是在用户空间运行的,所以不存在用户空间和内核空间之间的内容切换。
如果我没弄错,不可能在单个IPC名称空间中运行多个docker容器,但我不知道单个docker容器是否可能属于不同的IPC名称空间,这可以解决我的问题。
欢迎其他解决方案,只需记住性能是一个要求,提前感谢。
发布于 2014-05-28 00:57:51
从技术上讲,您可以在容器之间共享相同的IPC名称空间,但Docker还不支持这一点。
如果您可以使用mmap()
而不是IPC,那么您可以在两个容器之间共享一个卷,并在该卷上映射一个文件;它将是相同的文件,因此可以正确地共享。
如果您确实需要共享IPC名称空间(因为您不能更改现有代码),那么是时候编写一些Go代码并将其贡献给Docker :-)
最简单的方法可能是向libcontainer绑定添加一个标志,这样您就可以重用主机(或另一个容器)的IPC名称空间来启动容器。检查--net
标志的实现,因为除了网络名称空间之外,它确实实现了这一点。
发布于 2014-10-02 21:32:46
根据@jpetazzo的建议,我查看了Docker的源代码,并且在#docker-dev上的开发人员的帮助下,我成功地recompiled Docker了,以便删除IPC名称空间。
要实现这一点,有必要在Docker源代码的docker/daemon/execdriver/native/template
文件夹中的default_template.go
文件中注释"NEWIPC": true,
行。
旧的代码现在可以完美地工作。
发布于 2020-11-05 19:06:55
下面是它的工作原理:
使用可共享的ipc启动容器
docker run -it --rm --ipc="shareable" --name cont1 ubuntu
然后启动下一个容器并与其ipc共享
docker run -it --rm --name cont2 --ipc container:cont1 ubuntu
https://stackoverflow.com/questions/23889187
复制相似问题