web-dev-qa-db-ja.com

Dockerコンテナー間でメモリを共有することは可能ですか?

私はさまざまなプロセスを使用してアプリケーションで作業しており、さらに分離を実現するためにそれらのプロセスを含めるように求められます。

問題は、プロセスがデータを交換するために単一の「ハイパーバイザー」プロセスとメモリを共有することです(従来の共有バッファを使用します)。このソリューションは、パフォーマンス要件のために実装されました。ユーザースペースで実行されているため、ユーザースペースとカーネルスペース間でコンテンツが切り替えられることはありません。

私が間違っていない場合、単一のIPC名前空間内で複数のDockerコンテナーを実行することはできませんが、単一のDockerコンテナーが別の=に属している可能性があるかどうかはわかりませんIPC名前空間、これで問題が解決する可能性があります。

他のソリューションも歓迎します。事前のおかげで、パフォーマンスが要件であることを覚えておいてください。

31
Manuel Durando

--ipc=Hostおよび--ipc=container:id オプションがDockerに追加されました create および run 共有するコマンドIPCリソース。

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

ホストとのIPC

docker run --ipc=Host <image>

別のコンテナでのIPC

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

技術的には、コンテナ間で同じIPC名前空間を共有できますが、Dockerはそれを(まだ)サポートしていません。

IPCの代わりにmmap()を使用できる場合、両方のコンテナー間でボリュームを共有し、そのボリューム上のファイルをマップできます。同じファイルになるため、正しく共有されます。

IPC名前空間を共有する必要がある場合(既存のコードを変更できないため))、Goコードを記述してDockerにコントリビュートします:-)

おそらく最も簡単な方法は、libcontainerバインディングにフラグを追加して、IPCホスト(または別のコンテナー)の名前空間)を再利用してコンテナーを開始できるようにすることです。 --netフラグ。これは正確にそれを実現するためですが、ネットワーク名前空間を対象としています。

14
jpetazzo

@ jpetazzo で示唆されているように、私はDockerのソースと、開発者たちの助けを借りて #docker-dev 成功しました 再コンパイルされたDocker IPC名前空間を削除するため。

これを実現するには、Dockerソースコードのフォルダー"NEWIPC": true,にあるファイルdefault_template.goの行docker/daemon/execdriver/native/templateをコメント化する必要があります。

古いコードは完全に機能するようになりました。

8
Manuel Durando