paiza開発日誌

IT/Webエンジニア向け総合求人・学習サービス「paiza」(https://paiza.jp ギノ株式会社)の開発者が開発の事、プログラミングネタ、ITエンジニアの転職などについて書いています。

知らぬはエンジニアの恥。今さら聞けない【コンテナ/仮想化技術】11選

f:id:paiza:20161213120907j:plain
Photo by Sam MacCutchan

どうも後藤です!

もう10年以上になるでしょうか・・・ とにかくなんでもかんでも仮想化すればよいというこの風潮paizaでも仮想化技術は大活躍中。インフラは仮想化技術の上に構築されているし、もちろんコードの評価環境だってばりばりの仮想環境上です。仮想環境ばっちこーい!

いったいいつからこんな流れになったんでしょう?どこに基準を求めるかでだいぶかわりますけれども、執筆現在から考えると、こうした流れには35年くらいの歴史があります。使われる仮想化技術は時代とともにかわってきました。だいたいどの時代にも流行ってものがありました。

最近(2014年ごろ)の流行とえば、インフラの一番下にハイパーバイザを入れて、その上でDockerを動かして、管理にはChefやPuppetを使うといったものです。数年経てば状況は変わるでしょうけれども、とにかく楽をしたいというインフラ担当者と開発担当者の欲望が存在する限り、この手の技術は使われつづけることでしょう。

そこで今回は!この仮想化技術、今日に至るまでのエポック的な技術や製品を愛と独断と偏見で厳選ピックアップして紹介したいと思います。聞いたことのない技術があったなら儲けもの。知らなかった技術の方が採用に適してたなんてことはよくある話ですので、「あぁ、こっちのがよかったな」的なものがあったなら、そのうちしれっと入れかえちゃいましょう!

今回紹介する仮想化技術

  1. chroot
  2. FreeBSD Jail
  3. Solaris Containers
  4. Linux cgroups
  5. LXC
  6. Docker
  7. VMware Workstation
  8. Xen
  9. KVM
  10. FreeBSD bhyve
  11. Jailhouse

■1 ファイルシステムの区画化ってなんぞ「chroot

執筆現在からみるとちょうど35年前になりますけれども、Viersion 7 Unixchroot(2)という名前のシステムコールが導入されました。大雑把に言いますと、この技術が後のFreeBSD Jailになって、Solaris Containersになって、Linux cgroupsとDockerになっていきます。2014年の流行の最先端は、35年前にはじまっていた!

chroot(2)システムコールは1983年にリリースされた4.2BSDに取り込まれました。4.2BSDに取り込まれた理由はクリーンなビルド環境を用意したかったためだと言われています。chroot(2)はルートディレクトリを変更するというシステムコールなので、そういったことができます。

たとえば、ディストリビューションを/home/jail001/以下に全部展開して、/home/jail001/をルートディレクトリとするようにchroot(2)システムコールを実行したとしましょう。指定されたプロセスのルートディレクトリを/home/jail001/に設定した場合、彼はこのディレクトリよりも上、または横に移動することができなくなります。だってそこが一番上(ルートディレクトリ)にされてしまうのですから、それよりも上には移動できないわけです。

これがchroot(2)のもたらす仮想化です。言葉としては「区画化」「分離化」といった方がうまいことニュアンスを表現できると思います。

f:id:paiza:20141017131907p:plain
図1.1 ホストもゲストも同じお作法で操作できるという優れもの.


このアイディアは実に優れたものです。今日においてもchroot(2)が活用されているのはこのアイディアが本質的に優れているからでしょう。それは、chroot(2)システムコールは、この機能を利用するユーザや開発者に対して新しい学習を求めないという点にあります。これまでUNIXを扱ってきたのと同じやり方で、chroot(2)で仮想化された世界を利用できます。これはとてもとても大切なポイントです。

区画化またはセキュリティ強化の目的でさまざまなオペレーティングシステムがさまざまな機能を実装していますが、新しい学習を伴う技術は広く普及せず、いずれは廃れる傾向があります。普及するのはシンプルでわかりやすく、新しい学習を求めないものというのはよくあることです。chroot(2)はその点でよく考えられたアイディアです。

当初のchroot(2)システムコールには仮想環境(一般的にchroot jailと呼ばれています)を抜け出す穴が存在していましたが、現在はその穴もふさがれ、BINDやFTPApache、Nginxなどを動作させる牢獄として使うといったセキュリティ強化の目的でも使われています。

このあとchroot(2)系の仮想化技術/区画化技術の話をしますけれども、後半に取り上げるハイパーバイザ型との最大の違いは「動作が高速」「カーネルはひとつ」という点にあります。高速さやとにかくたくさんの仮想環境を詰め込みたいという場合にはchroot系の技術をあたってみましょう。逆に、複数のオペレーティングシステムが混在した環境が使いたいならハイパーバイザ型の方が無難です。このあたりは適材適所使い分けるところでしょう。

■2 root権限を一般ユーザにあげられる!「FreeBSD Jail」

f:id:paiza:20141017175236p:plain:w300

chroot(2)の後継者となる技術が登場するまで21年の歳月が流れます。FreeBSDのエンジニアがある要求を満たすために「FreeBSD Jail」と呼ばれるアイディアを考案しました。FreeBSD Jailは2000年にリリースされるFreeBSD 4.0に導入され、FreeBSDの普及を決定づける機能になりました。

現在のUNIX系のオペレーティングシステムはさまざまなセキュリティ機能を持っているので、一般ユーザに対して特定の特権機能を付与するといったことができますけれども、もともとのUNIX的なオペレーティングには「root」と「それ以外」というユーザしか存在せず、root権限の一部をそれ以外のユーザに与えるということができませんでした(setuidビット、setgidビット、グループとパーミッションを駆使してもできなくもないのですが、そうやって作った環境の管理は・・・ちょっと悲鳴ものです・・・)。

FreeBSD Jailは「一般ユーザにroot権限をあげる」という要求を満たすために考案されたアイディアです。FreeBSDのエンジニアは、この問題を解決するには、chroot(2)を拡張してファイルシステム以外のグローバルなリソース空間も区画化しちゃえばいいじゃないか、と考えました。

f:id:paiza:20141017131937p:plain
図2.1 一般ユーザにかりそめのroot権限を与えるというスマートな解決方法を考案したFreeBSD Jail


このアイディアも実に優れていました。それはchroot(2)の利点とまったく同じです。この機能を利用するユーザに新しい学習を求めないということです。これまでホストをいぢっていたようにゲストでも操作できます。しかも、Jail内で動作するrootは権限が制限されていて、ホストに影響を与えることができないようになっています。一般ユーザにroot権限を与える必要があれば、FreeBSD Jailという仮想環境を構築して、その中にかりそめのrootとして動作してもらえばよい、というわけです。

FreeBSD Jailは年を追うごとに進化を重ね、現在ではJailの中のJailの中のJailの中のJailの中にJailを作ったり、ネットワークスタックを個別に持ったり、Jailごとにリソースを制御したり、さまざまなことができるようになっています。

■3 簡単ボタン一発簡単!Dockerに強い影響「Solaris Containers」

f:id:paiza:20141017180616p:plain:w250

FreeBSD Jailの登場から5年、Solarisに「Solaris Containers」と呼ばれるもっと便利な機能が登場します。FreeBSD 4.0当時のFreeBSDインストーラの中身が現在ほどパッケージング化されていませんでした。現在は追加パッケージなしにDockerのようなことができますけれども、当時は仮想環境を構築するのにソースコードからビルドする必要があるなど、にわかユーザがビビりかねない挙動がデフォルトになっていました。

Solarisは考えます。もっとパッケージングを進めて、ボタン一発で同じことができれば、その方がいいんじゃないか・・・ それを実現したのがまさに「Solaris Containers」です。

f:id:paiza:20141017132005p:plain
図3.1 ボタン一発で簡単操作Solaris Containers

流行に乗ってDockerしまくっている方であれば、Dockerのようなものだと考えてもらえればいいと思います。10年ぐらい前にはすでに似たようなものがSolarisにはあったんですね。DockerはいわばAPIですので、Dockerのサブコマンドを受けてSolaris Containersの操作に置き換えるラッパスクリプトなどを用意してあげれば、DockerのインターフェースでSolaris Containersを管理するといったこともできます。FreeBSD Jailも同様です。

■4 Lワールドにもchroot系技術登場「Linux cgroups」

f:id:paiza:20141017175356p:plain:w150

Linuxは早期の段階からハイパーバイザ型の仮想化機能が充実していたので、chroot(2)型の仮想化機能の普及は後回しになります。2008年にLinuxカーネルにマージされたcgroupsの機能をその発端と捉えるのがよいんじゃないかと思います。

Linux cgroupsはFreeBSD Jailとリソース管理技術といったあたり(厳密に同じではない)を整理したAPIのもとで提供しよう、という技術です。後発の技術だけあってよく整理されています。Linuxカーネルにcgroupsの機能がマージされたことで、LXCやDockerのようなソフトウェアの提供が可能になりました

ユーザが直接cgroupsを活用する(利用してソフトウェアを実装する)ことはあまりないかもしれませんけれども、根幹ではこうした機能が使われているんだ、ということは覚えておいて損はないと思います。

■5 不遇の子になりそうです・・・「LXC」

f:id:paiza:20141017175449p:plain:w200

Linux cgroupsを活用した仮想化技術としてはLXC(Linux Containers)が代表的なパッケージングソフトウェア、いわゆるSolaris Containersのような存在になるのではないか、と、多くの関係者が見ていたのではないでしょうか。実際にLXCをベースとして仮想化の開発を進めていたところは少なくなかったと思います。区画化、分離化といった言葉ではなく「コンテナ」といった言葉が使われるようになったのはこの頃から強くなっていったように思います。

しかし、LXCは2014年に大きく注目されるようになったDockerにスポットライトをかっさらわれてしまいます。特にDockerがRed HatGoogleVMwareの協力を取り付けたのが大きかったように思います。今後ユーザからの要望があればLXCにスポットライトが戻ってくるかもしれませんが、今のところその役目はDockerに移ったように思えます。

しかしながら、これまでLXCでシステムを開発してきたということであれば、無理にDockerへ移行するとか、ほかの技術へ移行するとか、そういったことはしなくてもよいと思います。技術の中身を把握しているなら、よく知っている技術を使った方がよいと思います。

■6 ビジネスも政治もうまくいったぜ大成功「Docker」

f:id:paiza:20141017175515p:plain:w400

ここへ来てchroot(2)型の話題の集大成とでもいうべきソフトウェアが登場します。2014年に大きく注目されるようになったDockerです。Solaris Containersとの違いは、それがLinuxの人気の高いディストリビューションを採用していたこと、アピールの仕方がうまかったこと、Red Hatが採用したこと、GoogleVMwareも協力していること、でしょう。とにかく、ビジネス的にも政治的にも、はたから見ていて最大限にうまくいったのがDockerではないかと思います。

もちろん背景には需要があったのも事実でしょう。XenKVMで仮想環境を構築したものの、期待していたほどは費用対効果が見込めない、仮想環境がなんか遅い、そんな不満がDockerへ注目を向ける理由のひとつになっているのは間違いのないところです。

もしDockerに優位性を見いだしたのであれば、Jailやchroot(2)なども検討してみるとよいかもしれません。JailやchrootはDockerよりも軽い環境を作れるので、とにかく数を増やしたいといった場合にはそこまで踏み込んでみるのもひとつの選択肢です。

実はpaizaも諸々検討の末、Dockerを利用して運用されていたりします。

■7 ハイパーバイザ型の申し子「VMware Workstation」

f:id:paiza:20141017175621j:plain:w400

ここでいったん時代を巻き戻し、1999年まで遡りましょう。この年、PC向けにVMware Workstationが登場します。PCそのものをエミュレートするタイプの仮想化技術です。WindowsユーザやMac OS Xのユーザであれば「仮想化」といえば概念的にこの手のソフトウェアを指すことが多いでしょう。

VMwareはこの後もさまざまなVMware系のプロダクトを発表します。VMwareのプロダクトはデータセンターや大規模インフラストラクチャを支えるソフトウェアとして活用されているほか、PCやMac OS Xなどでも複数のオペレーティングシステムを動作させるための仮想環境として活用されています。

ハイパーバイザ型とchroot(2)型の最大の違いは、異なるカーネルを実行できるかどうかにあります。ハイパーバイザ型は完全に異なるオペレーティングシステムを同時に実行できますので、管理の上ではこちらの方が簡単になることがあります。このあたりはケースバイケースです。わかりやすさや利便性をとるか、軽量高速性を取るか。多くの方がハイパーバイザ型になれていると思いますので、もし興味がでたらchroot系の技術でも遊んでみてください。

■8 今につながるLinuxハイパーバイザの源流「Xen

f:id:paiza:20141017175649p:plain:w250

現在のLinuxにおけるハイパーバイザ技術の流れを作り出すことになる技術がVMware Workstationの登場から3年後に登場したXen 1.0です。Linuxカーネルそのものをハイパーバイザとして動作させ、その上でLinuxやほかのオペレーティングシステムを動作させるという仕組みになっています。Amazon EC2Xenをベースに構築されていますし、現役バリバリの仮想化技術です。

Xenは高性能で高機能なアプライアンスにおける仮想化技術としても活用されています。現在ではUNIX系のオペレーティングシステムが高性能アプライアンス、モバイルデバイス、組み込みデバイス、はてはケーブルにいたるまで、さまざまなデバイスで利用されています。中には仮想化技術の活用が必要なものもあり、そういった分野でもXenが使われています。

■9 進撃のRed HatKVM

f:id:paiza:20141017175722p:plain:w300

Xenの登場から4年経って、今度はKVMLinuxカーネルにマージされました。これはXenのような機能がデフォルトのLinuxカーネルで利用できるようになったことを意味しています。こうした動きはRed Hatが進める自社プロダクトの戦略・戦術的な動きを伴うものです。Linuxをサポートする企業としての現行覇者といえばRed Hat。その地位は今後十年、まったく揺るがないように見えるわけで、KVMLinuxカーネルにマージされたことは関係者にとっては脅威でもありました。

KVMの最大の売りは、やはり導入の簡単さにあります。カーネルの再構築も必要ありません。サポートされているディストリビューションであればゲストのインストールも簡単です。Linuxでの仮想化技術とえばKVMがまっさきに概念として頭に浮かんでくる方は少なくないと思います。

■10 シンプル・イズ・正義「FreeBSD bhyve」

f:id:paiza:20141017175236p:plain:w300

FreeBSD Jailが早期に成熟したFreeBSDは、ハイパーバイザ型の仮想化技術は後手に回ります。このあたりの動向がLinuxの動向と真逆なのが面白いところです。お互いにないものを求めるものなのでしょう。

FreeBSDのハイパーバイザが登場する以前から、カスタマイズしたFreeBSDXenKVMのような機能を導入して使っているベンダがいくつかあります。その中のひとつであるNetAppがハイパーバイザ系の仮想化技術をFreeBSDプロジェクトへ寄贈します。これがbhyve(ビハイブ)です。ハイパーバイザ型の機能としては最後発になる技術で、シンプルでコードの見通しやさっぱり具合が素晴らしい実装です。Intelプロセッサの仮想化技術支援機能が存在していることを前提にしているため、それまでのソフトウェアエミュレート前提だったソフトウェアに比べて実装が簡単という特徴があります。

FreeBSDを利用するベンダは時々、競合他社に強い有利性を与えない範囲内でコードをプロジェクトへ寄贈しています。不思議に思うかもしれませんが、これにはちゃんとした理由があります。FreeBSDを利用するベンダとしては、自分たちが利用するこの基盤ソフトウェアが常にシーンとして上がり続け、発展し続けることも望んでいます。FreeBSDプロジェクトが消えてしまっては困るわけです。

そんなわけで時々こうした基礎技術がプロジェクトに提供され、本体にマージされています。

ハイパーバイザ型のDocker?「Vagrant

f:id:paiza:20141017180033p:plain:w300

ハイパーバイザ型の仮想化技術にも、これらを抽象化してもっと簡単に操作できるようにしようというソフトウェアが存在します。VagrantがそれですVagrantを使うことで仮想ディスクイメージのダウンロードから仮想環境のセットアップまでを自動化できます。アイディアの根幹はDockerと似ています。


ただし、こちらは本番環境での運用というよりも、グループ内での開発環境や試験環境などを迅速にセットアップすることに主眼が置かれているように思います。また、ハイパーバイザ型の仮想化技術はGUIが充実していることが多いため、Vagrantの必要性はDockerに比べると低いところがあります。


ということで、Vagrantについてはコラムでの扱いとさせていただきました。でもこんな技術もあるんだよ、ということは知っておいて損はないと思います!

■11 ハイパーバイザとchrootの最終進化形!?「Jailhouse」

f:id:paiza:20141017180134p:plain

Dockerよりもさらに最新の仮想化技術になりますが、最近になって「Jailhouse」という新しい仮想化技術が注目を集めています。2014年9月に初のリリースバージョンが公開されたもっとも新しい仮想化技術で、Siemensが技術供与をおこなっています。

Jailhouseはいわゆるハイパーバイザ型のアプローチをとった仮想化技術ですが、bhyveよりもシンプルに徹しており、さらにこのマルチコア/メニーコア時代を見据えた設計がきらりと光る一品です。Jailhouseはハードウェアを区画化することに主眼をおいています。実装としてはハイパーバイザですが、やることはハードウェアレベルでの区画化です。

Jailhouseの目的はセルの作成にあるので、ハードウェアのエミュレーションやさまざまな機能の提供を実現しているXenKVMとは異なるところを目指しています。そうした機能が欲しい場合にはXenKVMを使って欲しいと説明している潔さ。これは惚れる。

Jailhouseではこの区画化された単位を「セル」と呼んでおり、今後のバズワードは「コンテナ」ではなく「セル」になるかもしれません。Jailhouseのアイディアはなかなか秀逸に見えます。今後のハードウェアはマルチコア/メニーコアで大容量メモリは当たり前ですので、ハードウェアレベルで区画化して、なるべく中間層を入れないでカーネルに渡すというのは、リソース制御的にもわかりやすく、効果が見込める方法です。

ニューフェースなのでどうなるかわかりませんけれども、今後の動向に注目しておきたい技術です。

■結局現実はシュール。銀の弾丸はどこにもない!

できればどれかひとつの技術にしぼってシンプルにまとめたい、そう考えるのは技術者であれば誰も同じだと思います。が、世界はそれほどヌルくはなくて、適材適所で、そして過去の遺産と同居しながら、さまざまな仮想化技術を併用した混沌とした管理環境になっていくというのが、現実といったところでしょう。

2010年に公開された映画「インセプション」で、主人公らが潜在意識の中へ、いわゆる夢の中へ潜るというシーンがあります。最終的にもっともっと深い潜在意識へと潜り込んでいって、潜在意識から戻ってきたことになっているものの、実はここが現実なのか夢の中なのかわからないようなシーンで映画は終わります。今の仮想化技術も同じです。現実の世界のコンピュータの中も実際にそれがベアメタルの上のいわゆるホストなのか、ゲストなのか、そのホストすらもベアメタルの上で直接動いているのか、ハイパーバイザの上で動いているのか、もう区別を付けるのが難しい時代になってきました。

こうした仮想化技術はいわゆるインフラエンジニアと呼ばれる担当者が構築することになるでしょうし、Webアプリケーション開発者の場合にはほとんどのエンジニアが触らない部分かもしれません。しかしながら、今後専門職はますます職を探すのが難しくなる時代です。上から下まで全部できるフルスタックエンジニアを目指して、全部かっさらっていこうじゃありませんか :)




paizaではITエンジニアとしてのスキルレベル測定(9言語に対応)や、プログラミング問題による学習コンテンツ(paiza Learning)を提供しています。テストの結果によりS,A,B,C,D,Eの6段階でランクが分かります。自分のプログラミングスキルを客観的に知りたいという方は是非チャレンジしてみてください。

http://paiza.jp