Docker は仮想マシンとどう違うのでしょうか? 質問する

Docker は仮想マシンとどう違うのでしょうか? 質問する

何度も読み返していますDockerドキュメントDocker と完全な VM の違いを理解しようとしています。Docker はどのようにして、それほど重くならずに完全なファイルシステムや分離されたネットワーク環境などを提供できるのでしょうか?

ソフトウェアを Docker イメージ (適切な用語であれば) にデプロイする方が、一貫性のある運用環境にデプロイするよりも簡単なのはなぜでしょうか?

ベストアンサー1

Dockerは元々Linux コンテナ(LXC)でしたが、後にランC(以前はlibcontainerと呼ばれていました)は、ホストと同じオペレーティングシステムで実行されます。これにより、ホストオペレーティングシステムのリソースの多くを共有できます。また、階層化されたファイルシステム(オーエフエス) を実行し、ネットワークを管理します。

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

たとえば、1 GB のコンテナ イメージがあるとします。完全な VM を使用する場合は、1 GB x 必要な VM の数が必要になります。Docker と AuFS を使用すると、1 GB の大部分をすべてのコンテナ間で共有できますが、コンテナが 1000 個ある場合でも、コンテナ OS 用のスペースは 1 GB を少し超える程度しか残らない可能性があります (すべてが同じ OS イメージを実行していると仮定)。

完全仮想化システムには、独自のリソース セットが割り当てられ、共有は最小限に抑えられます。分離性は高まりますが、はるかに重くなります (より多くのリソースが必要です)。Docker では分離性は低くなりますが、コンテナーは軽量です (必要なリソースは少なくなります)。そのため、ホスト上で数千のコンテナーを簡単に実行でき、瞬きさえしません。Xen でこれを試してください。非常に大きなホストがない限り、不可能だと思います。

完全仮想化システムの起動には通常数分かかりますが、Docker/LXC/runC コンテナの場合は数秒、場合によっては 1 秒未満で済みます。

仮想化システムの種類ごとに長所と短所があります。リソースが保証された完全な分離が必要な場合は、完全な VM が最適です。プロセスを相互に分離し、適度なサイズのホストで大量のプロセスを実行したい場合は、Docker/LXC/runC が適しているようです。

詳細については、このブログ投稿集LXC がどのように動作するかをわかりやすく説明しています。

ソフトウェアを Docker イメージ (適切な用語であれば) にデプロイする方が、一貫性のある運用環境にデプロイするよりも簡単なのはなぜですか?

一貫した本番環境を展開するのは言うほど簡単ではありません。シェフそして傀儡ホストや環境間では、OS の更新やその他の変更が常に発生します。

Docker を使用すると、OS を共有イメージにスナップショットして、他の Docker ホストに簡単に展開できます。ローカル、開発、品質管理、本番など、すべて同じイメージです。もちろん、他のツールでこれを行うこともできますが、それほど簡単または高速ではありません。

これはテストに最適です。データベースに接続する必要があるテストが何千もあり、各テストでデータベースの完全なコピーが必要で、データに変更を加えるとします。これに対する従来のアプローチは、カスタムコードまたは次のようなツールで、テストごとにデータベースをリセットすることです。フライウェイ- これは非常に時間がかかる可能性があり、テストを連続して実行する必要があることを意味します。ただし、Docker を使用すると、データベースのイメージを作成し、テストごとに 1 つのインスタンスを実行してから、すべてのテストを並列で実行できます。これは、すべてのテストがデータベースの同じスナップショットに対して実行されることがわかっているためです。テストは並列で実行され、Docker コンテナー内で実行されるため、すべて同じボックスで同時に実行でき、はるかに速く完了するはずです。完全な VM でこれを試してください。

コメントより…

興味深いですね。私はまだ「OS のスナップショット」という概念に混乱しているようです。OS のイメージを作成せずに、どうやってそれを実行するのでしょうか?

では、説明してみましょう。まずベースイメージを用意し、変更を加えて、Docker を使って変更をコミットすると、イメージが作成されます。このイメージにはベースとの差分のみが含まれます。イメージを実行するにはベースも必要で、レイヤードファイルシステムを使って、イメージをベースの上にレイヤー化します。前述のように、Docker は AuFS を使用します。AuFS はさまざまなレイヤーを結合し、必要なものを取得します。実行するだけです。イメージ (レイヤー) をどんどん追加していくと、差分のみが保存され続けます。Docker は通常、レジストリただし、OS 全体を自分で「スナップショット」する必要があることはほとんどありません。

おすすめ記事