Я работаю над приложением с разными процессами, и мне предлагается содержать эти процессы для достижения большей изоляции.
Проблема заключается в том, что процессы обмениваются памятью с помощью одного процесса "гипервизора" для обмена данными (они используют классические общие буферы). Это решение было реализовано для требований к производительности и потому, что оно работает в пользовательском пространстве, поэтому нет переключения между пользовательским пространством и пространством ядра.
Если я не ошибаюсь, невозможно запустить более одного контейнера докеров в одном пространстве имен 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
, поскольку он достигает именно этого, но для сетевого пространства имен.