「コンテナ」の版間の差分
| (同じ利用者による、間の2版が非表示) | |||
| 行7: | 行7: | ||
== 概要 == | == 概要 == | ||
| + | [[コンテナ]]による仮想化は、仮想マシンのモデルに比べて、軽量で、高速です。[[コンテナ]]は、 | ||
== コンテナと仮想マシンの違い == | == コンテナと仮想マシンの違い == | ||
| + | === 非仮想化環境 === | ||
| + | [[コンテナ]]を使わない非仮想化環境を示します。コンテナや仮想マシンを使用しない場合、OSの上で、フラットな空間でプロセスが実行されます。 | ||
| + | {|class="wikitable" style="text-align: center;" | ||
| + | |+ 非仮想化環境のスタック | ||
| + | |- | ||
| + | |プロセス | ||
| + | |プロセス | ||
| + | |プロセス | ||
| + | |プロセス | ||
| + | |- | ||
| + | | colspan="6" | OS | ||
| + | |- | ||
| + | | colspan="6" | 物理マシン | ||
| + | |} | ||
=== 仮想マシン === | === 仮想マシン === | ||
仮想マシンでは、以下のようなスタック構造になります。 | 仮想マシンでは、以下のようなスタック構造になります。 | ||
| − | + | 物理マシン(HW, Hardware)の上にホストOSがあり、ホストOSの上で仮想マシン(VM)が実行され、VMの上で、ゲストOSが動作し、ゲストOSの上でプロセスが実行されます。VMの上で動作するゲストOSは、ホストOSと異なるものが実行できます。 | |
{|class="wikitable" style="text-align: center;" | {|class="wikitable" style="text-align: center;" | ||
|+ 仮想マシン(VM)のスタック | |+ 仮想マシン(VM)のスタック | ||
| 行22: | 行37: | ||
| colspan="2" | ゲストOS | | colspan="2" | ゲストOS | ||
|- | |- | ||
| − | | colspan="2" | | + | | colspan="2" | 仮想マシン |
| − | | colspan="2" | | + | | colspan="2" | 仮想マシン |
|- | |- | ||
| − | | colspan="4" | | + | | colspan="4" | ホストOS |
|- | |- | ||
| − | | colspan="4" | | + | | colspan="4" | 物理マシン |
|} | |} | ||
| 行54: | 行69: | ||
| colspan="6" | OS | | colspan="6" | OS | ||
|- | |- | ||
| − | | colspan="6" | | + | | colspan="6" | 物理マシン |
|} | |} | ||
== コンテナのメリット == | == コンテナのメリット == | ||
* 起動が軽いです | * 起動が軽いです | ||
| − | * | + | * オーバーヘッドが少ないです |
| + | ** ファイルシステムでは、ファイルアクセスが速いです。 | ||
* 必要なプロセスだけ起動すれば良いです(ゲストOSは不要) | * 必要なプロセスだけ起動すれば良いです(ゲストOSは不要) | ||
| + | === 完全仮想化に比べてファイルアクセスが高速 === | ||
| + | 完全仮想化では、ディスクI/Oの遅さが問題になりやすいです。 | ||
| + | また、ディスクイメージのファイル操作が面倒という課題もあります。 | ||
| + | |||
| + | 完全仮想化でのI/Oは、以下のような階層になります。 | ||
| + | {|class="wikitable" style="text-align: center;" | ||
| + | |+ 完全仮想化でのファイルシステムとプロセス | ||
| + | |- | ||
| + | | | ||
| + | {|class="wikitable" | ||
| + | |- | ||
| + | | プロセス | ||
| + | |- | ||
| + | | ファイルシステム | ||
| + | |} | ||
| + | 仮想マシン | ||
| + | | | ||
| + | {|class="wikitable" | ||
| + | |- | ||
| + | | プロセス | ||
| + | |- | ||
| + | | ファイルシステム | ||
| + | |} | ||
| + | 仮想マシン | ||
| + | |- | ||
| + | | colspan="1" | ディスクイメージ | ||
| + | | colspan="1" | ディスクイメージ | ||
| + | |- | ||
| + | | colspan="2" | ファイルシステム | ||
| + | |- | ||
| + | | colspan="2" | ディスク | ||
| + | |} | ||
| + | 仮想化環境のプロセスがファイルI/Oを行う場合、仮想化環境のファイルシステムにアクセスするとディスクイメージにアクセスがいきますが、ディスクイメージを読むためには、ゲストOSのファイルシステムにアクセスをし、ディスクへいきます。非仮想環境のプロセスに比べて、仮想環境とファイルシステムとディスクイメージへのアクセスのオーバーヘッドが多くなります。 | ||
| + | |||
| + | コンテナでは、仮想マシンとは異なる、直接、限定されたファイルシステムへアクセスできるため、ファイルI/Oが高速ということになります。 | ||
| + | * ディスクのエミュレーションが不要 | ||
| + | * ファイルシステムが二重にならない | ||
| + | {|class="wikitable" style="text-align: center;" | ||
| + | |+ コンテナでのファイルシステムとプロセス | ||
| + | |- | ||
| + | |コンテナ | ||
| + | {|class="wikitable" | ||
| + | |- | ||
| + | | プロセス | ||
| + | | プロセス | ||
| + | |} | ||
| + | |コンテナ | ||
| + | {|class="wikitable" | ||
| + | |- | ||
| + | | プロセス | ||
| + | | プロセス | ||
| + | |} | ||
| + | | プロセス | ||
| + | | プロセス | ||
| + | |- | ||
| + | | colspan="4" | ファイルシステム | ||
| + | |- | ||
| + | | colspan="4" | ディスク | ||
| + | |} | ||
== コンテナのデメリット == | == コンテナのデメリット == | ||
* OSが実行できるプロセスしか実行できません。 | * OSが実行できるプロセスしか実行できません。 | ||
* それぞれのコンテナから見えるカーネルは、同じカーネルであるため、コンテナから見える・アクセスできるデバイスやカーネルモジュールは、すべて同じになります。 | * それぞれのコンテナから見えるカーネルは、同じカーネルであるため、コンテナから見える・アクセスできるデバイスやカーネルモジュールは、すべて同じになります。 | ||
| − | + | == コンテナで分割されるリソース == | |
| + | [[コンテナ]]ごとに分割されるリソースの例を以下に挙げます。 | ||
| + | * プロセステーブル | ||
| + | * ファイルシステム | ||
| + | * ネットワーク | ||
| + | * CPU、メモリ、デバイス | ||
== コンテナを実現する機能 == | == コンテナを実現する機能 == | ||
| − | * namespace | + | * [[namespace]] |
* cgroups | * cgroups | ||
=== namespace === | === namespace === | ||
| − | namespace(名前空間) は、プロセスをグループ化し、隔離されたコンテナの空間を作る機能です。 | + | [[namespace]](名前空間) は、プロセスをグループ化し、隔離されたコンテナの空間を作る機能です。 |
| − | namespace には、以下の種類があります。 | + | [[namespace]]には、以下の種類があります。 |
* マウント名前空間 | * マウント名前空間 | ||
* UTS名前空間 | * UTS名前空間 | ||
| 行77: | 行157: | ||
* ネットワーク名前空間 | * ネットワーク名前空間 | ||
| + | == 仮想化技術に関連のあるもの == | ||
| + | * [[chroot]] | ||
| + | * [[jail]] | ||
| + | * [[cgroups]] | ||
| + | * [[LXC]] | ||
| + | * [[Docker]] | ||
| + | |||
| + | * [[KVM]] | ||
| + | * [[VMware]] | ||
| + | * Xen | ||
| + | * FreeBSD <html><a href="/freebsd/bhyve/" target="_blank">bhyve</a></html> | ||
== 関連項目 == | == 関連項目 == | ||
* [[LXC]] | * [[LXC]] | ||
2015年1月10日 (土) 14:18時点における最新版
コンテナ とは、LinuxでいえばLXCやDockerといった「プロセス空間を隔離」したOSレベルでの仮想化です。
読み方
- コンテナ
- こんてな
- container
- こんてな
目次
概要
コンテナによる仮想化は、仮想マシンのモデルに比べて、軽量で、高速です。コンテナは、
コンテナと仮想マシンの違い
非仮想化環境
コンテナを使わない非仮想化環境を示します。コンテナや仮想マシンを使用しない場合、OSの上で、フラットな空間でプロセスが実行されます。
| プロセス | プロセス | プロセス | プロセス | ||
| OS | |||||
| 物理マシン | |||||
仮想マシン
仮想マシンでは、以下のようなスタック構造になります。 物理マシン(HW, Hardware)の上にホストOSがあり、ホストOSの上で仮想マシン(VM)が実行され、VMの上で、ゲストOSが動作し、ゲストOSの上でプロセスが実行されます。VMの上で動作するゲストOSは、ホストOSと異なるものが実行できます。
| プロセス | プロセス | プロセス | プロセス |
| ゲストOS | ゲストOS | ||
| 仮想マシン | 仮想マシン | ||
| ホストOS | |||
| 物理マシン | |||
コンテナ
コンテナのプロセスは、ホストOSのプロセスとして実行されます。コンテナに属するプロセスは、通常のプロセス空間とは異なる隔離された空間内で実行されます。隔離空間をコンテナと呼びます。
隔離空間
|
隔離空間
|
プロセス | プロセス | ||||
| OS | |||||||
| 物理マシン | |||||||
コンテナのメリット
- 起動が軽いです
- オーバーヘッドが少ないです
- ファイルシステムでは、ファイルアクセスが速いです。
- 必要なプロセスだけ起動すれば良いです(ゲストOSは不要)
完全仮想化に比べてファイルアクセスが高速
完全仮想化では、ディスクI/Oの遅さが問題になりやすいです。 また、ディスクイメージのファイル操作が面倒という課題もあります。
完全仮想化でのI/Oは、以下のような階層になります。
仮想マシン |
仮想マシン | ||||
| ディスクイメージ | ディスクイメージ | ||||
| ファイルシステム | |||||
| ディスク | |||||
仮想化環境のプロセスがファイルI/Oを行う場合、仮想化環境のファイルシステムにアクセスするとディスクイメージにアクセスがいきますが、ディスクイメージを読むためには、ゲストOSのファイルシステムにアクセスをし、ディスクへいきます。非仮想環境のプロセスに比べて、仮想環境とファイルシステムとディスクイメージへのアクセスのオーバーヘッドが多くなります。
コンテナでは、仮想マシンとは異なる、直接、限定されたファイルシステムへアクセスできるため、ファイルI/Oが高速ということになります。
- ディスクのエミュレーションが不要
- ファイルシステムが二重にならない
コンテナ
|
コンテナ
|
プロセス | プロセス | ||||
| ファイルシステム | |||||||
| ディスク | |||||||
コンテナのデメリット
- OSが実行できるプロセスしか実行できません。
- それぞれのコンテナから見えるカーネルは、同じカーネルであるため、コンテナから見える・アクセスできるデバイスやカーネルモジュールは、すべて同じになります。
コンテナで分割されるリソース
コンテナごとに分割されるリソースの例を以下に挙げます。
- プロセステーブル
- ファイルシステム
- ネットワーク
- CPU、メモリ、デバイス
コンテナを実現する機能
- namespace
- cgroups
namespace
namespace(名前空間) は、プロセスをグループ化し、隔離されたコンテナの空間を作る機能です。 namespaceには、以下の種類があります。
- マウント名前空間
- UTS名前空間
- PID名前空間
- IPC名前空間
- ユーザ名前空間
- ネットワーク名前空間