web-dev-qa-db-ja.com

Dockerの共有カーネルとはどういう意味ですか?

Dockerでは、ゲストOSはホストOSと同じカーネルを共有します。

誰かがそれについてもっと詳しく説明できますか?.

いくつかのカーネルバージョンを持っているcentososを持っているとしましょう、ubuntuイメージをプルすると、それは異なるカーネルを持っています、それではどうやってそれらが同じカーネルを持っていると言うことができますか?

15
gaurav

私たちがubuntuイメージを引っ張ると、それは異なるカーネルを持っています

いいえ、ありません:カーネル部分がありません:すべてのシステムコールをホスト(Dockerエンジンを実行しているもの)のカーネルに依存しています)。

" Docker vs Virtualization "で述べたように:

当初、DockerはLinuxコンテナ(LXC)の上に抽象化レイヤーとして構築されていました。 LXC自体は、Linuxの封じ込め機能のための単なるAPIです。
Docker 0.9以降、LXCはデフォルトではなくなり、Goで記述されたカスタムライブラリ(libcontainer)に置き換えられました。全体的なlibcontainerの利点は、さまざまなLinuxディストリビューション間でカーネルへのより一貫したインターフェースです。唯一の落とし穴は、Linux3.8以降が必要なことです。

詳細については、「 ユーザースペースとカーネルスペースの問題を理解する理由 "」を参照してください。
また、 " オペレーティングシステムコンテナとアプリケーションコンテナ ":

コンテナは、オペレーティングシステムの仮想化の製品です。これらは、メモリ、CPU、ディスクなどの一連のプロセスとリソースをホストやその他のコンテナからグループ化して分離する軽量の仮想環境を提供します。
分離により、コンテナー内のプロセスがコンテナー外のプロセスまたはリソースを認識できないことが保証されます。

https://risingstack-blog.s3-eu-west-1.amazonaws.com/2015/05/os-virtualization.jpg

OSコンテナは、ホストオペレーティングシステムのカーネルを共有するが、ユーザースペースの分離を提供する仮想環境です。

https://risingstack-blog.s3-eu-west-1.amazonaws.com/2015/05/os-containers.jpg

すべてのLinuxディストリビューションは同じカーネルを使用しますか? 」で述べたように、各ディストリビューションに独自のカーネル構成がある場合でも、カーネルはディストリビューション間で共有できます。


さらに分離が必要な場合は、gVisorhttps://github.com/google/gvisor )、コンテナーを検討してくださいサンドボックスランタイムは、セキュリティ、効率、使いやすさに重点を置いています。 (2018)。
アーキテクチャを参照してください:

https://gvisor.dev/docs/architecture_guide/Layers.png

gVisorは、仮想化されたハードウェアを介した変換を必要とせずに、アプリケーションシステムコールをインターセプトし、ゲストカーネルとして機能します。

gVisorは、ゲストカーネルとVMMをマージしたもの、またはステロイドのseccompと考えることができます。
このアーキテクチャにより、仮想化の固定コストを削減しながら、柔軟なリソースフットプリント(つまり、固定ゲスト物理リソースではなく、スレッドとメモリマッピングに基づくもの)を提供できます。
ただし、これには、アプリケーションの互換性が低下し、システムコールのオーバーヘッドが高くなるという代償が伴います。

20
VonC

Dockerは以前はLinuXContainers(LXC)を使用していましたが、ホストと同じオペレーティングシステムで実行されるrunC(以前はlibcontainerと呼ばれていました)に切り替えました。これにより、多くのホストオペレーティングシステムリソースを共有できます。また、AuFSのような階層化されたファイルシステムも使用します。また、ネットワークも管理します。

AuFSは階層化されたファイルシステムであるため、読み取り専用部分と書き込み部分を作成して、それらをマージすることができます。したがって、オペレーティングシステムの共通部分を読み取り専用として、すべてのコンテナー間で共有し、各コンテナーに書き込み用の独自のマウントを与えることができます。

たとえば、サイズが1GBのコンテナイメージがあるとします。フルVMを使用する場合は、1GB xx必要なVMの数が必要になります。 LXCとAuFSを使用すると、1GBの大部分を共有できます。また、1000個のコンテナーがある場合でも、コンテナーOSがすべて同じOSイメージを実行していると仮定すると、コンテナーOS用のスペースは1GB強しかない可能性があります。

1
VizardCrawler