跨 Docker 个容器共享内存:“--ipc=host”与“--ipc=shareable”

Sharing Memory across Docker containers: '--ipc=host' vs. '--ipc=shareable'

我正在设置两个 docker 容器 - 一个作为服务器在内存中保存数据,另一个作为客户端访问该数据。为此,我相信我需要使用 --ipc 标志在容器之间共享内存。 Docker documentation 很好地解释了 --ipc 标志。根据文档,对我来说有意义的是 运行:

docker run -d --ipc=shareable data-server
docker run -d --ipc=container:data-server data-client

但是我读过的所有 Whosebug 问题 (1, , , 4) link 两个容器直接到主机:

docker run -d --ipc=host data-server
docker run -d --ipc=host data-client

哪个更适合这个用例?如果ipc=host更好,你什么时候用ipc=shareable

来自doc

--ipc="MODE" : Set the IPC mode for the container

"shareable": Own private IPC namespace, with a possibility to share it with other containers.

"host": Use the host system’s IPC namespace.

shareablehost的区别在于主机是否可以访问共享内存。

  • IPC(POSIX/SysV IPC)命名空间提供命名共享内存段、信号量和消息队列的分离。因此,两种模式之间的性能应该没有差异。
  • 共享内存通常被数据库和 custom-built(通常 C/OpenMPI,C++/使用 boost 库)高性能应用程序用于科学计算和金融服务行业。

考虑到服务的安全性,使用host会将IPC命名空间暴露给控制主机的攻击者。使用 shareable,IPC 命名空间只能在容器内部访问,其中可能包含任何攻击。 host 模式的存在是为了允许容器与其主机之间的合作。

通常很难了解提问者的所有环境细节和要求,因此 host 往往是最常推荐的,因为它最容易理解和配置。