docker集装箱之间可以共享内存吗?

我使用不同的stream程来处理一个应用程序,并要求我包含那些实现更多隔离的stream程。

问题是这些进程与单个“pipe理程序”进程共享内存以交换数据(它们使用经典的共享缓冲区)。 该解决scheme是为了性能要求而实现的,因为它在用户空间中运行,所以在用户空间和内核空间之间没有内容切换。

如果我没有错,不可能在单个IPC命名空间中运行多个docker容器,但我不知道单个docker容器是否属于不同的IPC命名空间,这可以解决我的问题。

其他解决scheme是值得欢迎的,只要记住,性能是一个要求,在此先感谢。

--ipc=host--ipc=container:id选项已经被添加到Docker的createrun命令中来共享IPC资源。

 --ipc="" : Set the IPC mode for the container, 'container:<name|id>': reuses another container's IPC namespace 'host': use the host's IPC namespace inside the container 

IPC与主机

 docker run --ipc=host <image> 

IPC与另一个容器

 docker run --ipc=container:<id> <image> 

从技术上讲,你可以在容器之间共享相同的IPC名字空间,但是Docker不支持(还)。

如果您可以使用mmap()而不是IPC,那么您可以在两个容器之间共享卷,并映射该卷上的文件; 它将是相同的文件,因此可以正确共享。

如果你真的需要共享IPC命名空间(因为你不能改变现有的代码),那么现在是时候编写一些Go代码并将其提供给Docker 🙂

最简单的path可能是为libcontainer绑定添加一个标志,以便您可以启动一个容器来重用主机(或另一个容器)的IPC名称空间。 检查--net标志的实现,因为它实现了,但是对于networking命名空间。

正如@jpetazzo所build议的那样,我看了一下Docker的源码,并且在#docker-dev上的开发人员的帮助下,我成功地重新编译了Docker以删除IPC命名空间。

为了达到这个目的,有必要在Docker源代码文件夹docker/daemon/execdriver/native/template中的文件default_template.go注释"NEWIPC": true,

旧的代码现在完美地工作。