サーバ仮想化の基礎知識
サーバ仮想化とは
情報科学の分野では、「仮想化」という単語は非常に多くの意味を持ちます。
たとえば、ネットワークの仮想化やストレージの仮想化、メモリの仮想化などが挙げられます。
本講義でのサーバ仮想化とは、以下を指します。
- 1 台の物理的なマシンの上に、複数の仮想マシンやアプリケーション環境を走らせること
なぜサーバを仮想化したくなるのか?
みなさんは、C 言語や Python の開発ツールのインストールに困ったことはありませんか?
また、作った開発ツールを手軽に友達に渡したり、別のマシンに移植したいと思ったことはありませんか?
サーバ仮想化の技術を知ることで、これらの問題を簡単に解決できます。
もちろん、解決できるのはこれらの問題だけではありません。
サーバ仮想化の技術は、実際のアプリケーションの開発現場で問題となってきた多くの問題点を解決できます。
たとえば、ユーザーのニーズに合わせたサーバの自動起動や自動停止、大人数での大規模アプリケーションの開発などです。
サーバ仮想化の技術を知ることで、いろいろな問題を解決できるのです。
サーバ仮想化のメリット・デメリット
サーバを仮想化するとメリットも多いのですが、デメリットもあります。
メリット
いろいろなメリットが考えられますが、主なものを以下に列挙します。
- 物理マシンのリソースの有効活用
- アプリケーションの実行環境の簡素化
- セキュリティの向上
- 動的なシステム規模の拡大縮小
- システム運用の効率化
1 と 2 は、1 台の物理マシン単独でもメリットとなります。 1 は、定義で示したように、複数のアプリケーションを 1 台の物理マシン上で動作させることで、リソースを有効活用できます。 2 は、アプリケーションに必要な環境をまるごと仮想化することで、別のマシンでも手軽に環境を再現できます。
3,4,5 は、特に、数百台大規模なシステムを管理・利用する場面で効果を発揮します。 3 は、アプリケーションをホスト OS から隔離することで、悪意ある第三者からの攻撃の被害を最小限に抑えることが挙げられます。 4 は、ユーザーの数や計算負荷が大きく変動する場合に有効です。負荷に追従して、アプリケーションやサーバの数を増減させることで、コストを最適なものにできます。 5 は、いろいろなアプリケーションが複雑に絡み合い、負荷が変動する場合に効果を発揮します。負荷に応じてアプリケーションを増減させることが容易になります。 たとえば、アプリケーションどうしの関連性を設定ファイルに記載しておくだけで、誰でも簡単にシステムを構築できます。
デメリット
デメリットは多くはありませんが、以下のようなものが挙げられます。
- アプリケーションどうしの関連が理解しにくい
- 利用のコストが見えにくい
1 は、複雑なサービスを運用する場合に問題となります。 たとえば、米 Netflix 社では、700 以上ものコンテナが複雑に絡み合ったシステムを稼働12させているそうです。 このような大規模かつ複雑なシステムでは、サーバ仮想化を行ったとしても全体像を把握することが簡単ではないと考えられます。
2 は、ユーザーの観点とシステムの観点から問題となります。 ユーザーの観点からは、サーバ仮想化技術は習得にそれなりに時間がかかり、学習コストがそれなりに高いものになります。 また、システムの観点からは、どのくらいの数の仮想マシンやアプリケーションが稼働するかを正確に予測することは簡単ではありません。 そのため、物理マシンの利用代金など、金銭的なコストを予想することが難しくなってしまいます。
2つのサーバ仮想化技術:ホストOS型とコンテナ型
現在利用されているサーバ仮想化技術には、ホスト OS 型仮想化とコンテナ型仮想化の 2 種類があります。 ここでは、両者の特徴と違いを簡単に説明します。
ホスト OS 型仮想化とコンテナ型仮想化術は、「物理的なマシンの上で仮想的な環境を動作させる」という点では、類似した目的を達成できます。 そのため、ひとまとまりで扱われることがよくありますが、技術的にはかなりの部分で別ものであり、特徴も異なります。 また、利用場面も異なるため、注意が必要です。
どちらも、物理的には 1 つのマシンの CPU やメモリを利用しているため、むやみやたらにたくさんのアプリケーションを動かすと全体として動作が緩慢になったり、動作しなくなってしまいます。 しかし、一時停止やスリープのようなことができるので、必要なときだけ動作させてリソースを有効活用できます。
なお、これ以外にも「ハイパーバイザ型」と呼ばれる仮想化技術も存在しますが、かなり特殊なソフトウェアが必要なため、本講義では扱いません。
ホストOS型
この方式は、非常にざっくり言うと、OS をまるごと仮想化する技術です。ホスト OS の上でホスト OS 型仮想化技術ソフトウェアが動き、そのうえでゲスト OS が動作します。ゲスト OS は、ホスト OS とほぼすべてのことができますが、ほぼすべてのことができるため動作が重たいです。たとえば、Windows をホスト OS とし、そのうえで Ubuntu をゲスト OS として動かすことができます。また、ホスト OS とは完全に隔離されているので、もっともセキュアな仮想化技術です。単純に「仮想マシン」と呼ばれることもあります。
本講義では、Oracle VM VirtualBoxというホスト OS 型仮想化ソフトウェアを利用します。
コンテナ型
この方式は、非常にざっくり言うと、アプリケーション 1 つ 1 つを仮想化する技術です。ホスト OS の上でコンテナ型
仮想化技術ソフトウェアが動き、そのうえで直接アプリケーションが動作します。ゲスト OS がないため、軽量かつ柔軟な運用が可能です。コンテナ型の仮想化でも、Ubuntu をホスト OS とし CentOS をゲスト OS として動かすことができます。また、OS を共有するため、セキュリティの面ではホスト OS 型よりも見劣りします。単純に「コンテナ」と呼ばれることもあります。
本講義では、Dockerというコンテナ型仮想化技術ソフトウェアを利用します。
ホストOS型とコンテナ型の組み合わせ
以下の図のように、上記の 2 つの方式を組み合わせて利用することもできます。
ホスト OS の上でホスト OS 型仮想化技術ソフトウェアが動き、そのうえでゲスト OS が動作します。さらに、ゲスト OS でコンテナ型仮想化技術ソフトウェアが動き、そのうえでアプリケーションが動作します。
複雑なように見えますが、AWS (Amazon Web Service)やGCP (Google Cloud Platform)やさくらインターネットのVPSなど、多くのクラウドサービスはこの形式でユーザーにサーバを提供しています。
本講義で扱う仮想化ソフトウェア
本講義では、ホスト OS 型仮想化ソフトウェアとしてOracle VM VirtualBoxを、コンテナ型仮想化ソフトウェアとしてDockerを利用します。また、両者を組み合わせた環境を構築します。
Oracle VM VirtualBox
Oracle VM VirtualBoxは、2007 年に初版が提供された老舗のホスト OS 型仮想化ソフトウェアです。個人利用の場合には無償で、Windows, Linux, macOS で動作します。
複数のゲスト OS を動作させることができ、それぞれ完全に独立したものとして扱われます。各ゲスト OS は、起動、終了だけでなく、一時停止やスナップショット、複製を行うことができます。また、各ゲスト OS の起動時には、それぞれが物理マシンの CPU やメモリを専有してしまうため、複数のゲスト OS を動作させる場合には調整が必要です。また、ゲスト OS が使用するメモリの総和は、物理マシンが搭載する物理メモリを超えても動作はしますが、動作は緩慢になります。ストレージについては、複数のゲスト OS が利用するストレージの総和は、物理マシンが搭載するストレージ容量を超えてはいけません。VirtualBox では、ストレージは「仮想ディスクイメージ (Virtual ディスク Images)」と呼ばれる専用の形式が利用されています。
たとえば、8 論理コア CPU の Windows マシン上で、4 コア CPU を専有する Ubuntu を 1 つ動作させることは可能です。しかし、ここに追加で 8 コア CPU を専有する CentOS を動作させることはできません。CentOS を動作させたい場合は、Ubuntu を停止する必要があります。
Docker
Dockerは、コンテナ型仮想化技術ソフトウェアの事実上の業界標準です。完全に無償の OSS (Open Source Software) で、Windows, Linux, macOS 向けのものが提供されています。
アプリケーションとその実行環境をDocker コンテナと呼び、コンテナを実行するために必要なファイルや情報をひとまとめにしたものをDocker イメージと呼びます。また、Docker イメージをテキストファイルとして書き出したものをDockerfileと呼びます。Docker イメージ自体は、一般的には数百 MB 程度です。Docker イメージはDocker Hubからダウンロードして使うことが想定されています。このダウンロードのことを pull と呼びます。Docker Hub には、多種多様なアプリケーションが登録されており、pull すれば即座に使える状態になっています。
たとえば、プログラミング言語 (Python, Java)、Linux のディストリビューション (Ubuntu, Fedora)、Web サーバ (nginx, Apache)、ホームページ作成環境(Wordpress, drupal)、データベース (PostgreSQL, mongoDB)などが登録されています。ユーザーは、目的のアプリケーションの Dockerfile を見つけて、docker pull hello-world
とコマンドをたたくだけで、Docker イメージのダウンロードや構築が自動的に行われます。
Docker コンテナは単独で利用することもできますが、多くの場合、複数のコンテナを連携させて大きなアプリケーションを構築する場面で利用されます。それぞれのコンテナはホスト OS のファイルやコンテナ間の仮想ネットワークを介してデータのやりとりを行います。たとえば、WordPress の場合、Web サーバと WordPress を実行するコンテナと、コンテンツを管理するデータベースを実行するコンテナが分離されており、2 つを実行して両者を仮想ネットワークで接続することで初めて WordPress を利用できます。
複数のコンテナの連携や接続関係を記述する方法に、docker-composeがあります。docker-compose を利用することで、複数の Docker イメージのビルドや各コンテナの起動・停止の順番などを自動的に行うことができます。