# コンテナとは?
サーバ仮想化の一つの方法として、**「コンテナ」**をよく聞くことが多くなってきました。みなさまの周りでもVMs(Virtual Machines)かコンテナのどちらを採用するかなど、調査や議論をすることがあるのではないでしょうか。
でも、「コンテナ」とは何なのでしょうか?なぜ「コンテナ」と呼ぶのでしょうか?仮想化技術のコンテナを学ぶ前にコンテナの歴史をたどって、コンテナの優れているところを学んでみましょう。
## コンテナの歴史
「コンテナ」と聞いてはじめに頭に思い浮かぶのは、何ですか。おそらく輸送用のコンテナが頭に浮かんできたのではないでしょうか。
仮想化のコンテナも、この輸送用コンテナと同じ発想なので、コンテナと呼ばれています。
それでは、はじめに輸送用コンテナの歴史をたどって、コンテナの必要性と便りなところを見ていきましょう。
### 人や動物たちが運んでいた時代
物を運ぶ古い方法は、人が担いだり、動物で運ぶ方法でした。また、運ぶ荷物や人、場所によって、荷物をまとめる入れ物や運ぶ手段は、ばらばらでした。
- 地点Aでバッグに荷物を詰め込む
- 地点Aから地点Bへはバッグを持って人が歩いて運ぶ。
- 地点Bでバッグから木箱へ荷物を移し替える。
- 地点Bから地点Cへは木箱を積んだロバが運ぶ。
地点Aから地点Bを経由して地点Cへ運ぶとき、それぞれの地点A、B、Cで荷物の積みなおしを行っていました。荷物の積みなおしは重労働で、時間のかかる作業でした。
### 車輪の発明
人や動物が荷物を運んでいた時代は、物を持ち上げで運ぶ必要がありました。物を持ち上げ続けて運ぶには、大きな力が必要になります。このため、重い荷物を遠くに運ぶことは、大きな労力と時間が必要でした。
ここで人類の偉大な発明のうちの一つと言わている「車輪」が発明されます。車輪を転がすことで、非常に小さな力で重い荷物を遠くに運ぶことができるようになりました。
### 積み替えの問題
車輪の発明で重い荷物を遠くまで運べるようになりました。しかし荷物を積みかえるときの問題は依然として残っていました。
- 地点Aで籠に荷物を詰め込む。
- 地点Aから地点Bへは籠を積んだトラックで運ぶ。
- 地点Bで籠から木箱へ荷物を移し替える。
- 地点Bから地点Cへは木箱を積んだ汽車で運ぶ。
荷物の積み替えは複雑で気の遠くなる作業でした。また荷物を積み替えるときに、荷物の紛失や損失が起きる危険もありました。
- 積み替えるときに荷物に直接さわれるので、作業員による盗難(荷抜き)にあう危険があった。
- 荷物を入れ替えるときに、荷物に傷をつけたり壊したりする危険があった。
このような荷物を積み替えるときの問題は、長らく荷物を運ぶ人たちの悩みでした。
### コンテナの発明と標準化
時代は進み、荷物を積み替えるときの問題を解決する画期的な方法が発明されます。それが**「コンテナ」**です。コンテナは輸送産業に革命をもたらした発明でした。
コンテナは、縦、横、高さの大きさが世界標準の統一企画となっています。コンテナの大きさが世界で統一されているため、トレーラーで運んだコンテナをそのもまま輸送船へ積むことができるようになりました。以前のバスケットから木箱への詰め替えのような作業がなくなました。また、コンテナの大きさが標準化されているので、コンテナ標準に対応している輸送会社であれば、どのコンテナでも運べるようになりました。コンテナの発明により、荷物の積み替えの重労働から解放されただけでなく、輸送の効率も上がったのです。さらに、荷物の積み替え作業がなくなったことにより、コンテナの中身が何であるかは、作業者は知りません。また積み替えのためにコンテナを開けることもありあません。コンテナは、荷物を積み替えるときの盗難の危険もなくしたのです。
コンテナの**大きさが標準化**され、コンテナを運べる運送企業ならば**どの企業でも運べる**ということが、非常に重要です。仮想化のコンテナでも、**標準化**され、**どこでも動作できる**ということから、「コンテナ」と呼ばれているのです。
## 仮想化とコンテナの歴史
輸送用のコンテナの歴史を振り返り、輸送用コンテナの便利さがわかりましたでしょうか。仮想化のコンテナも輸送用のコンテナと同じで、標準化とどこでも利用できる(運べる)ことが使う理由の一つとなります。しかし、コンテナとコンテナ以外の仮想化では何がちがうのでしょうか。ここでは、仮想化とコンテナの歴史を振り返り、コンテナの便利さを確認していきましょう。
### 物理サーバの時代
仮想化が発明される前は、1つの物理サーバーで、いろいろなアプリケーションを動かしている時代でした。
アプリケーションの開発者は、アプリケーションのリリースをライブラリ管理者やオペレーション管理者に依頼して、本番環境にリリースしてもらっていました。ライブラリ管理者やオペレーション管理者は、依頼されたリリースが他のアプリケーションのリリースやOSのモジュールと競合しないかなどを確認して、本番環境へのリリースを行っていました。
さまざまなアプリケーションが同じサーバ上で動いていたため、アプリケーションのリリースやモジュールの競合により、ほかのアプリケーションの動作に影響を与えてしまうことが多くありました。また、あるアプリケーションの暴走によるサーバのCPUやメモリの枯渇により、他のアプリケーションも動作できなくなることもありました。
このようなアプリケーションやモジュールの競合や暴走によりほかのアプリケーションに影響をあたえない方法として、仮想化が採用されるようになりました。
### 仮想マシン(Virtual Machines)の時代
アプリケーションやモジュールの競合問題を解決するために採用されるようになったのが、仮想マシン(Virtual Machines)です。仮想マシンは、1台のサーバ上に複数の仮想的なサーバ(ゲストマシン)を構築する技術です。
仮想マシンにより、ほかのアプリケーションやライブラリからの分離が可能になりました。これによりアプリケーション間やモジュールの依存関係を気にすることなく、開発や運用を行うことが可能になりました。
仮想マシンの利用によりアプリケーションの独立性を保つことができ、アプリケーションの開発や運用をおこなう上での問題はなさそうです。仮想マシンでも開発や運用上の問題が解消されましたが、なぜ、コンテナが必要となり話題となっているのでしょうか?
### コンテナの時代
コンテナは、アプリケーションのコードと依存関係をイメージにパッケージ化し、どこでも動作できるようにしたものです。
アプリケーションのコードと依存関係のあるライブラリだけパッケージ化されているので、以下のよう特徴があります。
- パッケージ化したイメージサイズが小さい
- 起動が速い
- 本番環境だけでなく、ステージング、ローカル開発PCなどどこでも同じ環境で動作できる
- 1コンテナにつき1プロセスが基本思想で、消費するサーバリソースも少ない
これに対し、仮想マシンはサーバ(ハードウェア)を仮想的に分割する技術のため、仮想マシン上に完全に動作できるOSをインストールする必要があります。ハードウェアの分割やOSのインストールにより、仮想マシンはCPUやメモリなどの多くのハードウェアリソースを必要とし、仮想マシンの起動にも時間がかかります。とても小さな荷物(プロセス)を運ぶのにも巨大なタンカー(ハードウェアとOS)が必要になり、無駄も多くなります。
従来のウォータフォール型開発でまとまった機能を特定の時期にリリースする開発、運用手法であれば、仮想マシンの運用でも問題はありませんでした。しかし。近年のビジネスでは高速リリース、高速スケールができないと、あっという間に競合他社に追い抜けれ、追いつけなくなってしまいます。このような高速リリース、高速スケールの要件と、高速起動や可搬性の高いコンテナをは相性がよいのです。
## コンテナの採用に向けて
仮想化におけるコンテナも輸送用のコンテナと同じで、標準化しどこでも気軽に動けるようになっていることが最大の特徴であり、便利なところです。しかし、コンテナは1コンテナにつき1プロセスが基本思想であり、マイクロサービス化やコンテナの管理が複雑になってしまう場合もあります。ビジネスの要件として高速リリース、高速スケール、可搬性などのコンテナのメリットを利用する必要があるか、十分な検討をしたうえで、コンテナの採用を見極めていく必要があります。