docker集装箱之间可以共享内存吗?
我使用不同的stream程来处理一个应用程序,并要求我包含那些实现更多隔离的stream程。
问题是这些进程与单个“pipe理程序”进程共享内存以交换数据(它们使用经典的共享缓冲区)。 该解决scheme是为了性能要求而实现的,因为它在用户空间中运行,所以在用户空间和内核空间之间没有内容切换。
如果我没有错,不可能在单个IPC命名空间中运行多个docker容器,但我不知道单个docker容器是否属于不同的IPC命名空间,这可以解决我的问题。
其他解决scheme是值得欢迎的,只要记住,性能是一个要求,在此先感谢。
--ipc=host
和--ipc=container:id
选项已经被添加到Docker的create
和run
命令中来共享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,
。
旧的代码现在完美地工作。
- 更新Docker容器内的wordpress插件
- Docker:使用本地文件夹中的文件
- 如何在传播IP地址时避免Docker中多余的容器链接?
- 相同的docker文件给予不同的行为
- 当多个连接打开时,Ping超时
- 如何确定给定的docker环境是基于libcontainer还是lxe
- docker构build如何使用centos运行中间容器:systemd
- 能够连接到本地运行在Docker容器中的MongoDB,但不能从另一个容器中运行
- exec();(docker java api version 0.10.4)无法反序列化int的实例超出VALUE_FALSE标记,而readngdocker信息client.infoCmd()