はじめに
-
前回の記事では、Immutable InfrastructureとIaC(Infrastructure as Code)の基本概念について解説しました。
- 今回は、仮想化技術の中でもハードウェア仮想化とコンテナ仮想化の違いを説明します。
- いつものように、わかりやすさを優先して記載します。厳密な時系列などは目をつむって、お楽しみください。
仮想化って何?
さて、そもそも仮想化とは何なのか?
シンプルに言えば、「1つの物理マシンを、あたかも複数の独立したコンピュータのように見せる技術」 です。
なぜそんなことをするのか?理由は明白です。
- ハードウェアのリソースを無駄なく使いたい
- システムの柔軟性を向上させたい
- 環境の再現性を高めたい
これを実現する方法として、大きく分けて ハードウェア仮想化 と コンテナ仮想化 の2種類があります。
次のセクションでは、それぞれの違いを詳しく見ていきましょう。
仮想化の基本アイデア
仮想化の本質はシンプルです。
「アプリケーションが見ている世界を、どこかで誤魔化してしまおう」 という発想です。
たとえば、アプリケーションが「このマシンは1つのCPUと8GBのメモリを持っている」と思っているとします。
でも、実際には、それは「仮想化ソフトウェア」が作り出した幻影かもしれません。
裏では、1台の物理マシンのリソースが分割されていたり、逆に束ねられていたりするのです。
この「誤魔化し」をどの層でやるか? です。
まず、一般的なコンピュータの基本構成を図示すると。
こんな感じになります。このどこかのレイヤで横やりを入れて、アプリケーションをごまかすのが仮想化技術です。それぞれ見ていきましょう。
- ハードウェア仮想化(VM)
OSのさらに下、ハードウェア層で誤魔化します。
先ほどの図のハードウェアのレイヤをHypervisorが 仮想マシンとして代替を提供します。Operaing Systemより上位の層はその幻の上で動作します。
こちらをご覧いただくとよりイメージがつきやすいのではないでしょうか。実際には1セットの物理レイヤに、仮想マシンを提供しOSより上位の層をごまかすわけです。もちろん実際の物理レイヤには3台の仮想マシンを動作させるだけのコンピューティングリソースが必要になります。
-
コンテナ仮想化(OS統合)
OSのレベルで誤魔化す方法です。コンテナエンジン(DockerやPodmanなど)が、アプリケーションの環境をカプセル化し、ホストOSのカーネルを共有1しながら動作する。
コンテナ仮想化では、ホスト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の世界へ!
次回もお楽しみに! 🚀