Linux
docker
仮想化
kubernetes
新人プログラマ応援

はじめに

Kubernetes(k8s)が注目され始めていますが、それに伴いDockerのようなコンテナ型仮想化ソフトウェアにも注目が集まっています。本記事では、Kubernetes、Dockerって聞いたことあるけど、「そもそも仮想化って何?」ということについて簡単にまとめてみたいと思います。

サーバー仮想化とは

1台の物理サーバーを複数の仮想的なサーバーに分割して利用する仕組みのことです。それぞれの仮想サーバーで個別にOSやアプリケーションを実行することが可能で、独立したサーバー環境として利用することができます。

サーバー仮想化の手法

主に3種類の仮想化手法が存在します。
以下で1つずつ見ていきますが、サーバー仮想化の説明をするにあたり、「ホストOS」と「ゲストOS」という概念の理解が必要になってきますので、簡単に説明します。

ホストOS

仮想環境の土台となるOSを意味します。これは言い換えると「物理サーバーにインストールされたOS」ということになります。

ゲストOS

仮想環境上にインストールされたOSを意味します。

それでは、これらの概念を押さえたうえで1つずつ見てきましょう。

1. ホスト型仮想化

a.png

ハードウェア上にホストOSをインストールした上で、その上に仮想化ソフトウェアをインストールします。この仮想化ソフトウェアによってサーバーハードウェアをエミュレーションすることで仮想サーバーを実現するのがホスト型仮想化です。
ホスト型仮想化のメリットは、仮想化ソフトウェアをインストールするだけで仮想サーバー環境が構築できるという手軽さです。そのため、開発環境の構築などによく使われます。ただし、ソフトウェア的にサーバーハードウェアをエミュレートするため、どうしても仮想化のオーバーヘッドが大きくなります(言い換えると、仮想サーバーを動かすためにホストOS自体の処理も必要になるため全体として処理速度が出にくいです)。
なお、ホスト型の仮想化ソフトウェアには、Oracle社の「Oracle VM VirtualBox」やVMware社の「VMware Workstation Player」等があります。

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

aaa.png

ハイパーバイザーというハードウェアが持つ仮想化支援機能と連携してサーバー仮想化を実現するのがハイパーバイザー型仮想化です。ハイパーバイザーはOSよりも上位の層からプログラムを実行するので、仮想化を実現するためのOSを必要としません。
ハイパーバイザー型仮想化のメリットは、ハイパーバイザーがハードウェアを直接制御するため、リソースを効率よく利用できるところにあります(言い換えると、仮想サーバーを動かすためにホストOSを必要としないので、ゲストOSの動作速度の低下を最小限に抑えられます)。
なお、ハイパーバイザー型仮想化ソフトウェアには、Citrix社の「XenServer」やMicrosoft社の「Hyper-V」等があります。

3. コンテナ型仮想化

ss.png

冒頭でも述べましたが、近年主流となってきている仮想化技術です。ホスト型仮想化とハイパーバイザー型仮想化は、どちらも仮想的なサーバー環境を作り出してその中でゲストOSを稼働していました。そのため、仮想サーバーごとに完全に独立したゲストOSを実行することができます。ただし、これらの方式はハードウェア(CPU、メモリ、ハードディスク等)の割り当てをソフトウェアで代行するので、どうしてもその分のオーバーヘッドが大きくなります。
そこでコンテナ型仮想化です。コンテナ型仮想化では、ハードウェア上で稼働するホストOS上に論理的な区画(コンテナ)を作り、それぞれに独立したOS環境を提供します。実際に動作しているのはあくまで単一のOS(ホストOS)のみですが、アプリケーションの動作に必要なライブラリなどをコンテナ内に閉じ込めることで、あたかも個別のサーバーのように使えるようにします。コンテナ型仮想化はオーバーヘッドが少ないため、軽量で高速に動作します。一つのコンテナはホストOSから見ると一つのプロセスと見なされるので、ホストOS上で動作している他のアプリケーションとリソース(CPU、メモリ等)を共有します。つまり、コンテナをあまりに多く立ち上げすぎると、リソース的な観点から他のアプリケーションにも少なからず影響があることは認識しておく必要があります。
なお、コンテナ型の仮想化ソフトウェアには、Docker Inc.の「Docker」があります。

参考

プログラマのためのGoogle Cloud Platform入門 サービスの全体像からクラウドネイティブアプリケーション構築まで