第3のサーバー環境「コンテナ」
【連載コラム:仮想化技術をしっかり解説します(3)】
仮想化技術「コンテナ」はどうしてWebアプリ開発に向いている?またコンテナの学習方法は??
前回は仮想化技術のうち、仮想マシンのためのソフトウェアの種類と特徴について解説しました。ホストOS型やハイパーバイザー型など、同じ仮想マシンでも実現方法が異なることについて理解できたでしょうか。
今回は、前回含めることができなかったコンテナについて解説します。物理マシン、仮想マシンに続くサーバー環境としてコンテナがあげられます。コンテナはWebアプリケーションなどを開発・実行する環境として現在利用が進みつつあります。コンテナも一種の仮想化技術ですが、主に仮想マシンとの違いという点で解説します。
目次
コンテナはWebアプリケーション開発に向いている
実行環境は単一OSカーネル
仮想マシンとコンテナの最も大きな違いは、OSカーネルを複数実行できるか否か、という点です。仮想マシンは各仮想マシンごとに別々のOSカーネルを実行できます。たとえば、同一の仮想ホスト上で、WindowsとLinuxを同時に実行できます。これに対して、コンテナは1つのOSカーネルしか実行できません。正確にいえば、単一のOSカーネル上で複数のコンテナが動作します。別の言い方をすると、仮想マシンはカーネル空間まで分離していますが、コンテナはアプリケーションが動作しているユーザー空間(あるいはプロセス空間)だけを分離しています。
似たアプリの複数実行に向いている
では、なぜコンテナが注目されるかというと、サーバーの主な目的はWebアプリケーションを実行することがほとんどすべてになっているからです。もちろん、Webアプリケーション以外のサーバー、サービスを動作させることもありますが、比率からいえば圧倒的にWebアプリケーションでしょう。Webアプリケーションの実行は、異なるのはアプリケーションの開発言語ぐらいで、基本的に似たような構成となっています。OSカーネルのバージョンなどに深く依存することもありません。このような場合、OSカーネルを別々に動作させるのはかえって効率が悪いということになります。
実行速度はそれなりに速い
コンテナは、基本的に通常のプロセスと同じ程度の速度で動作します。ただし、ストレージについては仮想マシン同様に性能が劣化するので、高速なデータベースなどストレージ性能が要求されるアプリケーションを実行するのには向いていません。このような場合、コンテナではWebアプリケーションを実行させ、データベースは物理マシンや仮想マシンで実行する構成にすることで性能の問題は回避できます。
コンテナとDevOpsは相性が良い
コンテナの特徴の一つとして、起動が速いことがあげられます。仮想マシンの場合、OSカーネルの起動からシステムに必要なプロセスの実行、そしてアプリケーションの実行と、システムの起動が完了するまでに様々な処理が必要ですが、コンテナの場合、OSカーネルとシステムプロセスの起動は終了しているので、アプリケーションの実行処理だけで済みます。この特徴を活かして、Webアプリケーションの開発からテスト、そして本番環境への展開(デプロイと呼ぶ)までを高速に行うことができます。これらのプロセスをCI/CD(Continuous Integration/Continuous Deploy)と呼び、開発から運用までを密接に連携させるDevOpsを実現するための重要な手法となっています。コンテナが注目される理由の一つがここにあります。
仮想マシンの上でコンテナを動作させる
コンテナは、単一のOSカーネル上でプロセスを仮想的に分離する技術です。そのため、たとえば仮想マシンの上でコンテナを動作させることもできます。仮想マシンの利便性と、コンテナの利便性を組み合わせた環境としてこのような構成を取る場合もあることは覚えておきましょう。
コンテナの実行環境
コンテナを実行するには、Linuxカーネルだけでなく、コンテナを実行するための環境が必要となります。ここではいくつか代表的なコンテナ実行環境を紹介します。
Docker
コンテナ実行環境の代表例として挙げられることが多いのがDockerです。基本的なコンテナ実行環境はDocker Engineと呼ばれます。また、Docker Desktopというパッケージが提供されており、各種OSにインストールすることで手軽にDockerが利用できます。
LXD
LXDは、LXCというLinuxカーネルのコンテナ機能を利用するためのライブラリをベースにしたコンテナ実行環境です。Dockerがアプリケーションを動作させるためのコンテナであるのに対して、LXDはより仮想マシンに近い動作をするコンテナです。
Kubernetes
Kubernetesは、より大規模なシステムのために沢山のコンテナを実行管理するための環境です。コンテナを複数動作させることを「オーケストレーション」と呼ぶため、Kubernetesは「コンテナオーケストレーションツール」とも呼ばれます。狭い意味でのコンテナ実行環境は切り離されており、交換可能であるため、KubernetesからDockerを呼び出してコンテナを実行させる、といったこともできます。
コンテナを学ぶには?
実際にコンテナを実行して学ぶにはどうしたら良いでしょうか。手っ取り早い方法としては、普段使用しているLinuxディストリビューションでDocker、あるいはLXDを動作させてみることです。もし、気軽に使えるLinux環境が無い場合には、Docker DesktopがLinuxだけでなく、Windows、macOSでも使えるので、手軽にDockerコンテナを実行することができます。
Kubernetesは、かなり大規模なシステム向けのツールなので、Dockerなどのコンテナ実行環境で基本的なコンテナの扱い方を覚えてから触れてみると良いでしょう。
- 筆者紹介
宮原 徹 氏
Linux標準教科書、Linuxサーバー構築標準教科書などの監修者。LinuCレベル1/レベル2 Version10.0の改訂作業にも協力。また、幅広いOSSに関する情報提供の場として「オープンソースカンファレンス(OSC)」の企画運営も。
バックナンバー
第10回:クラウド利用の留意点
第9回:オンプレミスのクラウド環境
第8回:たくさんあるぞ!クラウドサービス
第7回:クラウド〜仮想化技術の活用系〜
第3回:第3のサーバー環境「コンテナ」
第2回:仮想化の種類と特徴