仮想マシンとコンテナなどの仮想化技術について

仮想化技術

開発環境で動いていたプログラムが、他のシステム環境に移植したら動かなかった、ということはよくあることだ。VMware や Virtual Box に代表される仮想マシンや Docker や Singularity に代表されるコンテナなどの仮想化技術を使用することで、この問題を防ぐことができる。これにより、プログラムの開発コストや運用コストを大幅に削減することができる。

プログラムの開発は、多様なシステムに対応させるために、多くのコストがかかる。例えば、Linux/Ubuntu 20.04 で開発したプログラムであれば、他の Linux でも実行できることを確認する必要があり、また、場合によって Macintosh などの他のシステムでも実行できることを確認する必要がある。Ubuntu で実行できるが、Macintosh で実行できなれば、そのプログラムのコードを修正する必要がある。一方で、多様なシステム間に対応できるだけでは不十分である。例えば、Ubuntu 20.04 で開発したプログラムを Ubuntu 18.04 にインストールしようとすると、Ubuntu 18.04 上にある関連ライブラリーのバージョンが古くて、インストールできない場合もある。このとき、Ubuntu 18.04 をサポートするためにプログラムのコードをさらに修正しなければならない。このように、プログラムの開発は、多様なシステムに対応させるために、非常にコストのかかる作業である。

開発コストを削減する方法の一つとして、開発システムをそのまま運用システム上に展開するという仮想化技術が使われている。開発者は、まず仮想システムを作り、次に、その仮想システム上でプログラムの開発を行う。開発が終了すると、開発者はその仮想システムとプログラムをまるごとパッケージ化(イメージ化)して配布する。これにより、利用者はそのパッケージを手持ちのシステム上に展開することで、利用者のシステム上にその仮想システムが作られる。このとき、利用者の手持ちのシステムの種類にかかわらず、仮想システムは開発者が使用した仮想システムと同一のものになるため、仮想システムに実装されたプログラムが正常に動作する。

仮想システムのインストールあるいは展開は難しいように感じるかもしれないが、VMware、Virtual Box、Docker、Singularity などの仮想化アプリケーションを使用することで、簡単に実現できる。

VMware や Virtual Box に代表される仮想マシン(Virtual Machine; VM)は、既存のシステム(ホスト OS)の中に、もう一つの仮想システム(ゲスト OS)を構築するものである。このとき、ホスト OS の中のゲスト OS がアプリケーションのように使えて、また、ゲスト OS があたかも一つの独立した OS のように利用できる。例えば、Windows に VMware をインストールして、VMware を使って Ubuntu をインストールすると、Windows と Ubuntu の両方が、一つのパソコン上で同時に使えるようになる。このように、仮想マシンは、ホスト OS の中にゲスト OS をインストールして使用するので、ハードウェアのリソースを二つの OS が同時に使用していることになる。

仮想化技術を代表するもう一つの技術は Docker や Singularity などのコンテナとよばれるものがある。コンテナは、ホスト OS からプログラムを実行するための環境を隔離して、仮想的な実行環境を構築している。仮想マシンと異なり、コンテナは隔離されたプログラムの実行環境であるため、ハードウェアのリソースをホスト OS を介して使用しているため、比較的に軽量である。