聞いてください:
Docker.ioと本格的なVMの違いを理解するために、Docker.ioのドキュメントを何度も読み直しました。 Dockerはどのようにして、完全なファイルシステム、独立したネットワーク環境、その他の機能を巨大化せずに提供しているのでしょうか?
一貫性のある本番環境よりも、dockerImageにソフトウェアをデプロイする方が簡単なのはなぜですか?
現在Dockerは、ホストマシンと同じオペレーティングシステム上で動作するLinuxコンテナを使用しています。これにより、多くのシステムリソースをホストマシンと共有することができます。また、ファイルシステムとしてAuFSを使用し、ネットワークも管理してくれます。
AuFSはレイヤー型ファイルシステムなので、読み取り専用と書き込み専用のセクションがあり、その2つを組み合わせることができます。システムの共通部分を読み取り専用にして、その部分はすべてのコンテナで共有し、各コンテナに書き込み可能な領域を与えることができます。
コンテナ・イメージの容量が1GBだとすると、それをフルVMでロードするには、1GBに必要なVMの数を掛けた容量が必要になります。しかし、Linuxコンテナ仮想化技術とAuFSを使えば、1GBの容量を共有することができ、1000個のコンテナが必要な場合でも、それらがすべて同じシステム・イメージ上で動作していると仮定すれば、コンテナ・システムのために1GBをわずかに超える容量を使うことができます。
完全な仮想化システムは、最小限の共有のみで、それ自身の完全なリソースに分割されます。より多くの分離が得られますが、それは巨大です。
Linuxのコンテナ仮想化技術では、分離性に欠けますが、軽量で必要なリソースが少なくて済みます。そのため、1台のホストマシン上で1000個のコンテナを瞬きもせずに簡単に実行できます。Xenでそれを試してみてください。超強力なホストがない限り、それは不可能だと思います。
完全な仮想システムの起動には通常数分かかりますが、Linuxコンテナの仮想化には数秒、場合によってはそれ以下です。
それぞれのタイプの仮想システムには否定派と賛成派がいます。完全に分離され、リソースを保証された環境を求めるのであれば、完全な仮想マシンが選択されます。プロセスが互いに分離されていることだけが必要で、それらを手頃なサイズのホストマシン上で大量に実行したい場合は、Linuxコンテナ仮想化技術が選択されます。その場合、Linuxコンテナ仮想化技術が選択されます。
"なぜ一貫性のある本番環境よりも dockerImage 上でソフトウェアをデプロイする方が簡単なのですか?"という質問は、とても愚かな質問だと思います。
一貫性のある本番環境をデプロイすることは、言うは易く行うは難しです。chefやpuppetのようなツールを使ったとしても、OSのアップグレードなどによるホストや環境の変更は起こりがちです。
dockerがすることは、OSのスナップショットを共通のイメージに取り込み、他のdockerホストに簡単にデプロイできるようにすることです。ローカル、開発、品質管理、製品などでは、すべて同じイメージですが、他のツールを使ってこれを行うこともできます。
これはユニットテストに最適です。たとえば 1000 個のテストがあり、そのすべてがデータベースに接続する必要があるとしましょう。何も壊さないようにするためには、互いに干渉しないようにテストを次々に実行する必要があります。Dockerを使えば、データベースのImageを作成することができ、テストはデータベースの同じスナップショットの下で実行されることがわかっているので、それらをすべて並行して実行することができます。テストはLinuxコンテナ内で並行して実行されるため、すべて同じ環境で同時に実行することができます。こうすることで、テストは非常に短時間で完了します。これを完全な仮想マシンで実行してみてください。
| 興味深いです!システムスナップショット」の概念と、それを使わないとどうなるのかについて、私はまだ少し混乱しているようです 。 |
では、説明しましょう。ベース イメージから始めてデータに変更を加え、docker を使ってその変更をコミットすると、データへの変更だけを含む イメージが作成されます。その イメージを実行するには、やはりベース イメージが必要です。レイヤーファイルシステムを使ってベースイメージの上にイメージを配置します。変更を記録するだけの Imageをいくつも追加できます。





