【🪙中級者向け】改めてDockerを深ぼる① ~ 仮想化の歴史について ~

## はじめに
こんにちは！ITスクールRareTECHにてCS（Customer Support）を担当している池村です。今回の記事はDockerの歴史についてです。

今回の記事からはDockerの中級編となります。
初学者の方はこちらの【初級編】を読み終わってからこちらの記事を読んで下さい。

https://qiita.com/ikemura-ren/items/b961642d55e4e6515203

:::note warn
何を持って『**中級**』なのか？と思う方もいるかもしれませんので、私なりの中級の入り口に立たれた方を以下のように明示しておきます。
- **なんとなくDockerのコマンドを叩けるようになってきている方々**
- **Dockerについてもっと詳しくなりたいと思い始めた方々**
:::


## 歴史を学ぶことは重要である
私は初めてDockerの記事を書いた時、初学者は歴史なんて知らなくて良いので、まずはコマンド叩いてみましょう。と書きました。でも、ここからは歴史を学ぶ必要が出てきます。

:::note info
歴史を理解すると、なぜこの技術ができたのか？解決した問題は何か？を知ることになります。これは、この技術がなぜあるのか？を自分の中で腹落ちさせるために必要な要素です。

ただ、深掘りすぎても***ただの雑学になる***ので塩梅が難しいところです。
:::


## 仮想化の歴史とは？
まず仮想化がなぜ必要になってきたのか？という話になると1960年代からのお話になります。
### 1960年代
この辺りは完璧なソースがあるわけではないので、1960年代といった曖昧な年代を指しています。IBMという巨大IT企業が仮想化技術を開発しましたが、1960年代ではまだ一般化されている状態ではなかったようです。もちろん、この時代のコンピューターは高額かつ巨大なハードウェアなので、1人が1台の時代ではありません。社内エンジニア・研究者向けに開発やテストの効率を上げる目的だったと考えられます。


#### CP-40
最初期の仮想化システム。System/360というメインフレーム（昔のコンピューター）上で動いていた。研究用のワンオフだったので、一般化されているわけではない。

![IBM_System_360_at_USDA.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/6b1eaa57-4e87-8999-1a7e-caaf99b109f2.jpeg)
[Wiki](https://en.wikipedia.org/wiki/IBM_System/360_Model_40)より引用しています（本物かどうかは謎）

#### CP-67
より実用的な仮想化環境を提供しているシステム。System/360上で動作。

:::note warn
System/360というコンピューターにもバージョン（モデル）があり、上記二つの仮想化システムが搭載されているのは同じSystem/360ですが、モデルが違っています。
:::

:::note info
どうでもいいですが、『ワンオフ』って言葉にはロマンを感じますね🤤
:::



### 1970年代
ここでIBMが出したSystem/370というコンピューターに仮想化の技術が取り入れられました。**VM/370（Virtual Machine/370）というシステム**ですね。もちろん改良がされていて、System/370のための仮想化技術です。

このSystem/370シリーズは、一般企業や研究者に広く普及し、安定して1台のコンピューターを複数ユーザーで利用できていたとされています。

![image01-IBM-Z-history.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/0a5a4ac2-3be4-f8eb-93f7-d1ec1de998ab.jpeg)
画像は[こちら](https://www.ibm.com/blogs/systems/jp-ja/mainframe55-for-future/)から引用しています

IBMの年表を見るに、やはり広く一般化された仮想化は1972年のSystem/370からのようですね。

#### （余談）小型化されたコンピューターは？
この時代のコンピューターはまだまだ大きなハードウェア。小型のコンピューターは作られていましたが、かなり高価で一般の人が手に入れることはできない時代だったようですね。

![IBM_5100_-_MfK_Bern.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/901af542-7f48-bcfc-b186-9c86bf58ed79.jpeg)
[Wiki](https://en.wikipedia.org/wiki/IBM_5100)より引用しています

:::note info
画像のIBM5100は某アニメのおかげで有名になったと思いますが、この頃のPCとなると手に入らないのは当たり前ですね。
:::



### 1980年代
仮想化技術にとって**冬の時代**です。
理由は以下です。
- **UNIXの誕生**
- **ミニコンピューター・パーソナルコンピューターの誕生**

一つずつ見ていきましょう。
#### UNIXの誕生
UNIXと呼ばれるOSが誕生しました。このUNIXは、まずマルチユーザーでの操作が可能ということ、プロセスの分離が以前より効果的になりました。OSによるマルチタスクが可能になったということですね。

:::note info
要は、今まで仮想化で分離した上に複数のアプリケーションを動作させてたわけですが、仮想化しなくても複数アプリが共存できるようになったということです。じゃあ**仮想化わざわざしなくても良いじゃん**となります。
:::


#### ミニ・パーソナルコンピューターの誕生
ハードウェアの進化によって、コンピューターが小型化していった時代。**一つのコンピューターに一つのOSが普通になっていきました**。ただでさえ複数ユーザーで使うために使っていた仮想化の意味がなくなってきます。大型のコンピューターのリソースを無駄にしないため、という理由もあったので、小型化してしまえば居場所はなくなってくるのは当然ですね。

### 1990年代
この時代になって再び仮想化が注目されます。
インターネットが爆発的に普及した時代ですので、サーバーを使う企業が多発し、Webサーバーだとかデータベースサーバーなどの需要が高まってきました。

日本ではWindows95などが爆発的に売れてた時ですね。

![topm.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/f9fc87d2-96a5-a503-d110-d0a14a19624d.jpeg)


この頃は基本的に、サーバー1台には一つのアプリケーションを運用するのが一般的だったようで、サーバーのリソースは余る一方だったと想像できます。

:::note info
要は非効率！仮想化技術があれば、サーバーのリソースの最適化、台数の軽減とか出来ちゃうのでは？となるのは当然ですね。
:::

#### VMWareが登場
VMWare社がハイパーバイザー型の仮想化技術を使って、巨大コンピューター以外の一般サーバーやPCでも仮想化技術を使えるようにしました。x86アーキテクチャ（PCやサーバーで使われるCPU）でも仮想化が使えるようになったことが大きな革新です。

:::note info
この技術が**当たり前**になっていることが凄いこと！
:::

このことにより、インフラの世界が大きく変わったと言えますね。
AWSやGCP、Azureなどのクラウドサービスも、この技術がなかったら成り立っているのかも怪しいです。

### 2000年代
この時代はクラウドサービスの急速な普及ですね。
仮想化技術はその中核となって存在しており、サーバーをたくさん持っている企業がそのリソースを貸す時代になってきます。1990年代はまだ学校や企業などにもサーバーがあったようですが（今もあるところは全然ある）、今はクラウドでサーバー構築する時代といっても過言ではないでしょう。

AWSがEC2のサービスを開始したのが2006年、従量課金制ということもあり、高額なサーバーを自社で抱えるよりも安価にサービスをデプロイできます。

:::note info
この時、仮想化技術はVMWareだけではなく、XenやKVMなどがありますが、そんなに知らなくて大丈夫です。
:::

### 2010年代
この時代に出てくるのがDockerをはじめとしたコンテナ型の仮想化技術です。
ハイパーバイザー型で問題になっていたのが以下になります。
- 仮想マシン内に完全なOSを入れているため、動作が重い
- スケーラビリティの限界
- 開発環境で動いていたアプリが本番で動かない

:::note warn
もっと軽量で、開発環境と本番環境で問題の発生しない技術が必要になった。
:::

#### LinuxのCgroupsとNamespaces
まずCgroupsとNamespacesというLinuxに搭載された技術があるのですが、これらがDockerの基盤になっています。この技術、かなり難しいのでざっくり解説します。

Cgroups：リソースを「**どれだけ使えるか**」制限する技術
Namespaces：プロセスを「**どこまで見えるか**」分離する技術

この二つがDockerの裏で使われています。

#### Dockerの誕生
今までのハイパーバイザー型はサーバー単位で仮想化をしてきましたが、Dockerはアプリケーション単位での仮想化です。開発環境と本番環境で、動作が変わる、動かないといった問題を解決しています。

かつ、仮想マシンより動作が軽量です。
オープンソースなのも良いところですね。

#### Kubernetesの登場
Kubernetesはコンテナのデプロイ、スケーリング、運用を自動化するためのプラットフォームです。Docker単体では難しかった大規模開発でのコンテナ管理や、スケールアウト、複数ホストの管理問題を解消してくれます。主要なクラウドサービスでもこの辺りは連携できるサービスがありますね。

:::note info
サーバー単位ではなく、アプリケーション単位での仮想化が必要になった時代！
:::


### 仮想化の歴史まとめ（年代別）
| 年代        | 主な出来事・技術                                      | 詳細                                                                 |
|-------------|------------------------------------------------------|----------------------------------------------------------------------|
| **1960年代** | IBM初期の仮想化技術                               | IBMがメインフレームで仮想化技術を開発。目的はハードウェア資源の効率的な分割と共有。|
| **1970年代** | メインフレーム上での仮想化の発展                    | IBMのVM/370が広く使用され、ユーザーごとに独立した仮想マシン環境を提供。メインフレームは企業や研究所のインフラに活用される。|
| **1980年代** | UNIXの普及と仮想化の停滞                            | コンピュータの小型化でサーバーが単一OSで動作する方向へ進み、仮想化技術は注目されなくなる。|
| **1990年代** | サーバー仮想化の再興                                | VMwareが設立（1998年）され、ハイパーバイザー型仮想化技術を開発。サーバーリソースの集約と効率化が注目され始める。|
| **2000年代** | 仮想化技術の爆発的普及                              | VMwareが企業で広く採用され、商用市場で支配的地位を築く。Xen（2003年）やKVM（2007年）が登場し、AWSがEC2（2006年）をリリース。|
| **2010年代** | コンテナ仮想化の台頭                                | LinuxのCgroupsとNamespacesによる軽量仮想化技術が発展し、Docker（2013年）やKubernetes（2014年）が普及。仮想化がアプリケーション単位へ進化。|


## バーチャルマシンとDockerコンテナの違いは？
さて、歴史だけだとあまり面白くない記事かもしれませんので、ここでVMとDockerの仮想化の違いについてざっくり見ていきたいと思います。

### ハイパーバイザー型の場合
VMの仮想化技術は仮想化された空間にもOSがあります。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/91901b8c-28d9-01be-5cad-4435955be1fd.png)

画像でいうところのゲストOSのことですね。ホストOSがある部分は我々が使うPC、もしくはサーバーかもしれません。ハイパーバイザーという部分が、ゲストOSから見るとハードウェアに見えているということになります。

### コンテナの場合
コンテナの場合、仮想化された空間にOSはありません。細かく言うとOSイメージはあります。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/24b8df65-3df2-fdbd-7b05-da7e6887cc0d.png)

コンテナはホストOSの機能で動いているので、ホストから見ると1プロセスでしかありません。VMよりも軽量で、作成されるのも止まるのも早く、消すのも簡単です。要は使いやすいです。

:::note info
Dockerの方が良いよね！といったことではなく、役割が違うのでどっちも必要な技術と言うことは押さえて欲しいです。
:::

## おわりに
今回は中級者向けと言うことで、とりあえずDockerコマンドを触った人向けに記事を書きました。歴史は大事ですね。（間違っているところがあるかもしれませんが、大枠知っていればOKなスタンス）

次はDockerのログ周りの記事に続く予定です。

## 余談
コーヒーは飲みすぎず、ほどほどに☕️