Chonaso's Commentary

InternetやIT技術などについて知ったこと、試したこと、考えたことを書いていきます。

ハードウェア仮想化とコンテナとImmutable InfrastructureとDocker

Dockerが小気味良いのでDockerの記事を書こうと思いましたが、 どうも一部でDockerがごく新しい概念のように語られるケースが見られるので、 年季の違いを見せ付けるためにジジイ臭さ全開な記事を一つ。

ハードウェア仮想化

ハードウェアをソフトウェアで擬似的にエミュレートするプラットフォームをハードウェア仮想化と呼んでいます。 現在動作しているOS上に仮想的なハードウェア(仮想マシン)を作成し、それに対して別のOSをインストールし動作させることができます。仮想マシンは柔軟にリソース割り当てを行うことができ、さまざまな構成の環境を作ることができます。

最初はその動作は非常に重く用途が極めて限定的でしたが、ハードウェア性能の向上やハードウェアによる仮想化サポート機能などによりこれまでの物理環境と比べても遜色なく実用的なものとなりました。

これにより、ホスティング環境の抽象化・ポータビリティの高さ・ハードウェア集約*1が次第に注目されるようになりました。

現在使われているハードウェア仮想化プロダクトはVMWare,VirtualBox,Xen,KVM,Hyper-Vなどがあり、そのほとんどがx86系のハードウェアをエミュレートするものとなっています。

また、IaaS*2系のクラウドサービスで提供されるものはまさにこのハードウェア仮想化されたホストとなります。

コンテナ(OSレベル仮想化)

Dockerで再び注目を浴びている技術ですが、コンテナ自体の歴史はそれなりに長いです。 仮想化の一種と分類されることも多いですが上述のハードウェア仮想化とは全く概念が違うものです。

端的にいえば、コンテナはFTPSSH/SFTP/SCPなどで使われるchroot*3が高度化したものです。 ベースとなるOS上で各仮想ホスト毎に(見かけ上)独立した環境を提供されますが、それぞれの環境で実行されるプロセスはすべてベースOSの上で動いています。そのため、提供される仮想環境はベースOSと同じOS(カーネル)となります。

コンテナのメリットは、ハードウェアのエミュレーションが行わないため(物理環境と比較した際の)オーバーヘッドがほとんどない*4カーネルを含めたリソースの多くを共有するためハードウェア仮想化型と比べてリソースの利用効率が非常に高いという点が上げられます。

性能的なハードルが低かったため、コンテナはハードウェア仮想化よりも先に実用段階に入っていました。 ちなみに、VPS黎明期ではコンテナ型のサービスが多く当時は1つのホストに極端にユーザを詰め込む業者もあったため、コンテナ自体にいいイメージを持たない人もいます。

コンテナのデメリット/リスクは使用できる環境はベースOSと同一のカーネルとなること、各仮想環境同士で同一のカーネル/リソースを共有するため各仮想環境同士のリソース制限がやりにくい、一つの仮想環境が引き起こしたトラブルでベースのOSごとクラッシュさせる可能性がある、などがあります。 これらはコンテナのリソース管理が高度であれば解決できる問題かと思います。

コンテナの実装としてはDockerはLXC(Linux Container)を使用しており、他にはjail(FreeBSD)、zone(Solaris container)、OpenVZ(Linux),Virtuozzo(Linux,Windows)などがあります。

コンテナについては、OpenVZ/Virtuozzoが流行った時の資料が理解を助けやすいかと思います。

ハードウェア仮想化の普及

一時期、コンテナ型の仮想化の(話題としての)人気は下火になりました。 理由は以下が挙げられるかと思います。

  • ハードウェア性能の向上で仮想マシンが実用段階に入った
  • 従来のハードウェア環境からの移行がしやすい
  • AWSなどのIaasクラウドの普及

さらに仮想マシンの普及によって物理マシンでは様々な事情で実現しづらかったことが容易に実現できるようになりました。

  • 用途毎に構成を決めたハードウェアを用意する必要がなくなった
  • 環境ごと持ち出しやすくなった
  • 不要になったら簡単に消せる

ここ数年話題になっているImmutable Infrastructureはこの流れを汲んだものとなっています。

つまり、必要なときに仮想マシンを新規に作成し必要なミドルウェアのインストールやアプリケーションのデプロイまで自動で行ない、変更が必要な場合は新たに仮想マシンを作成し古い仮想マシンを捨てる(削除する)、というものです。

これによって、CIツール仮想マシン作成から始める事でクリーンなテストを行うことができるようになりました。

なぜ、またコンテナなのか

ハードウェア仮想化によるインフラ(ホスト)構築で問題になるのは「仮想マシンを作って必要なミドルウェアをインストールする」ことに時間がかかる、という点です。いくら実用に入ったとはいえ、OSのイメージは数100M~数10GBありますし、それらが作られ起動するにはある程度の時間を要します。

特に開発段階では何度もこれを繰り返すため、無駄な待ち時間が問題となります。

このソリューションとして今Dockerが注目されています。

開発環境はWindowsMacなど様々ですが多くのWebサービスLinux上で動かしているケースが多いです。 特にWebアプリケーション開発のテストにおいてはハードウェアやOS、ミドルウェアの構成や設定を頻繁に変えることはありません。

ここを省略化・高速化するためにコンテナ+強力な構成管理機能を持ったDockerが使われます。

Docker後の課題、サービス

直近ではDocker環境とプロダクション環境(本番環境)との差異をどうするか、という問題があります。

Dockerは1.0となり「商用環境でもOK」と言われるようになりましたが、おそらく従来のコンテナ運用とは異なるノウハウが必要となるかと思います。

これが解決していくとDockerは次のステージへを移っていきます。

DockerはIaaSではなくPaaS*5 に近い存在です。OpenShiftが似たような存在かと思います。

Docker Hubなどの普及でよりコモディティ化されていくことが考えられますが、Dockerが手軽に使えるクラウドサービスが現れれば、今存在するPaaS系サービスよりはるかに敷居の低いPaaSサービスになるかと思います。

あるいは、各クラウドで同一のプラットフォームを構築しやすくなります。これによってクラウドサービス全体で障害が起こった場合などに、別のクラウド事業者への退避が格段にやりやすくなっていきます。


どうでもいいですけど、Immutable InfrastructureとかInfrastructure as codeとか長いので一般的な略称とかないですかね...


*1:1台の物理サーバにOSをインストールして使用してもリソースや性能が使い切れずに余るので、複数の仮想環境を作成することでサーバ一台当たりの利用効率を高める

*2:Infrastructure as a Service。 仮想マシンやネットワークインフラをインターネットサービスとして提供する形態。AWS,さくらVPS,NiftyCloud,Konohaなど。

*3:セキュリティ向上を目的とした、ユーザ同士で全く干渉することのないログイン環境

*4:これがDockerが軽いといわれる理由

*5:Platform as a Service アプリケーションソフトウェアを構築・運用するためのプラットフォームを提供するサービス。IaaSと違い、インフラレイヤーをほとんど意識させないことが多い。Google App Engine、Heroku、AmazonRDSなど