我在一个具有不同进程的应用程序上工作,我被要求包含这些进程以实现更多隔离。
问题是进程与单个“管理程序”进程共享内存以交换数据(它们使用经典的共享缓冲区)。这个解决方案是为了性能要求而实现的,因为它是在用户空间中运行的,所以用户空间和内核空间之间没有内容切换。
如果我没记错的话,不可能在单个 IPC 命名空间内运行多个 docker 容器,但我不知道单个 docker 容器是否可能属于不同的 IPC 命名空间,这可以解决我的问题。
欢迎使用其他解决方案,请记住,性能是一项要求,在此先感谢。
我在一个具有不同进程的应用程序上工作,我被要求包含这些进程以实现更多隔离。
问题是进程与单个“管理程序”进程共享内存以交换数据(它们使用经典的共享缓冲区)。这个解决方案是为了性能要求而实现的,因为它是在用户空间中运行的,所以用户空间和内核空间之间没有内容切换。
如果我没记错的话,不可能在单个 IPC 命名空间内运行多个 docker 容器,但我不知道单个 docker 容器是否可能属于不同的 IPC 命名空间,这可以解决我的问题。
欢迎使用其他解决方案,请记住,性能是一项要求,在此先感谢。
和选项已被添加到 Docker和--ipc=host命令--ipc=container:id中以共享 IPC 资源。createrun
--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 可能需要在shareable初始容器上设置选项(如果 dockerd 默认 IPC 为private)
docker run --ipc=shareable <image>
从技术上讲,您可以在容器之间共享相同的 IPC 命名空间,但 Docker 不支持(目前)。
如果您可以使用mmap()而不是 IPC,那么您可以在两个容器之间共享一个卷,并在该卷上映射一个文件;它将是同一个文件,因此可以正确共享。
如果您确实需要共享 IPC 命名空间(因为您无法更改现有代码),那么是时候编写一些 Go 代码并将其贡献给 Docker 了 :-)
最简单的方法可能是向 libcontainer 绑定添加一个标志,以便您可以重新使用主机(或另一个容器)的 IPC 命名空间来启动容器。检查--net标志的实现,因为它完全实现了这一点,但对于网络命名空间。
正如@jpetazzo所建议的那样,我查看了 Docker 的源代码,并且在#docker-dev上的开发人员的帮助下,我成功地重新编译了 Docker以删除 IPC 命名空间。
为此,需要注释位于Docker 源代码文件夹中的"NEWIPC": true,文件中的行。default_template.godocker/daemon/execdriver/native/template
旧代码现在可以完美运行。
这是如何工作的:
使用可共享的 IPC 启动容器
docker run -it --rm --ipc="shareable" --name cont1 ubuntu
然后启动下一个容器并与其 IPC 共享
docker run -it --rm --name cont2 --ipc container:cont1 ubuntu