Chapter 02

1部: 仮想化とは

ほげさん
ほげさん
2022.03.21に更新

簡単に仮想化技術について学び、コンテナ型仮想化の特徴や基本的な考え方を理解します。

サーバ仮想化とは

サーバ仮想化とはコンピュータのリソースを管理するための様々な技術のことで、たとえば1台のサーバの中にネットワークやストレージを仮想的に用意して、複数の異なるサーバが動いているように見せかけたりする技術のことです。

サーバ仮想化は 物理的なサーバとソフトウェアの間に仮想化ソフトウェアを挟む ことで実現されますが、仮想化ソフトウェアを どこ にインストールするか、仮想化ソフトウェアが なに を管理するか、でいくつかのパターンに分類されます。

  • ホスト型仮想化
  • ハイパーバイザー型仮想化
  • コンテナ型仮想化

簡単に個別に説明します。

ホスト型仮想化

ホスト型仮想化を実現する仮想化ソフトウェアは、ホスト OS にインストールされ、ゲスト OS を管理します。

次の図のオレンジやピンクの部分がいわゆる「仮想サーバ」です。

image

ホスト型仮想化には次のような特徴があります。

  • 既に使っているマシンに仮想サーバを構築する場合などに有用
  • ホスト OS があるのでブラウザやエディタも普通に使い続けられる

ホスト型仮想化を実現する仮想化ソフトウェアの代表例として、Oracle VM VirtualBox や VMware Fusion などがあります。

ハイパーバイザー型仮想化

ハイパーバイザー型仮想化を実現する仮想化ソフトウェアは、一般には ハードウェア にインストールされ、ゲスト OS を管理します。

ホスト型仮想化と同じく、次の図のオレンジやピンクの部分がいわゆる「仮想サーバ」です。

image

ハイパーバイザー型仮想化には次のような特徴があります。

  • ホスト OS の起動を待ったりリソースを割り当てたりしなくていい
  • ゲスト OS 以外は動かせない

ハイパーバイザー型仮想化を実現する仮想化ソフトウェアの代表例として、Windows の Hyper-V や Linux の KVM などがあります。
Microsoft Hyper-V などから連想できるように、ホスト OS の上でハイパーバイザー型の仮想化ソフトウェアを動かすことも可能です。

コンテナ型仮想化

コンテナ型仮想化を実現する仮想化ソフトウェアは、ホスト OS にインストールされ、アプリケーション を管理します。

次の図のオレンジや黄色やピンクの部分が「コンテナ」です。

image

コンテナ型仮想化には次のような特徴があります。

  • ゲスト OS が存在しないので、起動のコストが大幅に少ない
  • サーバではないので、1つのコンテナに複数のアプリケーションをインストールしない
  • ホスト OS があるのでブラウザやエディタも普通に使い続けられる

コンテナ型仮想化を実現する仮想化ソフトウェアの代表例として、Docker などがあります。

コンテナ型仮想化の特徴

ホスト型仮想化とハイパーバイザー型仮想化と比べながら、コンテナ型仮想化の特徴について学びます。

利点

起動が早い

まず普段実感する最大の特徴として、ゲスト OS の起動が不要なため、ほかの方式よりも起動が圧倒的に早いという点が挙げられます。
サーバ全体ではなく1アプリケーションごとに起動できるという点も、起動が早くなる理由の1つでしょう。

次の図の PHP ( オレンジ ) を実行するために起動するものを比べてみると、どれほど軽量か想像できます。
ひどく乱暴に言えば PC 再起動 vs PHP コマンドの実行 くらい違います。

image

そのためコンテナ構築のトライ & エラーが楽だったり、気軽にコンテナを停止したり起動したりすることが可能です。

その気軽さを活かして「テストを実行するコンテナを用意しておき、テスト中だけ起動して数分で捨てる」という小さいサイクルに組み込むことができます。

デプロイしやすい

たとえば次の図のようにローカル開発をホスト型仮想化で行っていて、デプロイ先サーバがハイパーバイザー型仮想化が行われていれば、ローカルで起動するものとサーバにデプロイするものが一致する のでデプロイはある程度簡単です。

image

しかし多くの場合は、デプロイ先サーバは仮想化されていないがローカルだけ仮想化を行っている、という形が多いのではないかと思います。

仮想化がローカルだけでも、開発者の環境を揃えやすいなどの利点は十分にあるため、これ自体はおかしいことではありません。

しかしこれでは ローカルで起動するものとサーバにデプロイするものがずれる という問題が発生します。

たとえば「メールサーバは独立システムとして稼働しているから本番環境ではそっちに接続する」という構成は想像しやすいでしょう。

image

このずれが「デプロイ先の PHP のバージョンが ( 設定が ) 違っていた」というリスクや「.php だけデプロイする仕組みを作らなきゃ」というコストに繋がります。

コンテナ型仮想化であれば ローカルで起動するものとサーバにデプロイするものが一致する ので簡単にデプロイすることができます。

image

当然デプロイ先がコンテナ型仮想化をされていなければずれによる問題は同じく発生しますが、昨今は次のようなイメージレジストリやマネージドなコンテナのデプロイ先があるため、本番稼働もローカル開発もコンテナ型仮想化を前提として構築することが多くなっています。

  • イメージレジストリ
    • Docker Hub
    • Amazon Elastic Container Registry ( ECR )
    • Google Container Registry ( GCR )
  • コンテナのデプロイ先
    • Amazon Elastic Container Service ( ECS )
    • Google Kubernetes Engine ( GKE )

( これらについては【 1部: Docker とは 】で簡単に説明します )

結果的にはホスト型仮想化で例に挙げた ローカル開発と本番稼働のギャップは感じにくくなっている と言っていいでしょう。

デプロイ先がコンテナ型仮想化でない場合はずれは発生してしまいますが、仮想サーバではないのでコンテナは小さい という方のメリットは残ります。
下の図のオレンジの部分を見てください。

ホスト型仮想化でゲスト OS を起動すると、全ての機能が同じ Ubuntu に乗っているため、設定ファイルなどが混在しやすいです。

これではいざ PHP だけをデプロイしようと思ったときに「なんか設定ファイルあるんだけど、これって PHP 用? メールシステム用?」「え、サーバ内のそんなところにも設定ファイルがあったの知らなかった...」という事態を招きます。

image

対してコンテナ型仮想化は機能ごとにコンテナを起動するため、メールシステム用の設定が PHP コンテナに混入することはありません。

image

注意点

コンテナに OS は含まれないが、あるように見える

コンテナ型仮想化はゲスト OS を起動しませんが、Docker によりあたかも Linux が起動しているように見えます。

そのためコンテナ内では普通に /etc などのディレクトリがあったり lscd コマンドが使えたりします。

実際の使い心地としては Ubuntu や CentOS などを操作しているのとそう変わらないでしょう。

仮想サーバほど完全な分離やエミュレートはされない

Ubuntu や CentOS のように見えるとはいえ実際には OS は起動していないので、コンテナのカーネルはホストマシンの Linux カーネルになります。
( なぜ Linux が登場するのかは【 2部: Docker を理解するためのポイント 】で説明します。 )

そのため仮想サーバのようにハードウェアのエミュレートは行われなかったり、ホスト OS ( やその上の Linux ) との分離度が低いという点に注意が必要です。

また、Docker のコンテナは Linux のカーネルと機能を使って動いているため、必然的にコンテナの OS も Linux に限られます。

そのため、たとえば Ubuntu コンテナと Windows Server のコンテナなどは共存できません。

image

ホスト OS の違いがコンテナに影響する

コンテナにはゲスト OS は含まれておらずホストマシン上の Linux のカーネルを使っているため、ホスト OS の違いがコンテナに影響することがあります。

たとえば最近は M1 の Mac で Docker が動かないなどの話をよく聞きますが、その原因はホストマシンの Linux カーネルの違いによるものです。
Linux のカーネルはホスト OS と同じものをインストールすることになるため、結果的にホスト OS が違うと起動するコンテナも違うものになります。

image

コンテナは仮想化技術ですが、ホスト OS の影響を完全に受けないわけではない点は覚えておきましょう。

まとめ

長くなってしまったので、簡潔にまとめます。

  • ホスト型仮想化は ホスト OS にインストールされ ゲスト OS を管理する
  • ハイパーバイザー型仮想化は ハードウェア にインストールされ ゲスト OS を管理する
  • コンテナ型仮想化は ホスト OS にインストールされ アプリケーション を管理する
  • コンテナ型仮想化の利点は次の通り
    • 起動が早い
    • デプロイがしやすい
  • コンテナ型仮想化の注意点は次の通り
    • ほかの方法ほど完全に分離されていない
    • ホスト OS の違いがコンテナに影響する

忘れてしまったときは立ち返ってみてください。