はじめに
昨今のIT業界では”コンテナ”をよく耳にする機会が増えたかと思います。コンテナの話をする上で関連する技術として仮想化があります。コンテナは仮想化技術のうちの一つと言えますが、どのような関連があるでしょうか。本記事では仮想化のおさらいからコンテナ技術の関連に関して説明します。
目次
1. 仮想化とは
1.1 仮想化の方法
1.2 ホスト型
1.3 ハイパーバイザー型
1.4 コンテナ型
1.5 各仮想化との比較
2. コンテナ
2.1 Docker
2.2 Kubernetes
2.3 ユースケース
仮想化とは
仮想化とは、大まかにインフラを抽象化することにあります。具体的には、複数の物理マシンのサーバをソフトウェアにより一つの物理マシンサーバに見せかけ、さらに必要なリソースに分けた仮想的な物理マシンを作り出すことができます。
あくまでも見せかけなので、論理的に区切られた領域になります。仮想化の目的としては、物理マシンのリソースを効率よく使用することにあります。
仮想化の方法
仮想化には大まかに3通りの方法があります。
- ホスト型
- ハイパーバイザー型
- コンテナ型
ホスト型
ホスト型は物理マシンサーバにLinuxやUbuntu等のホストOSをインストールし、1ソフトウェアとしてホスト型の仮想化ソフトウェアをインストールします。ホスト型仮想化ソフトウェアの例として、VMware Fusion、VMware Workstation Player、Oracle VM VirtualBox等があります。仮想化ソフトウェア上に仮想マシンを作成することができます。
特徴としては、ホストOSと異なるOSをゲストOSとしてインストールすることができます。また、仮想化ソフトウェア上に仮想マシンとして稼働しているため仮想化ソフトウェア以外にもホストOS側にリソースが許す限りアプリケーションを実行することができます。仮想化ソフトウェアはホストOS上の1プロセスとして動くため、仮想環境を動かすには仮想化ソフトウェアのオーバヘッドが含まれます。物理マシンリソースとしては、ホストOSのオーバヘッドも含まれるため仮想環境を動かすにはかなりのオーバヘッドが含まれてしまいます。
図1 ホスト型仮想化のイメージ
ハイパーバイザー型
ハイパーバイザー型は物理マシンにハイパーバイザー型仮想化ソフトウェアをインストールし、仮想化を実現します。ハイパーバイザー型仮想化ソフトウェアの例としては、VMware ESXi、Hyper-V、LinuxのKVM(Kernel-based Virtual Machine)があります。
特徴としては、物理マシンのホストOSが不要となりハイパーバイザー型の仮想化ソフトウェアが必要になります。
そのためハードウェアを直接制御できるため、仮想環境を動かす際にはハーパーバイザーのみのオーバヘッドが必要になります。各仮想環境間は独立しており、互いに領域を共有することができません。
図2 ハイパーバイザー型仮想化のイメージ
コンテナ型
コンテナ型は、物理マシンサーバにホストOSをインストールしコンテナ管理ソフトウェアをインストールします。代表例としてはdockerになります。コンテナ型では、コンテナイメージとしてアプリケーションやソフトウェアを実行環境とともに包括します。そのコンテナイメージを起動することによりホストOSの1プロセスとしてコンテナイメージ内のアプリケーションやソフトウェアが実行されます。
特徴としては、コンテナイメージは軽量なファイルにより容易に共有、編集が可能です。コンテナ型仮想化ソフトウェアも軽量なためコンテナ実行時のオーバヘッドが小さいです。隔離レベルはホストOSのリソースを共有するため、他のコンテナやアプリケーションと共有レベルを調節する必要があります。
図3 コンテナ型仮想化のイメージ
ホスト型、ハイパーバイザー型の仮想化とコンテナ型仮想化
これまでホスト型、ハイパーバイザー型の仮想化とコンテナによる仮想化に関して説明してきましたがそれぞれの差をまとめてみます。
表1 ホスト型、ハイパーバイザー型、コンテナ型仮想化の比較
ホスト型 | ハイパーバイザー型 | コンテナ型 | |
---|---|---|---|
オーバヘッド | ホストOSと仮想化ソフトウェア | 仮想化ソフトウェア | ホストOSとコンテナ実行ソフトウェア |
OS | ホストOSとゲストOS | ゲストOS | ホストOS |
隔離レベル | 仮想化ソフトウェアとホストOS間は隔離されている。仮想化ソフトウェア上のゲストOS間も隔離されている | 仮想化ソフトウェア上のゲストOS間も隔離されている | ホストOSとリソースを共有している |
コンテナ
コンテナはアプリケーションと実行に必要なライブラリ等を含めた環境をイメージとしてパッケージングして他のプロセスとは分離するための技術です。
コンテナ型仮想化を実現するソフトウェアとしてdockerが有名です。
docker
dockerはコンテナを管理、実行するためのソフトウェアでdocker自体は コンテナではなくコンテナは”技術”,dockerは”仕様”と言われています。イメージにアプリケーションや実行環境が内包されていて、イメージがレイヤーとなって構成されています。各ディストリビューションから公式のイメージも配布されています。イメージは独自のものも作成可能で、Docker HubのようなレジストリサービスでGithubのようにイメージの共有ができます。Dockerfileと呼ばれる定義ファイルを作成し、ベースとなるライブラリやOS等のイメージからコンテナイメージをビルドします。dockerさえ入っていれば、どのような環境下でもコンテナで同じアプリケーションを実行することができます。
図4 コンテナのイメージレイヤー
実際にコンテナにてアプリケーション等を実行するとなると可用性やデプロイに関して考慮する必要があります。その際にはコンテナを管理するシステムが必要になります。その代表例がkubernetesです。
kubernetes
コンテナ化したアプリケーションのデプロイ、管理、スケーリングが可能なソフトウェアです。”システムのあるべき姿”を設定ファイルに宣言的に構成を記述することにより例えば、ウェブサーバのコンテナを3つ稼働すると宣言すると1つ落ちた場合にも3つになるように自動的に調整してくれる仕組みです。Kubernetes クラスターを構成することにより、複数のサーバを単一の計算リソースへと抽象化します。ノードによりクラスターを構成し、マスターとなるノードがクラスターのコアとなり、コンテナの実行環境となるワーカーノードを管理します。
図5 kubernetes クラスター
ユースケース
コンテナ型が発揮されるケースとしてマイクロサービスアーキテクチャのシステムに用いられます。マイクロサービスとは、アプリケーションを独立した最小コンポーネントに分割し小さなサービスを作ります。小さなサービスを組み合わせて、一つのサービスを提供します。最小コンポーネントにすることにより、その単位で開発を進められ変更をかける際や障害時に影響範囲を小さくすることができます。それにより開発やテストにかける期間を短縮することができます。
そのため、最小コンポーネントをコンテナとすると理想的なアプリケーションの開発単位となり、コンテナを用いたマイクロサービスアーキテクチャが用いられるようになりました。
※より詳しい仮想化に関しては、【仮想化 入門】仮想化とはを参照ください。