我处理具有不同进程的应用程序,并且我被要求包含这些进程以实现更多隔离。
问题在于进程与单个“管理程序”进程共享内存以交换数据(它们使用经典的共享缓冲区)。此解决方案是为了满足性能要求而实现的,因为它在用户空间中运行,因此用户空间和内核空间之间没有内容切换。
如果我没错,就不可能在一个IPC命名空间内运行多个docker容器,但我不知道单个docker容器是否可能属于不同的IPC命名空间,这可以解决我的问题问题。
欢迎其他解决方案,请记住,性能是一项要求,提前谢谢。
答案 0 :(得分:21)
此后,--ipc=host
and --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>
答案 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