今までのシステム運用といえば、物理サーバー上で複数のアプリケーションを実行する形式でした。1つのOSでCPUやメモリ、デバイスなどのハードウェア資源を管理し、プロセス間で効率的に共有する動作を行います。
物理サーバーでシステム運用する場合の課題として、アプリケーションが物理サーバーと密接に結びついていることによる運用のしづらさがあります。 例えば、想定以上のリソース負荷が発生した場合、物理的なハードウェアの更新や追加作業が必要になってしまいます。これはアプリケーションを物理サーバー上で運用しているおり、アプリケーションと物理サーバーが密接に結びついていることが原因となります。
この課題を解決するために出てきた技術が仮想マシン(仮想サーバー)です。
仮想マシンは1台の物理的なサーバー上に、 論理的に複数のサーバー環境を構築したものを言います。 ユーザーは論理的に1台のサーバーを独立したサーバーとして認識しますので、通常の物理サーバーと同じように扱われます。 仮想マシンは、それごとに個別のシステムやアプリケーションを稼働させることができます。
仮想マシンは、ハードウェアとOSとの間にハイパーバイザと呼ばれるハードウェアを仮想化するソフトウェアを挟みます。このハイパーバイザがハードウェアとOSを管理することで、物理的なサーバー上に複数のOSを同時に動作させることが可能になります。仮想マシン技術によって、各アプリケーションは仮想マシン単位でOS含めて隔離された環境を持つことが可能になります。
そのため、物理サーバーの運用で課題となっていた「アプリケーションが物理サーバーと密接に結びついていることによる運用のしづらさ」が、仮想マシンを利用することで解消することができます。各仮想マシンに対するハードウェア資源はハイパーバイザから変更することができるので、ある仮想マシンのリソースが足りなくなってきたら、余裕のある仮想マシンのリソースを減らし、必要な仮想マシンのリソースを増やすことが可能になります。
また、サーバーが急に必要になったとしても、今まではサーバー購入のための 稟議書を書いて、承認をもらって、調達して、納入して、設定して・・・ という作業が必要でしたが、仮想マシンであれば、使いたいときにすぐに仮想マシンを稼働させることが出来ます。ちょっと検証用のサーバーを1台立ち上げたいなんて時に非常に便利です。
しかし、物理サーバーから仮想マシンになっても、残念ながら解決されない課題があります。
仮想マシンを展開(デプロイ)するときに、その元となるイメージを準備して、そのイメージを実行環境に配置して起動させます。この時のイメージは数GBあり、ネットワーク経由でイメージを送信するのですが、この送信時間に時間がかかるため、結果的に仮想マシンのデプロイに時間がかかってしまうという課題があります。
また、仮想マシンを起動するための時間も必要になります。仮想マシンはOSとアプリケーションが含まれていますので、起動にはOSとミドルウェア、アプリケーションの全てを起動することになるため、起動までに数分程度の時間がかかります。この数分を長いとみるか短いとみるかは、システム運用方針にもよるかと思いますが、すぐに使いたいというニーズがある場合には、やはり課題となってしまうでしょう。 もちろん、イメージを保管しておくためにストレージの容量も必要になります。
仮想マシンをデプロイする際に、仮想マシン上でセットアップスクリプトを起動させて、本番環境や開発環境を構築するといったことを行いますが、環境の差異等によってスクリプトが動作せず、結果的にイメージオの再作成、再デプロイ、再起動といった作業が必要になることがあります。このように環境の差異を意識した運用を行わなければいけないという課題が、仮想マシンにはあります。
仮想マシンになっても、物理サーバーを準備しなければいけない課題は残ります。複数の仮想マシンを稼働させるために高性能な物理サーバを用意したり、障害に備えて物理サーバを冗長化させたりといったコストが発生してしまいます。
仮想マシンの課題であった、迅速なサービス立ち上げや物理サーバー管理からの解放というニーズを満たすために、クラウド技術が注目されました。システムを構築する際にクラウドを活用することで、必要なときに必要なリソースを柔軟に利用することができるようになりました。
しかし、仮想化技術からクラウドに進化しても、すべての課題が解決されたわけではありません。OSやミドルウェア、ライブラリなどを考慮しながら、ソフトウェアやアプリを開発、運用しなければならないという課題が残ってしまいます。
通常、ソフトウェア開発を行う場合、開発環境やテスト環境で開発/テストを実施した上で、開発したソフトウェアを本番環境に移行する手順を踏みます。そのため開発環境と本番環境にOSやミドルウェア、ライブラリ、DBなどは全て同じにしておく必要があります。
本番環境の運用開始後も、OSやミドルウェアの更新、アプリケーションの更新などを行う必要があり、事前にアップデートの影響をテストした上で、更新作業を実施していく必要があります。
このように、仮想化マシンやクラウドを利用したとしても、OSやミドルウェア、ライブラリなどを考慮しながら、ソフトウェアやアプリを開発、運用しなければならないという課題が残ってしまいます。こうした課題を解決する最適解として生まれてきたのが、コンテナ技術です。
コンテナ技術は、実行環境をホストOS上に論理的な区画を造り、他のプロセスから隔離し、その区画の中でアプリケーションを動作させる技術です。
コンテナ技術は一見すると仮想マシンと同じような技術と思われがちですが、コンテナは仮想マシンと比べてオーバーヘッドが少なく、軽量で高速に動作するのが特徴です。
コンテナ技術の詳細については別記事で解説していきます。