[解決済み】Dockerは仮想マシンとどう違うの?
質問
何度も読み返す Dockerのドキュメント DockerとフルVMの違いを理解するために。Dockerはどのようにして、それほど重くならずに、完全なファイルシステムや分離されたネットワーク環境などを提供することができるのでしょうか?
Dockerイメージにソフトウェアをデプロイすることが、単に一貫した本番環境にデプロイするよりも簡単なのはなぜですか?
どのように解決するのか?
Dockerはもともと LinuXコンテナ (LXC)に変更したが、後に ランC (以前は libcontainer ) であり、そのホストと同じオペレーティングシステムで動作しています。このため、ホストのオペレーティングシステムのリソースの多くを共有することができます。また、レイヤードファイルシステム ( AuFS )、ネットワークの管理を行います。
AuFSはレイヤー型のファイルシステムなので、読み込み専用の部分と書き込みの部分を併存させることができます。オペレーティングシステムの共通部分を読み取り専用にして(全コンテナで共有)、各コンテナに書き込み用のマウントを持たせることも可能です。
つまり、1GBのコンテナ・イメージがあるとすると、完全なVMを使用したい場合は、1GB×必要なVMの数だけ用意する必要があります。DockerとAuFSを使えば、1GBの大部分をすべてのコンテナで共有することができ、1000個のコンテナがあっても、コンテナOS用のスペースは1GB強しかありません(すべて同じOSイメージを実行していると仮定しています)。
完全な仮想化システムは、独自のリソースセットを割り当てられ、最小限の共有しか行いません。より多くの分離が得られますが、より重くなります(より多くのリソースを必要とします)。Dockerの場合、分離度は低いですが、コンテナは軽量です(必要なリソースが少ない)。そのため、1つのホスト上で何千ものコンテナを簡単に実行することができ、しかもそれは瞬きもしないほどです。Xenでそれをやろうとすると、よほど大きなホストでない限り、不可能だと思います。
完全な仮想化システムは通常、起動に数分かかりますが、Docker/LXC/runCコンテナは数秒、多くの場合1秒未満で済みます。
仮想化システムのタイプにはそれぞれ長所と短所があります。リソースが保証された完全な分離が必要な場合は、フルVMが適しています。もしあなたがただプロセスを互いに分離したいだけで、合理的な大きさのホスト上で大量のプロセスを実行したいのであれば、Docker/LXC/runCがその方法だと思われます。
詳しくは、以下をご覧ください。 この一連のブログ記事 LXCがどのように機能するかについて、よく説明されています。
<ブロッククオートなぜ、Dockerイメージへのソフトウェアのデプロイは、単に一貫性のある本番環境へのデプロイよりも簡単なのでしょうか?
一貫性のある本番環境を配備することは、言うは易く行うは難しです。たとえ シェフ と パペット しかし、OSのアップデートなど、ホストと環境の間で常に変化するものがあります。
Dockerでは、OSをスナップショットして共有イメージにすることで、他のDockerホストへのデプロイを容易にすることができます。ローカルでは、dev、qa、prodなど、すべて同じイメージになります。もちろん、他のツールでもこれは可能ですが、これほど簡単かつ迅速にはいきません。
例えば、データベースに接続する必要がある何千ものテストがあり、各テストはデータベースの原始的なコピーを必要とし、データに変更を加えることになるとします。古典的な方法は、テストが終わるたびにデータベースをリセットすることです。 フライウェイ - これは非常に時間がかかり、テストを連続的に実行しなければならないことを意味します。しかし Docker を使えば、データベースのイメージを作成してテストごとにインスタンスを作成し、すべてのテストを並行して実行することができます。テストは並行してDockerコンテナで実行されるので、同じボックスで同時にすべてを実行でき、より速く終了するはずです。完全なVMでそれを試してみてください。
コメントから...
<ブロッククオート面白いですねぇ。私はまだOSのスナップショットという概念に混乱しているようです。OSのイメージを作ることなく、どのようにそれを行うのでしょうか?
では、説明しましょう。ベースとなるイメージから始めて、変更を加え、その変更を docker を使ってコミットすると、イメージが作成されます。このイメージには、ベースとの差分だけが含まれています。イメージを実行するときは、ベースも必要です。そして、レイヤードファイルシステムを使ってベースの上にイメージを重ねます。AuFSが異なるレイヤーをマージしてくれるので、欲しいものが手に入り、それを実行するだけでいいのです。どんどんイメージ(レイヤー)を追加していっても、差分だけを保存し続けることができます。Dockerは一般的に、Docker.comにある既製のイメージの上に構築されるため、AuFSを実行することでイメージを統合することができます。 レジストリ そのため、OS全体を自分でスナップショットする必要はほとんどありません。
関連
-
[解決済み] rm」フラグは何をしているのですか?
-
[解決済み] Dockerコンテナの中から、マシンのローカルホストに接続するにはどうすればよいですか?
-
[解決済み] Docker Dockerコンテナからホストへのファイルコピー
-
[解決済み] ホストからDockerコンテナにファイルをコピーする方法は?
-
[解決済み] リポジトリを使用せずに、あるホストから別のホストにDockerイメージをコピーする方法
-
[解決済み] ホストからDockerコンテナのIPアドレスを取得する方法
-
[解決済み] Dockerコンテナのシェルに入るにはどうしたらいいですか?
-
[解決済み] 古いDockerコンテナを削除する方法
-
[解決済み] Dockerイメージはホストマシン上のどこに保存されていますか?
-
[解決済み】Dockerのイメージを削除する方法を教えてください。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] DockerfileでRUN mkdirを実行できない
-
[解決済み] docker-machine: コマンドが見つかりません。
-
[解決済み] Dockerfileで画像にタグを付けるには?重複
-
[解決済み] dockersやlxcにtty/std-in-outをアタッチするとはどういうことですか?
-
[解決済み] kubernetesでPodを停止/一時停止する方法
-
[解決済み] Dockerのバージョンを判断する方法 [重複]について
-
[解決済み】Dockerのプロセスへのアタッチとデタッチはどうやるの?
-
[解決済み】DockerFileの "VOLUME "命令を理解する。
-
[解決済み】プライベートDockerレジストリからイメージを削除する方法は?
-
[解決済み】WindowsコンテナをLinux上でホストすることは可能ですか?