Можно ли делиться памятью между контейнерами докеров?

Я работаю над приложением с разными процессами, и мне предлагается содержать эти процессы для достижения большей изоляции.

Проблема заключается в том, что процессы обмениваются памятью с помощью одного процесса "гипервизора" для обмена данными (они используют классические общие буферы). Это решение было реализовано для требований к производительности и потому, что оно работает в пользовательском пространстве, поэтому нет переключения между пользовательским пространством и пространством ядра.

Если я не ошибаюсь, невозможно запустить более одного контейнера докеров в одном пространстве имен IPC, но я не знаю, возможно ли, что один контейнер докеров принадлежит к различным пространствам имен IPC, это может решить мою проблему проблема.

Другие решения приветствуются, просто имейте в виду, что производительность - это требование, спасибо заранее.

Ответ 1

Как было предложено @jpetazzo, я искал источник Docker, а также с помощью разработчиков dev на # docker-dev Я успешно перекомпилировал Docker, чтобы удалить пространство имен IPC.

Для этого необходимо прокомментировать строку "NEWIPC": true, в файле default_template.go, расположенном в папке docker/daemon/execdriver/native/template исходного кода Docker.

Старый код теперь работает отлично.

Ответ 2

Параметры --ipc=host и --ipc=container:id с тех пор были добавлены в Docker create и run команды для совместного использования ресурсов IPC.

--ipc=""  : Set the IPC mode for the container,
             'container:<name|id>': reuses another container IPC namespace
             'host': use the host IPC namespace inside the container

IPC с хостом

docker run --ipc=host <image>

IPC с другим контейнером

docker run --ipc=container:<id> <image>

Ответ 3

Технически вы можете использовать одно и то же пространство имен IPC между контейнерами, но Docker не поддерживает это (пока).

Если вы можете использовать mmap() вместо IPC, то вы можете обмениваться томом между обоими контейнерами и отображать файл на этом томе; он будет тем же самым файлом и поэтому будет правильно передан.

Если вам действительно нужно поделиться пространством имен IPC (потому что вы не можете изменить существующий код), тогда пришло время написать код Go и внести его в Docker: -)

Самый простой путь, вероятно, заключается в добавлении флага в привязку libcontainer, так что вы можете запустить контейнер, повторно использующий пространство имен IPC хоста (или другого контейнера). Проверьте реализацию флага --net, поскольку он достигает именно этого, но для сетевого пространства имен.