コンテナ技術を他の仮想化技術と比較しながら整理

コンテナ技術について調べた個人学習のアウトプット。
～コンテナを主軸として他の仮想化技術との比較を添えて～

この記事を書くにあたり、以下の書籍を主に学習させていただきました。

https://www.amazon.co.jp/%E5%9B%B3%E8%A7%A3%E5%8D%B3%E6%88%A6%E5%8A%9B-%E4%BB%AE%E6%83%B3%E5%8C%96-%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%8C%E3%81%93%E3%82%8C1%E5%86%8A%E3%81%A7%E3%81%97%E3%81%A3%E3%81%8B%E3%82%8A%E3%82%8F%E3%81%8B%E3%82%8B%E6%95%99%E7%A7%91%E6%9B%B8-%E4%BA%94%E5%8D%81%E5%B5%90-%E8%B2%B4%E4%B9%8B/dp/4297116901


# （ITの世界における）コンテナの概要
コンテナ型仮想化は、**「コンテナ」というアプリケーションと実行環境をまとめて隔離するしくみを利用し、OS単位ではなくアプリケーション単位で仮想化** する技術。
以下の仮想化技術の内の１つ

# 3種類の仮想化技術
### ホストOS型仮想化
～ホストOS上で複数のゲストOSが動作～
物理サーバーにOSがインストールされており、その上で仮想サーバーを動作させる技術

■ホストOS型仮想化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/16f9de59-1c16-d66e-ba4f-ab5b947cd007.png)

■代表的なホストOS型仮想化ソフトウェア（タイプ２ハイパーバイザー）
| 製品名 | 提供元 | プラットフォーム     | 概要 |
|:-- |:-:|:--:|:-:|
|  Hyper-V |  Microsoft |  Windows |  Win8以降のOSのProにプレインストールされている。ハイパーバイザー型にも同じ生の製品があるが、Windows Server製品でないものはホストOS型 |
| VMwere <br> Workstation  | VMwere |  Windows <br> Linux |  商用利用で無ければ無償で利用可能 |

- 物理サーバーにOSがインストールされており、その上で仮想サーバーを動作させる技術
- どのゲストOSが動作できるかはホストOSにインストールしたホストOS型仮想化ソフトの種類による

### ハイパーバイザー型仮想化
～ホストOSを必要としないサーバー仮想化～
物理サーバーにOSをインストールする必要がなく、
**ハイパーバイザーと呼ばれる仮想環境を管理するソフトウェア** をインストールする。

■ハイパーバイザー型仮想化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/5489d3ad-72b8-2622-753d-0029f2453ceb.png)

■代表的なハイパーバイザー型仮想化ソフトウェア（タイプ１ハイパーバイザー）
| 製品名 | 提供元 | 概要 |
|:-- |:-:|:-:|
|  Hyper-V |  Microsoft | Windows Server専用のソリューション。Windows ServerのEditionにより、仮想化できる環境の数に違いがある|
| ESXi(vSphere) | VMwere |  Editionごとに機能と値段の違いがあり、有償 |
| Xen | OSS |  OSSであり、販売目的で無ければ商用利用も可能 |

:::note info
AWSも初期の仮想基盤としてXenを使用（現在はKVMも併用）
Nitro Systemは厳密には「ハイパーバイザーそのもの」ではなく、AWSが独自に開発したハードウェアとソフトウェアの両方で仮想化を実現する仕組み
Nitro Hypervisorが、AWSのNitro Systemに含まれるハイパーバイザー
:::

- 物理サーバーにOSが不要であり、ハイパーバイザー型仮想化ソフトウェア上で仮想サーバーを動作させる技術
- ホストOSがなく、ゲストOSで直接制御するため実機のリソースを活用しやすい


### コンテナ型仮想化
～アプリケーションごとに独立した空間を構築～
**「コンテナ」というアプリケーションと実行環境をまとめて隔離する仕組みを利用し、OS単位ではなくアプリケーション単位で仮想化** する技術。
ゲストOSを使用せず、ホストOS上にコンテナ型仮想化ソフトウェアをインストールする。
- 最大のメリットは柔軟性
- 仮想サーバを増やす場合、ゲストOSとアプリケーションのインストールが必要
→ コンテナではコンテナを作成してアプリケーション導入するだけ
 → VMやゲストOSを動かす必要がない分、パフォーマンスも高くなる

 ■コンテナ型仮想化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/0a926171-ce47-ef5f-6f4f-e7d081b1d2f4.png)

:::note alert
コンテナには複数のアプリケーションを導入することも可能だが、原則的に「1コンテナ1アプリケーション（1プロセス）」単位で構築し、複数のコンテナを組み合わせたほうが良いとされる。
シンプルなコンテナを複数つくる方が手間がかからず、設計変更なども容易であるため。
:::

■コンテナの利用方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/29e8c852-2683-99a1-d482-994cba5a509e.png)


■コンテナ型仮想化ソフトウェアの代表～Docker～
コンテナ型仮想化といえば「Docker」が有名
Docker社が開発したOSSのコンテナ型仮想化ソフトウェアであり、アプリケーションを導入済みのコンテナイメージを集めたDocker Hubというサービスもある。

- 「コンテナ」という仕組みを利用し、OS単位ではなくアプリケーション単位で仮想化する技術
- 複数のコンテナを組み合わせて環境を構築することが可能
- コンテナ型仮想化の代表的なソフトウェアはDocker

# コンテナ技術の基礎知識
### コンテナ技術の歴史
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/bd0b0be2-2e43-dbdc-32a3-a210730a5a04.png)

- 1979年からコンテナ技術の成長期を経て、2013にDockerが登場
- OS型やハイパーバイザー型と比べて手軽にサーバー仮想化を実現可能に
- しかし利用頻度が高まり大量のコンテナを同時に使用するにつれ、コンテナの管理が煩雑になるという課題が浮き彫りに
- この課題を解消するソフトウェアとしてKubernetesが開発された
＝コンテナオーケストレーションツールの開発

### その他の仮想化技術の歴史
■ホストOS型仮想化
1990年代後半: ホスト型仮想化が普及し始めたのは、PCの性能が向上し、個人や小規模開発環境でも仮想化技術が使えるようになった頃

2000年代初頭: VMware Workstation（1999年リリース）が商用仮想化ソフトウェアとして先駆けとなり、多くの開発者が利用を開始された

現在: 手軽さが魅力で、主に個人や小規模環境でテストや開発用途に利用されていますが、大規模なプロダクション用途ではハイパーバイザー型やコンテナ型に移行するケースが増えている。

■ハイパーバイザー型仮想化
1960年代: 仮想化の概念のルーツは、IBMが大型コンピュータ（メインフレーム）で複数のOSを同時に動かすために開発したCP-40にさかのぼる

2000年代: サーバー統合のニーズが高まり、VMwareが商用ハイパーバイザー（VMware ESX、後のESXi）をリリース。企業がコスト削減や柔軟性向上のために導入を始めた。

現在: ハイパーバイザー型は、クラウドプロバイダー（例: AWSのEC2やAzureのVM）がバックエンドで使用する技術の基盤となっている。

当時の経験者の実体験ベースでは、広く普及し利用されるようになったのはいずれも2000年初期ともいわれる。

### まとめ：3種類の仮想化の進化の流れ
ホストOS型: 個人や小規模環境での利用を主軸に発展
ハイパーバイザー型: メインフレームから始まり、クラウド時代に進化
コンテナ型: アプリケーション単位の仮想化として、軽量かつ迅速な開発を支援

ホスト型OSは個人利用が主だが、ハイパーバイザー型とコンテナ型もそれぞれの目的で発達しているため
両者は競合する技術ではなく、共存する技術となっている。
（ただ、筆者はまだそれぞれの特性を活かした技術の選定まではみえていない）

https://aws.amazon.com/jp/compare/the-difference-between-containers-and-virtual-machines/

GPTに聞いてみた結果。
Q.ハイパーバイザー型仮想化とコンテナ仮想化は競合する技術ですか？

>（一部抜粋）
ハイパーバイザー型仮想化とコンテナ仮想化は、どちらも仮想化技術ですが、それぞれ異なる方法でリソースを仮想化し、異なるユースケースに適しています。これらの技術は必ずしも競合するものではなく、むしろ補完的に使用されることが多いです。

### コンテナ技術のメリット
- 仮想マシンやゲストOSが不要でコンテナを作成したらすぐにアプリケーションを導入して、仮想サーバを構築出来る
- Dockerでは、主要なアプリケーションやライブラリのコンテナイメージを集めたDocker Hubも提供している
→ 簡単なサーバならコマンドを１つ実行するだけで仮想サーバのコンテナを立ち上げることが可能
- ゲストOSを持たない＝コンテナ内のアプリケーションもホストOSのカーネルを利用して動いている
　→ しかし、ファイルシステムが独立しているため、ホストOS内の他のアプリケーションやファイルなどの影響を受けない

 ### データはコンテナに含めない
 可能な限りデータをコンテナに含めないのが基本
ホストOSやハイパーバイザー型では、アプリケーションが記録するデータは仮想サーバー内にある。
そのため、仮想サーバーがクラッシュするとデータも失われることがある。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/a4d091da-a950-b16e-5e55-330806193dee.png)

 ### サーバーレスとの比較
 - サーバーレスとは開発者が意識してサーバーを管理する必要が無くなること
 - サーバーレスでアプリケーション開発ができるクラウドサービスはFaaS（Function as a Service）に分類される
 - コンテナはLinuxやWindowsがあれば実行できるが、サーバーレスは主にクラウド上で実行される
 - コンテナはアプリケーション（プロセス）単位で構成
 - サーバーレスはFunction（機能）単位で構成
 - コンテナとサーバーレスの特徴を併せ持つサービス（AWS Fargateなど）も登場している

 ## コンテナ型仮想化ソフトウェアの代表「Docker」
### Dockerとは
コンテナの実行やコンテナイメージ（コンテナを実行するためのテンプレート）の作成・配布を行うためのプラットフォーム

■Dockerのコンセプト
- 柔軟性
プログラミング言語などが制約されない
- 疎結合
システムを独立したコンポーネントへ分解できる
- 軽量
効率的にリソースを活用する
- スケーラブル
受容に応じてリソースを増減できる
- ポータブル
異なる実行環境への移行が容易

### Dockerコンテナ
#### コンテナとは
- コンテナは、OS上で実行されるプロセス
  プロセス：プログラムの実行単位のこと「実行中のプログラム」ともいえる
- コンテナが通常のプロセスと異なる点は他のプロセスからかっくりされるように設定されていること
- コンテナ（名前空間による隔離） ≒ プロセス

#### ファイルシステムの隔離
ファイルシステムはOSの機能の１つである
通常のプロセスは他のプロセスとOSのファイルシステムを共有するが
コンテナではコンテナ専用の独立したファイルシステムを利用する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879433/fa319b99-26c7-58f2-4278-2d6f74c226d0.png)

#### コンテナと仮想マシンの違い
コンテナ：本質的にはプロセスと同じであり、名前空間などのしくみによって他のプロセスやコンテナと隔離される
仮想マシン：ハードウェアを模倣するソフトウェアであり、ゲストOSをインストールすることで他の仮想ましや物理マシンから隔離される

→コンテナはプロセスそのものなので、仮想マシンと比べて高速に動作する

#### コンテナ上にLinuxディストリビューションOSを載せることも可能
コンテナにUbuntuに含まれるソフトウェア一式を入れ、コンテナはホストマシンのOS（カーネル）を呼び出して動作することが可能

:::note info
ホストOSがLinuxであることが前提だが、DockerはLinuxカーネルを利用して、ホストシステム上で複数のアプリケーションを実行するための分離環境のため。Linuxコンテナは、Linuxをベースとした仕組みで、原則としてLinuxのみで動作する。
Windowsで動作させる場合には[Docker Desktop]などが必要

:::

#### AWSのコンテナサービス（ECS）の導入事例
QiitaもEC2からコンテナに切り替えたみたい
https://qiita.com/tomoasleep/items/e7f919c7b4d0f091d458