是否可以在docker容器之间共享内存?

时间:2014-05-27 12:14:59

标签: docker linux-containers

我处理具有不同进程的应用程序,并且我被要求包含这些进程以实现更多隔离。

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

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

欢迎其他解决方案,请记住,性能是一项要求,提前谢谢。

4 个答案:

答案 0 :(得分:21)

此后,--ipc=host and --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>

答案 1 :(得分:12)

从技术上讲,您可以在容器之间共享相同的IPC命名空间,但Docker不支持(尚未)。

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

如果你真的需要共享IPC命名空间(因为你无法更改现有代码),那么是时候编写一些Go代码并将其贡献给Docker: - )

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

答案 2 :(得分:7)

根据@jpetazzo的建议,我查看了Docker的来源,并在#docker-dev的开发人员的帮助下成功recompiled Docker以删除IPC命名空间。

为实现此目的,有必要对位于Docker源代码的文件夹"NEWIPC": true,中的文件default_template.go中的行docker/daemon/execdriver/native/template进行评论。

旧代码现在完美无缺。

答案 3 :(得分:0)

它是如何工作的:

使用可共享的ipc启动容器

docker run -it --rm --ipc="shareable" --name cont1 ubuntu

然后启动下一个容器并与其ipc共享

docker run -it --rm --name cont2 --ipc container:cont1 ubuntu