前回、コンテナとは仮想化技術の1つであり、サーバ仮想化とは異なるレイヤーを仮想化する技術であると説明した。仮想化するレイヤーが異なることによって、コンテナにはサーバ仮想化と異なる特徴が見られる。そこで今回は、コンテナの肝となる3つの特徴について説明する。

3つのコンテナの特徴

サーバ型仮想化とコンテナ型仮想化を比較すると、コンテナの特徴は以下にまとめられる。

速い!!

誰しもがPCの起動に時間がかかる経験をしているだろう。この起動時間のほとんどは、OSの起動プロセスに要している。

仮想マシン(以下、VM)の場合も同様であり、起動時にはOSの起動が行われる。一方で、コンテナはこれとは異なり、コンテナが稼働するホストとOSを共有しているため、OSの起動プロセスが不要である。このためコンテナの起動および停止は非常に迅速である。

小さい!!

VMの場合、内部でOSを起動する必要があるため、OSをインストールしておく必要がある。どのOSを使用するかにもよるが、一般的にOSを動作させるために必要なファイル群のサイズは大きなもので数GB程度になる。

一方で、コンテナの場合はOSをホストと共有しているため、アプリケーションの動作に必要な最低限のライブラリ群のみインストールしておけばよい。さらに、アプリケーションを動かすために必要なCPUやメモリなどのリソース使用量も少なくて済む。結果として、コンテナは小さく作られることが望まれ、数十から数百MBと非常に軽量なものが一般的である。

儚い……

コンテナは通常のVMと同様の使い方をすることも可能である。しかし、上述した速さと軽さを生かして、必要になった時にだけ作成し、不要になったら削除するというリソース利用効率を最適化する使い方が一般的である。つまり、コンテナは気軽に削除と作成が繰り返される儚い存在なのである。

この特徴をデメリットに感じる方もいるかもしれないが、近年注目されているImmutable Infrastructureと呼ばれる考え方では、この特徴を大いに生かすことができると考えられ、昨今のコンテナの流行に拍車をかける大きな要因となっている。

Column - Immutable Infrastructureとは?

Immutable Infrastructureという言葉を聞いたことがあるだろうか。コンテナの特徴とは直接関係ないが、コンテナの考え方を理解するために大事な概念がImmutable Infrastructure(不変なインフラ)である。

従来のシステムでは、運用を停止するまで一度構築したシステムを壊すことは基本的になく、日々構築済みのシステムへ変更を加えながら運用していくことが一般的であった。しかしこのような運用をしていくと、当初の設計からシステムの状態は徐々に乖離していく。

現在のシステムの状態を把握するには、実機を確認することは1つの方法であるが、大規模なシステムになるほどその作業は非常に煩雑になる。したがって、そのようなシステムの現状態把握には設計書等のドキュメントを残しておき、それらを参照することが一般的である。

しかし、大規模なシステムではドキュメント量も膨大であり、この方法では状態変更時のドキュメントへの反映漏れが往々にして起こりうる。このため、システムの現状態とドキュメントの内容を常に一致させておくことが困難であり、些細な変更を加える際にも不正確かつ膨大なドキュメントを参照しつつ、念入りな確認や準備作業を行わなければならない。ゆえに大きなコストがかかってしまうという問題が多くの運用者の悩みであった。そこで近年注目されている概念がImmutable Infrastructureである。

Immutable Infrastructureとは、Immutable(不変)という言葉が表すように、一度構築したインフラには変更を加えないという考え方である。ただし、最初に構築したインフラをシステムの運用が停止するまで使い続けなければならないということではない。

では、変更を加えたい場合どうするのかというと、既存のインフラを破棄して新しいインフラを構築し直すのである。最新の設計通りに構築されたインフラは当然最新の設計と一致するため、現在の状態を把握することは容易になる。また、新規に作り直すため、既存の状態に気を遣いながら変更を行う必要がなくなる。これにより、迅速で安定したシステム開発を行うことができるようになると言われている。

ただし、変更のたびに最初から構築するとはいっても、データベースなどの中身や運用のログまで毎回消してしまうわけにはいかない。これらは再構築時に切り離し可能な場所へ保存しておく必要があるだろう。つまり、インフラを明確に「データを持たない(ステートレス)部分」と「データを持つ(ステートフル)部分」に分け、ステートレスな領域のみを毎回構築し直す対象とするのである。

これを行っておくと、再構築で問題が起きてもデータには影響が及ばないため安心して元に戻すことができるようになり、変更を恐れない迅速なシステム開発を行えるようになる。

ところで、変更のたびにステートレス部分を最初から構築することなど、現実的ではないと思われるかもしれない。しかし、コンテナが迅速に起動すること、コンテナは軽量でありすぐに新しいシステムに展開可能であることから、コンテナを利用すれば仮想マシンより容易にImmutable Infrastructureを実現できそうだということが想像できるのではないだろうか。

もちろん、「コンテナを使う=Immutable Infrastructure」というほど単純ではないが、コンテナを利用する際はImmutable Infrastructureを意識することがコンテナの特徴を生かす使い方につながるだろう。

おわりに 今回はコンテナの特徴を述べ、コラムとしてコンテナと共に語られることが多いImmutable Infrastructureについて紹介した。では、これらコンテナの特徴を活用することで具体的にシステムにどのようなメリットをもたらすことができるのであろうか。 次回は「開発者」「運用者」というシステムに携わる人の役割の観点からコンテナのメリットについて述べていく。

著者プロフィール

小針千春


2015年TIS入社。

インフラ構築案件やInfrastructure as Code(IaC)推進を目的としたSHIFT wareの開発に従事。 現在はコンテナを使いシステム運用自律化や効率化の仕組み開発を行う。