目次
コンテナとは?
コンテナとは、OSレベルでの仮想化技術です。
これだけで理解する事はかなり困難です。こちらを理解する為にはアプリケーションの仕組みと仮想化(Virtualization)を理解する必要があります。
※コンテナ技術を深く理解する為には事前知識(仮想化やその歴史)を知る必要があります。要点を次項で記載するので、要点のみざっくりとを知りたい方はそちらを参照下さい。
コンテナ要点
- コンテナ=OSレベルの仮想化技術。アプリケーションと必要なライブラリ・ミドルウェアのみをパッケージ化する事が可能で、以下のメリットが享受できる。
- コンピューティングリソースの最適化:同一のOS上で複数のコンテナを起動させる事が可能なため、コンピューティングリソースの削減が可能。
- 起動の高速化:OSの起動を待つ必要が無い為、起動が高速。
- 実行環境に依存しない:アプリケーションに必要なライブラリやミドルウェアがパッケージ化されているためどんな環境でも実行可能。
- 仮想化(Virtualization)と比較し軽量:仮想化(Virtualization)の場合、アプリケーション・ミドルウェア・OSを纏めてパッケージ化するのに対し、コンテナではアプリケーションとミドルウェア・ライブラリのみでパッケージするため、軽量で起動が速い。
アプリケーションが動作する仕組み
アプリケーションを動作させるために必要なものは複数存在します。アプリケーションが動作するための構成要素は大まかにこの図の様になります。
以下が上図の構成要素とその役割です。
- ハードウェア:コンピューターの実態です。PCの本体などが該当します。
- OS:コンピューターの基本的動作を担当します。コンピューターに事前にインストールされている事が多いです。
- ミドルウェア:アプリケーション実行における専門的な処理を実行できるようにするためのソフトウェアです。アプリケーションに関連する処理を実行できるようにする為にインストールする必要があります。
- ライブラリ:アプリケーションが利用する外部からの部品です。アプリケーションに応じたパーツを利用する為にインストールします。
- アプリケーション:動作させるアプリケーション本体です。
図で示されている様にハードウェアが全ての土台となっています。
ハードウェア(物理的な機器)にソフトウェア(OS、ミドルウェア、ライブラリ)をインストールする事で最終的にアプリケーションを配置した際にアプリケーションが実際に動作できるようになります。
従来は、上図の様に1つのマシンで1つのアプリケーションが実行される構造でアプリケーションが動作していました。
しかし、容量が大きくないアプリケーション単体を1つのマシンで動作させる場合、空いている容量が無駄になってしまいます。
そのような考えから、1つのマシンで複数のコンピューター(及びアプリケーション)を動作させる技術である仮想化が登場しました。
仮想化(Virtualization)
仮想化は1つの物理的なマシン(コンピューターの実態)で複数のコンピューターを動かす技術です。
OSにハイパーバイザーという仮想化する為のソフトウェアをインストールする事で、その上に複数のOS・ミドルウェア・ライブラリ・アプリのセットを配置する事が可能となります。
この様に仮想化技術によって複数のコンピューターを1つのマシン(ハードウェア)で実行する事が可能となりました。
コンテナ
仮想化技術が主流の中、コンテナ技術は2013年にDockerというオープンソースのプラットフォームが登場した事で一気に人気が急上昇しました。
コンテナ技術では、コンテナエンジンをインストールするのみで、アプリケーションとその実行に必要なライブラリとミドルウェアのみでパッケージ化する事が可能となりました。(仮想化技術ではOSを含めてパッケージ化しています。)
このパッケージを利用する事でどのような環境でも同じようにアプリケーションを動作させる事が可能となりました。
では、コンテナ技術の発展によってどのようなメリットが生まれたのでしょうか。
コンテナのメリット
OSと切り離し、アプリケーション実行に必要なものだけをパッケージ化できるようになった為、以下の様なメリットが享受できるようになりました。
- 起動の高速化:OSの起動を待つ必要が無い為、起動が高速。
- 実行環境に依存しない:アプリケーションに必要なライブラリやミドルウェアがパッケージ化されているためどんな環境でも実行可能。
- 仮想化(Virtualization)と比較し軽量:仮想化(Virtualization)の場合、アプリケーション、ミドルウェア、OSを纏めてパッケージ化するのに対し、コンテナではアプリケーションとミドルウェア、ライブラリのみでパッケージするため、軽量で起動が速い。
- コンピューティングリソースの最適化:同一のOS上で複数のコンテナを起動させる事が可能なため、コンピューティングリソースの削減が可能。
メリットの2つ目に記載されている様にDockerは実行環境に依存しません。
実行環境に依存しないのが何故良いかというと、実行環境に依存するバグが高頻度で発生するからです。
例えば、Windowsを利用して開発したアプリケーションをMacを利用する開発者がMac上でアプリケーションを実行しようとしても実行できない可能性があります。何故なら、WindowsはWindowsOSを利用しているのに対し、MacはLinuxをOSに利用しており、その差異がアプリケーションのバグを引き起こす可能性があるのです。
別の例を挙げると、開発者AがJavaのバージョン18を自分のPCにインストールしてアプリケーションを開発したとして、そのアプリケーションを開発者BがJavaのバージョン11で実行すると当然バグが発生する可能性があります。
この様なOSの差異やソフトウェアの違いによるバグは起こりやすく、且つかなり厄介なのです。
コンテナ技術を利用すれば、アプリケーションを実行するのに必要なもの(ライブラリやソフトウェアなど)が全てパッケージ化されている為、環境起因のエラーが発生しません。コンテナが作成されたらそれを共有するのみで、どんな環境でも実行できるのです。
では、どのようにコンテナを共有するのでしょうか。
こちらを理解するにはコンテナとコンテナイメージについて理解する必要があります。
コンテナとコンテナイメージ
コンテナ技術にはコンテナとコンテナイメージという概念があります。
下図の様にコンテナイメージはコンテナを作成する為の設計図で、コンテナはパッケージ化されて実行されているアプリケーションのようになります。
コンテナ技術のデファクトスタンダード
現在デファクトスタンダードとして利用されているコンテナ技術はDockerというものです。
こちらを利用する事でコンテナをスムーズに構築する事が可能です。
次はDockerの利用方法、コンテナの作成方法について見ていきましょう。