Dockerでは、ゲストOSはホストOSと同じカーネルを共有します。
誰かがそれについてもっと詳しく説明できますか?.
いくつかのカーネルバージョンを持っているcentososを持っているとしましょう、ubuntuイメージをプルすると、それは異なるカーネルを持っています、それではどうやってそれらが同じカーネルを持っていると言うことができますか?
私たちがubuntuイメージを引っ張ると、それは異なるカーネルを持っています
いいえ、ありません:カーネル部分がありません:すべてのシステムコールをホスト(Dockerエンジンを実行しているもの)のカーネルに依存しています)。
" Docker vs Virtualization "で述べたように:
当初、DockerはLinuxコンテナ(LXC)の上に抽象化レイヤーとして構築されていました。 LXC自体は、Linuxの封じ込め機能のための単なるAPIです。
Docker 0.9以降、LXCはデフォルトではなくなり、Goで記述されたカスタムライブラリ(libcontainer)に置き換えられました。全体的なlibcontainerの利点は、さまざまなLinuxディストリビューション間でカーネルへのより一貫したインターフェースです。唯一の落とし穴は、Linux3.8以降が必要なことです。
詳細については、「 ユーザースペースとカーネルスペースの問題を理解する理由 "」を参照してください。
また、 " オペレーティングシステムコンテナとアプリケーションコンテナ ":
コンテナは、オペレーティングシステムの仮想化の製品です。これらは、メモリ、CPU、ディスクなどの一連のプロセスとリソースをホストやその他のコンテナからグループ化して分離する軽量の仮想環境を提供します。
分離により、コンテナー内のプロセスがコンテナー外のプロセスまたはリソースを認識できないことが保証されます。
OSコンテナは、ホストオペレーティングシステムのカーネルを共有するが、ユーザースペースの分離を提供する仮想環境です。
「 すべてのLinuxディストリビューションは同じカーネルを使用しますか? 」で述べたように、各ディストリビューションに独自のカーネル構成がある場合でも、カーネルはディストリビューション間で共有できます。
さらに分離が必要な場合は、gVisor( https://github.com/google/gvisor )、コンテナーを検討してくださいサンドボックスランタイムは、セキュリティ、効率、使いやすさに重点を置いています。 (2018)。
アーキテクチャを参照してください:
gVisorは、仮想化されたハードウェアを介した変換を必要とせずに、アプリケーションシステムコールをインターセプトし、ゲストカーネルとして機能します。
gVisorは、ゲストカーネルとVMMをマージしたもの、またはステロイドのseccompと考えることができます。
このアーキテクチャにより、仮想化の固定コストを削減しながら、柔軟なリソースフットプリント(つまり、固定ゲスト物理リソースではなく、スレッドとメモリマッピングに基づくもの)を提供できます。
ただし、これには、アプリケーションの互換性が低下し、システムコールのオーバーヘッドが高くなるという代償が伴います。
Dockerは以前はLinuXContainers(LXC)を使用していましたが、ホストと同じオペレーティングシステムで実行されるrunC(以前はlibcontainerと呼ばれていました)に切り替えました。これにより、多くのホストオペレーティングシステムリソースを共有できます。また、AuFSのような階層化されたファイルシステムも使用します。また、ネットワークも管理します。
AuFSは階層化されたファイルシステムであるため、読み取り専用部分と書き込み部分を作成して、それらをマージすることができます。したがって、オペレーティングシステムの共通部分を読み取り専用として、すべてのコンテナー間で共有し、各コンテナーに書き込み用の独自のマウントを与えることができます。
たとえば、サイズが1GBのコンテナイメージがあるとします。フルVMを使用する場合は、1GB xx必要なVMの数が必要になります。 LXCとAuFSを使用すると、1GBの大部分を共有できます。また、1000個のコンテナーがある場合でも、コンテナーOSがすべて同じOSイメージを実行していると仮定すると、コンテナーOS用のスペースは1GB強しかない可能性があります。