仮想化の進化：VMとコンテナの違いをシンプルに解説！

## はじめに

- [前回の記事](https://qiita.com/shupeluter/items/351eb0872ae3e7a66b78)では、Immutable InfrastructureとIaC（Infrastructure as Code）の基本概念について解説しました。
   - 今回は、仮想化技術の中でも**ハードウェア仮想化**と**コンテナ仮想化**の違いを説明します。
- いつものように、わかりやすさを優先して記載します。厳密な時系列などは目をつむって、お楽しみください。

---

## 仮想化って何？

さて、そもそも仮想化とは何なのか？  
シンプルに言えば、**「1つの物理マシンを、あたかも複数の独立したコンピュータのように見せる技術」** です。  
なぜそんなことをするのか？理由は明白です。  

- **ハードウェアのリソースを無駄なく使いたい**  
- **システムの柔軟性を向上させたい**  
- **環境の再現性を高めたい**  

これを実現する方法として、大きく分けて **ハードウェア仮想化** と **コンテナ仮想化** の2種類があります。  
次のセクションでは、それぞれの違いを詳しく見ていきましょう。

### 仮想化の基本アイデア

仮想化の本質はシンプルです。  
**「アプリケーションが見ている世界を、どこかで誤魔化してしまおう」** という発想です。

たとえば、アプリケーションが「このマシンは1つのCPUと8GBのメモリを持っている」と思っているとします。  
でも、実際には、それは「仮想化ソフトウェア」が作り出した幻影かもしれません。  
裏では、1台の物理マシンのリソースが分割されていたり、逆に束ねられていたりするのです。

この「誤魔化し」をどの層でやるか？　です。

まず、一般的なコンピュータの基本構成を図示すると。

![ノイマン型コンピュータの基本構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837176/ae7c15f9-763d-4b27-ba43-c8d72dd35ac9.png)

こんな感じになります。このどこかのレイヤで横やりを入れて、アプリケーションをごまかすのが仮想化技術です。それぞれ見ていきましょう。

- **ハードウェア仮想化（VM）** 

OSのさらに下、ハードウェア層で誤魔化します。

![ノイマン型コンピュータの基本構成とハイパーバイザー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837176/164cd279-0c61-4f83-a116-f8e8cf05cc3f.png)

先ほどの図のハードウェアのレイヤをHypervisorが  仮想マシンとして代替を提供します。Operaing Systemより上位の層はその幻の上で動作します。

![Container-仮想化基盤.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837176/3a491c94-da9e-43fd-b3a7-44a1d4eb4da7.png)

こちらをご覧いただくとよりイメージがつきやすいのではないでしょうか。実際には1セットの物理レイヤに、仮想マシンを提供しOSより上位の層をごまかすわけです。もちろん実際の物理レイヤには3台の仮想マシンを動作させるだけのコンピューティングリソースが必要になります。

- **コンテナ仮想化(OS統合)** 
OSのレベルで誤魔化す方法です。コンテナエンジン（DockerやPodmanなど）が、アプリケーションの環境をカプセル化し、ホストOSのカーネルを共有[^share]しながら動作する。
[^share]:この説明には語弊があります。詳細は後述します。


![ノイマン型コンピュータの基本構成とコンテナエンジン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837176/c8f67432-de38-432a-a736-550f7900baeb.png)

コンテナ仮想化では、ホストOSのカーネルのプロセス分離機能を用いながら、アプリケーションを分離した環境で動かすのがポイントです。それぞれのコンテナは独立した環境に見えますが、実際には物理レイヤの仮想化は一切行っていません。仮想マシンの起動⇒OSの起動⇒ミドルウェアの起動⇒アプリケーションと各レイヤー個別に起動する必要はなく、ホストOS上のでプロセスを起動するだけでよいため、VMよりも軽量かつ高速に動作します

いずれも、アプリケーションが「普通に動いている」と思っているだけで、実際の動作環境は全然違うものになっています。

この「見せかけの世界」を作るのが仮想化のアイデアなのです。

Hypervisor型の仮想化とコンテナ仮想化の特徴をいかにまとめます。

### **VMとコンテナの違い**

| 項目 | **仮想マシン（VM）** | **コンテナ** |
|------|--------------------|------------|
| 仮想化レイヤ | ハードウェア層（Hypervisor） | OSレイヤ（コンテナエンジン） |
| OSの管理 | VMごとに独立したOS | ホストOSを共有 |
| 起動時間 | 数分（OSの起動が必要） | 数秒（軽量プロセス） |
| リソース効率 | 重い（OSごと動作） | 軽い（カーネル共有） |
| 分離性 | 高い（完全に独立） | 中程度（ホストOSに依存） |
| 適用例 | Windows/Linuxの混在環境、完全な独立性が必要な場合 | マイクロサービス、クラウドネイティブなアプリ |


## そもそも、仮想化ってなぜ必要になったのか？

考えてみてください。  
仮想化とは、**物理ハードウェアとアプリの間に抽象化レイヤーを挟み、より柔軟なシステム構築を可能にする技術** です。  
一見すると、**遅くなる・リソースを食う・管理が複雑になる** などのデメリットもありますが、実際には**ITインフラの進化によって不可欠な技術**となっています。  

**なぜ仮想化は今や当たり前になったのか？**  
それは、コンピュータの進化によって「圧倒的なリソース」を扱えるようになったからです。

---

### たった20年で、メモリが **1024倍** に？

例えば、1998年ごろ、私が初めて買ったWindows PCのメモリは **たったの64MB**。  
一方、今使っている自作PCのメモリは **64GB** です。  

**実に1024倍！** 当時のSolarisサーバー数台分のメモリが、今や **2万円弱** で手に入る時代になりました。  

さらに、ちょっとサーバー製品を調べると…  
**4TBのメモリ** を積めるマシンまである！  

今や、スマートフォンですら **8GB以上のメモリを搭載する時代** です。  

他のリソースに目をやると、CPUのコア数は当時1～2個が普通でしたが、今では**16コア以上のプロセッサが一般的**になり、
ストレージも**HDD→SSD(SATA)→SSD(NVMe)**へと進化し、速度は桁違いになっています。

総じて、コンピューティングリソースは**高速化し、コストが下がり、大容量化**しているのです。

---

### ここまでリソースが増えたら、どうする？

でも、ちょっと考えてみてください。  
**そんな大容量メモリ、本当に1台のサーバーで使い切れる？**  

不可能とは言いません。でも、普通のアプリケーションなら **そこまで要らない**。  
「じゃあ、もっと小さいメモリを作ってくれ！」と思いますよね？  

**しかし、一般的なエンタープライズ用途では、技術進化の波に乗って大容量リソースが主流となり、小容量のリソースは、エッジコンピューティングや組み込みシステムなど、特定の用途に限定されつつあります。**  
その結果、市場にはより大きく、より速いリソースが供給され続けます。

---

### そこで生まれたのが「仮想化」

こうなると、自然と出てくる欲求があります。

**「せっかく大量のリソースがあるんだから、1台のサーバーで複数のサーバーの役割を担わせたい」**

こうして生まれたのが仮想化技術です。  
もともと仮想化技術はメインフレームの時代から存在しましたが、クラウドの台頭とともに、**コスト削減と柔軟性の向上を目的として一般化**しました。  
もはや、選択肢ではなく「リソースを無駄にしないための必然」。  
仮想化は、余ったリソースを最大限活用するために登場し、今やITの常識となりました。

## **まとめ & 次回予告**

仮想化技術は、「物理リソースを効率的に使う」ための重要な技術であり、大きく **ハードウェア仮想化（VM）** と **コンテナ仮想化** の2種類に分かれます。  

- **VM（ハードウェア仮想化）** は、物理マシンの上に **Hypervisor** を挟み、独立したOSを持つ仮想マシンを動作させる方式。  
- **コンテナ仮想化** は、**ホストOSのカーネルを共有** しつつ、個々のアプリケーションを分離する方式。  
- **VMは分離性が高く、異なるOSを扱えるが重い。コンテナは軽量で高速だが、ホストOSに依存する面がある。**  

#### **なぜ仮想化は求められるのか？**
仮想化が必要とされる背景には、以下のようなニーズがあります。

- **物理リソースの有効活用**  
  かつてのサーバーは1台1アプリケーションが基本でしたが、リソースの余剰が多く、コストがかかりすぎる問題がありました。仮想化により、1台のサーバーで複数のワークロードを効率的に運用できます。

- **システムの柔軟性向上**  
  環境の分離が容易になり、テスト・本番環境の切り替えや、システムの拡張・縮小が迅速に行えます。

- **環境の再現性向上**  
  VMやコンテナを活用することで、環境をコードとして管理でき、**開発環境と本番環境の差異をなくす** ことが可能になります。

- **クラウド時代のワークロード適応**  
  クラウドサービスでは、仮想マシン（IaaS）やコンテナ（CaaS）が標準的なワークロードとなっており、仮想化なしでは運用が難しくなっています。

近年、クラウドネイティブな開発では **「軽量・高速なコンテナ仮想化」** が主流となり、**マイクロサービス** や **CI/CD** の環境に不可欠な技術となっています。  

---

### **次回は…Container仮想化 × IaC（Infrastructure as Code）を深掘り！**
ここまで仮想化の進化を見てきましたが、次回は **「コンテナ仮想化の実践的な活用」** を深掘りします。  

- **コンテナの仕組みをもう少し詳しく**（cgroups・namespaceなど）  
- **IaC（Infrastructure as Code）とコンテナの親和性**  
- **コンテナ×IaCの実践例（Terraform, Kubernetes, Docker Compose）**  

仮想化の「誤魔化しのレイヤー」を理解したうえで、**インフラをコードで制御するIaCの世界へ！**  
次回もお楽しみに！ 🚀