首页 > 解决方案 > 如何使用 Docker 正确使用共享内存 (dev/shm)?

问题描述

我使用这篇博文创建了一个 Kerberos sidecar:

Sidecar 可以在 Docker 中启动,并写入 /dev/shm(共享内存)中的票证缓存。

接下来,我有另一个要读取票证缓存的应用程序容器,因此我尝试在两个容器之间使用共享内存。

我尝试了以下方法:

这将以分离模式启动 sidecar:

docker run -d  --ipc=host --name ksidecar ksidecar

接下来,我使用相同的命名空间(“Host”)启动应用程序容器。

docker run --ipc=container:host -p 5000:5000 --name myapp myapi 

Sidecar 完成了它应该做的事情并写入 /dev/shm。

应用容器根本看不到任何值。

我已经尝试修改“-ipc”设置。对我来说最有意义的配置是将--ipc=shareable用于 sidecar,将 --ipc=container:ksidecar用于应用容器。但是当我这样做时,我得到:

docker:来自守护进程的错误响应:无法加入容器 516dcc29a0f421b812380378ecc4f6de0032679319bdea4d2279946f4c3d2be2 的 IPC:不可共享的 IPC(提示:使用 IpcMode:shareable 用于供体容器。

当然,如你所见,我已经做到了。

我可能做错了什么。但是我已经进行了数小时的搜索和各种实验,但仍然无法使其正常工作。

希望有人能给出一个答案或一个例子,说明他们如何使用 Docker 容器完成共享内存。

标签: linuxdockerkerberosshared-memorysidecar

解决方案


您的myapp容器应设置为使用与hostsidecar 相同的 IPC 命名空间。

docker run --ipc=host -p 5000:5000 --name myapp myapi 

如果您希望您的应用程序与边车共享相同的命名空间,您首先需要将边车的 IPC 命名空间设置为shareable.

docker run -d  --ipc=shareable --name ksidecar ksidecar

然后为您的应用程序使用该命名空间。

docker run --ipc=container:ksidecar -p 5000:5000 --name myapp myapi 

推荐阅读