LXCで学ぶコンテナ入門 -軽量仮想化環境を実現する技術

第2回 コンテナの仕組みとLinuxカーネルのコンテナ機能[1]名前空間とは?

この記事を読むのに必要な時間:およそ 5.5 分

前回は,Linuxで使えるコンテナの実装を説明したあと,LXCを使って簡単にコンテナの作成,起動,停止が行えるところを紹介しました。今回は,そのコンテナの仕組みを簡単に説明し,その仕組みからくるメリット・デメリットを紹介した後,コンテナはカーネルのどのような仕組みを使って動作しているのかを簡単に説明していきたいと思います。

コンテナの仕組み

コンテナをまだ使ったことがない方でも,VMwareやVirtualBox,KVMといった仮想マシン(VM)を使ったことはあるという方は多いのではないでしょうか。まずはVMとの比較をしながら,コンテナの仕組みを説明してみましょう。

図1 VMとコンテナの仕組み(1)仮想マシン

図1 VMとコンテナの仕組み(1)仮想マシン

VMでは図1のように,コンピュータの上で動くOSやVMを実現するためのハイパーバイザの上で,実際のハードウェアをエミュレートするVMが動きます。つまり実際の物理的なコンピュータと同じようなものがソフトウェアによって実現されているので,このVMを使うにはOSが必要になります。つまり,図1のように物理的なコンピュータ上で動くOSの上でさらにOSが動きます。また,VMを動かしているOSからはVMのプロセスが見えているだけで,VM上で動作しているプロセスは見えません。

図2 VMとコンテナの仕組み(2)コンテナ(OSレベル仮想化)

図2 VMとコンテナの仕組み(2)コンテナ(OSレベル仮想化)

一方コンテナは,図2のように,起動する全てのプロセスはコンピュータ上にインストールされたOS(ホストOS)上で直接起動します。通常のプロセスの動作と異なるのは,そのプロセスの一部をグループ化し,他のグループやグループに属していないプロセスから隔離した空間で動作させる点です。貨物輸送のコンテナのように,隔離された空間にプロセスが入っているので,この空間を『コンテナ』と呼ぶわけです。実際のコンテナのように,あるコンテナの内部から他のコンテナの内部を見ることはできません。

この隔離された空間を作り出すのは,OSのカーネルの機能です。OSを通して使用できるコンピュータのリソースを各コンテナごとに隔離して,ホストOS上で直接動作するプロセスや他のコンテナから独立した空間を作り出し,リソースを分割,分配,制限するわけです。

VMが仮想的なハードウェアの環境を作り出すのに比べて,コンテナ内では独立したOSの環境が作り出されるので,『OSレベルの仮想化』と呼ばれたりもします。つまりコンテナの内部では,他のコンテナやホストOSの環境と独立しているような,仮想的なOS環境が実現されているのです。

コンテナのメリット

簡単にコンテナの仕組みを説明したところで,この仕組みから得られるメリットをあげてみましょう。

高密度化が可能

コンテナではカーネルが直接プロセスを操作して隔離された空間を作り出すので,コンピュータ上で動作するOSは1つだけです。最低でも2つのOSが動作する必要のあるVMに比べると,消費するリソースは少なくて済みます。多数のコンテナを作成しても,動作しているOSは1つですので,VMに比べると高密度化が実現できます。

オーバーヘッドが少ない

ハードウェアの仮想化が不要で,隔離された空間を作るだけで済みますので,オーバーヘッドが少なくて済みます。

起動が速い

コンテナの起動は,OSから見ると単にプロセスが起動しているだけですので,通常のプロセスが起動するのとほとんど差はありません。つまり非常に速く起動できます。

アプリケーションのみの起動が可能

VMと異なり,コンテナ内ではinitが最初に起動して各種デーモンが起動する必要はありません。単にプロセスを隔離した環境を作り出せばコンテナを作成できますので,たとえばWebサーバだけが起動しているといったような,コンテナの中に1つだけプロセスが存在する環境を作れます。

このような環境は アプリケーションコンテナ と呼ばれます。もちろんinitを最初に起動して,通常のOSが起動するのと同じような環境も作成できます。こちらは システムコンテナ と呼ばれます。

コンテナのデメリット

逆にコンテナでは仕組み上,どうしてもできないことがあります。それをあげてみましょう。

異なるOSのシステム,プログラムは動かせない

起動しているOSは1つで,Linuxのカーネルが作り出している環境ですので,当然,他のLinux以外のOS用のプログラムは動作しませんし,コンテナ環境に他のOS(カーネル)はインストールできません。

Linuxの任意のディストリビューションはインストールできます。しかし,動作しているカーネルは1つですので,厳密にはディストリビューションを物理マシンやVMにインストールした環境と全く同じ環境ではありません。たとえばUbuntu上のコンテナにCentOSをインストールして起動したとしても,動作しているカーネルはUbuntuのカーネルです。

カーネルに関わる操作はできない

正確にはカーネルに関わる操作は可能です。しかしコンテナごとに異なる操作を行うことはできません。カーネルの機能で実現している環境ですので,当然全コンテナから見えるカーネルは同一です。したがって,コンテナから見えるデバイスやロードされているカーネルモジュールは同じになります。


以上,メリットとデメリットを挙げてみました。いずれもコンテナが持つ特徴に深く関わるものですので,コンテナが特別優れているわけでも,劣っているわけでもなく,その特徴を生かしてコンテナを利用すると良い場面,仕組み上コンテナの使用が適切ではない場面があるだけです。コンテナに向いた場面で利用するためにも,コンテナの仕組みを理解が必要となるでしょう。これは他の技術にも言えることですね。

著者プロフィール

加藤泰文(かとうやすふみ)

2009年頃にLinuxカーネルのcgroup機能に興味を持って以来,Linuxのコンテナ関連の最新情報を追っかけたり,コンテナの勉強会を開いたりして勉強しています。英語力のない自分用にLXCのmanページを日本語訳していたところ,あっさり本家にマージされてしまい,それ以来日本語訳のパッチを送り続けています。

Plamo Linuxメンテナ。ファーストサーバ株式会社所属。

Twitter:@ten_forward
技術系のブログ:http://d.hatena.ne.jp/defiant/

コメント

コメントの記入