私はDockerを研究し始めたばかりで、私にとってかなり混乱していることがあります。私がDockerのWebサイトで読んだように、コンテナーは仮想マシンとは異なります。私が理解したように、コンテナーはサンドボックスであり、その中で隔離されたファイルシステム全体が実行されます。
コンテナにゲストOSがインストールされていないことも読みました。代わりに、基盤となるOSカーネルに依存しています。
それはすべて問題ありません。私が混乱しているのは、オペレーティングシステムにちなんで名付けられたDockerイメージがあることです。 Ubuntu、Debian、Fedora、CentOSなどの画像が表示されます。
私のポイントは、これらの画像は実際には何ですか? Debianイメージに基づいてコンテナーを作成することは、仮想マシンを作成してDebianをインストールすることとどう違うのですか?
コンテナーにはゲストOSがインストールされていないと思いましたが、イメージを作成するときは、1つのOSにちなんで名付けられたイメージに基づいてコンテナーを作成します。
また、docker run ubuntu echo "hello world"
を実行したときに見た例では、UbuntuでVMを起動し、echo "hello world"
コマンドを実行しているようです。
docker run -it ubuntu /bin/bash
を実行するのと同じように、UbuntuでVMを起動し、コマンドラインを使用してアクセスしているようです。
とにかく、オペレーティングシステムにちなんで名付けられたこれらのイメージは何ですか?それらのイメージの1つでコンテナーを実行し、対応するゲストOSでVMを起動することは、どのように違うのですか?
justカーネルをホストOSと共有する(その結果、ハードウェアを仮想化する必要なく、基盤となるマシンのハードウェアリソースにアクセスできる)が、それぞれのファイルとバイナリを引き続き使用するという考えです。実行したいアプリケーションをサポートするために、コンテナ上の別のシステム?
すべてのLinuxディストリビューションは同じ(そう、少し簡略化された)Linuxカーネルを実行し、ユーザーランドソフトウェアのみが異なるため、ユーザーランドソフトウェアをインストールして別のディストリビューションであるように見せることで、異なるディストリビューション環境をシミュレートすることは非常に簡単です。具体的には、Ubuntu OS内にCentOSコンテナーをインストールすると、CentOSからユーザーランドを取得できますが、別のカーネルインスタンスではなく、同じカーネルが実行されます。
つまり、軽量仮想化は、同じOS内に分離されたコンパートメントを持つようなものです。実際の仮想化は、ホストOS内にもう1つの本格的なOSを備えています。そのため、DockerはLinux内でFreeBSDまたはWindowsを実行できません。
それがもっと簡単になるとしたら、Dockerは一種の非常に高度で高度なchroot環境であると考えることができます。
コンテナは単一のカーネルで実行されます。つまり、すべてのコンテナに単一のカーネル(ホストOS)があります。一方、ハイパーバイザーには複数のカーネルがあります。各仮想マシンは異なるカーネルで実行されます。
そして、「docker run ubuntu」はchroot環境を作成するのと同じです。