コンテナにゲストOSがない場合、DockerでOSベースイメージを使用するのはなぜですか?


84

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/bashUbuntuでVMをスピンアップし、コマンドラインを使用してアクセスしているようです。

とにかく、オペレーティングシステムにちなんで名付けられたこれらのイメージは何ですか?それらのイメージの1つでコンテナを実行し、対応するゲストOSでVMをスピンアップすることはどのように違いますか?

カーネルをホストOSと共有するだけで(したがって、ハードウェアを仮想化することなく、基盤となるマシンのハードウェアリソースにアクセスできます)、コンテナ上の異なるシステムのファイルとバイナリを順番に使用するという考えです実行したいアプリケーションをサポートするには?


2
私の意見では、仮想化の目的が重要です。OS上にライブラリ、言語などが必要な場合、OSコンテナがニーズに適しています。ただし、コンポーネントとしてのアプリケーションのみが必要な場合は、OSをベースイメージとして使用する必要はありません。私はこの記事では、それが明確に説明することができると思いますblog.risingstack.com/...
をMetaMorph

回答:


68

すべてのLinuxディストリビューションは同じLinuxカーネルを実行します(そう、少し簡略化されています)。ユーザーランドソフトウェアのみが異なるため、そのユーザーランドソフトウェアをインストールして別のディストリビューションのふりをするだけで、異なるディストリビューション環境を簡単にシミュレートできます。具体的には、CentOSコンテナーをUbuntu OSにインストールすると、CentOSからユーザーランドを取得し、別のカーネルインスタンスでなく同じカーネルを実行し続けることになります。

そのため、軽量仮想化は、同じOS内で隔離されたコンパートメントを持つようなものです。反対に、実際の仮想化は、ホストOS内に別の本格的なOSを持っています。これが、DockerがLinux内でFreeBSDまたはWindowsを実行できない理由です。

それが簡単であれば、dockerは一種の非常に洗練された高度なchroot環境であると考えることができます。


3
それで、コンパイルされたコードはカーネルのみを必要とするため、空のスクラッチコンテナでコンパイルされたgolangコードをホストできます。
フランシスノートン

それでは、ゲストOSはどのようにホストOSのカーネルを使用することを知っていますか(そしてその方法)?知る限り、ドッカーのイメージベースは標準のOSイメージを使用します。あなたの例では、親のカーネルを使用することを知っているカスタムCentOSビルドがあるようではありませんか?または、Dockerがゲスト(CentOS ')の/ bootの読み取りをホスト(Ubuntu)にリダイレクトするファイルシステム(aufs)トリックのように単純ですか?その場合、ゲスト(CentOS)は/ bootの独自のコピーをインストールしますが、読み取りは行われませんか?
ジェームズS

私はあなたの説明が好きですが、WindowsでLinuxコンテナを実行することをどのように説明しますか?Server 2016とWindows 10には、Dockerの使用を可能にするLinuxカーネルが含まれていますか?それがこれらのバージョンが必要な理由ですか?
duct_tape_coder

これは簡単です。ネイティブLinux VM内のHyper-Vの本格的な仮想化スタックの下で実行されます:docs.microsoft.com/en-us/virtualization/windowscontainers/…
ルーキー

1

コンテナは単一のカーネルで実行されます。つまり、すべてのコンテナに単一のカーネル(ホストOS)があります。一方、ハイパーバイザーには複数のカーネルがあります。各仮想マシンは異なるカーネルで実行されます。

そして、「docker run ubuntu」はchroot環境を作成するようなものです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.