【问题标题】:Is it possible to share memory between docker containers?是否可以在 docker 容器之间共享内存?
【发布时间】:2014-07-16 08:27:42
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: docker linux-containers


    【解决方案1】:

    --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>
    

    IPC 与另一个容器可能需要在初始容器上设置 shareable 选项(如果 dockerd 默认 IPC 为 private

    docker run --ipc=shareable <image>
    

    【讨论】:

      【解决方案2】:

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

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

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

      最简单的方法可能是在 libcontainer 绑定中添加一个标志,这样您就可以重新使用主机(或另一个容器)的 IPC 命名空间来启动容器。检查 --net 标志的实现,因为它完全实现了这一点,但对于网络命名空间。

      【讨论】:

      • (我不知道这是否是一个真正的问题,但是将 tmpfs 用于共享卷会减少不必要地将任何内容刷新到磁盘的机会。)
      • 这是很棒的信息。但是我如何验证它是否在掩护下这样做。我的意思是不刷新到磁盘。有什么想法吗?
      【解决方案3】:

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

      为此,需要在 Docker 源代码的文件夹 docker/daemon/execdriver/native/template 中的文件 default_template.go 中注释 "NEWIPC": true, 行。

      旧代码现在可以完美运行。

      【讨论】:

        【解决方案4】:

        这里是如何工作的:

        使用可共享的 ipc 启动容器

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

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

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

        【讨论】:

          猜你喜欢
          • 2020-10-06
          • 2021-06-20
          • 2021-10-27
          • 2015-07-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多