在Docker容器之间共享内存:'--ipc=host'与'--ipc=shareable'的区别

6
我正在设置两个Docker容器 - 一个作为服务器将数据保存在内存中,另一个作为客户端访问该数据。为了实现这一点,我认为我需要使用--ipc标志在容器之间共享内存。 Docker 文档 很好地解释了--ipc标志。 根据文档,对我来说有意义的是运行以下命令:
docker run -d --ipc=shareable data-server
docker run -d --ipc=container:data-server data-client

我读过的所有Stackoverflow问题(1234)都将两个容器直接链接到主机:

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

在这种情况下哪个更合适?如果 ipc=host 更好,那么何时使用 ipc=shareable

1个回答

4

来源于文档:

--ipc="MODE" : 为容器设置 IPC 模式

"shareable": 拥有私有 IPC 命名空间,可以与其他容器共享。

"host": 使用主机系统的 IPC 命名空间。

shareablehost之间的区别在于主机是否能够访问共享内存。

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

考虑到服务的安全性,使用 host 将 IPC 命名空间暴露给控制主机机器的攻击者。而对于 shareable,IPC 命名空间仅在容器内部可访问,这可能包含任何攻击。 host 模式存在是为了允许容器和其主机协同工作。

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


1
所以两种方法都是有效的,但第一种选项对于容器来说更安全? - Jacob Stern
1
是的,就是这样。如果不仅在容器之间共享,还可以使用主机。 - atline
明白了,还有一个问题:shareable是可选的吗?这篇博客这个帖子似乎没有提到它。 - Jacob Stern
我猜这意味着如果你不需要像容器之间的共享内存这样的东西,那么你可以将其关闭,而可以使用套接字或其他方式。但是,如果你关心通信速度,并且想要使用共享内存,那么你必须打开它。这取决于你的应用场景,这是一个选项。 - atline

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接