代码之家  ›  专栏  ›  技术社区  ›  eraoul

在Docker容器之间传输数据最有效的方法是什么

  •  11
  • eraoul  · 技术社区  · 8 年前

    什么是读取此流的有效方法?理想情况下,我希望第一个容器写入某种共享内存缓冲区,第二个容器可以从中读取,但我不认为单独的Docker容器可以共享内存。也许有一个共享文件指针的解决方案,将文件保存到内存中的文件系统?

    我的目标是最大限度地提高性能,尽可能减少无用的数据拷贝从一个缓冲区到另一个缓冲区。

    编辑

    2 回复  |  直到 8 年前
        1
  •  6
  •   mviereck    8 年前

    mkfifo /tmp/myfifo . 与两个容器共享: --volume /tmp/myfifo:/tmp/myfifo:rw

    您可以直接使用它:

    • 从容器1: echo foo >>/tmp/myfifo

    • 在容器2中: read var </tmp/myfifo

    避免阻塞:在两个容器中,都运行bash exec 3<>/tmp/myfifo

    • 从容器1: echo foo >&3

    • 在容器2中: read var <&3 (或例如。 cat <&3 )

    此解决方案使用 exec 文件描述符处理来自 bash . 我不知道怎么做,但其他语言也可以。

        2
  •  3
  •   inquisitive    8 年前

    使用简单的TCP套接字将是我的首选。只有当测量结果表明,我们绝对需要从系统中挤出最后一点性能时,我才会回到系统、管道或共享内存中。

    从问题陈述来看,进程似乎受到本地CPU/mem资源的约束,限制因素不是外部服务。在这种情况下,让生产者和消费者在同一台机器上(作为docker容器)可能会先绑定CPU资源,然后再执行其他操作——但我将首先进行度量。

    开发代码的大部分精力都花在维护代码上。所以我倾向于主流做法。TCP协议栈有着坚实的基础,它尽可能地优化了性能。还有更多(完全?)可跨平台和框架移植。通过TCP进行通信时,同一主机上的Docker容器不会触网。如果某一天进程确实达到了资源限制,您可以通过在物理主机上拆分生产者和消费者来横向扩展—手动或使用Kubernetes。在这种情况下,TCP将无缝工作。如果您永远不需要这样的吞吐量,那么在进程间通信中也不需要系统级的复杂度。

    通过TCP。

    推荐文章