📠

イラストで仮想化とコンテナ技術のさわりを理解する

2024/05/05に公開

はじめに

今日の WEB 開発現場において、VM やコンテナなどの仮想化技術を使わずに開発を行うことは無いのではないでしょうか。
私自身も普段開発を行う際に、何気なく Docker を使って開発環境を立ち上げたり、EC2 で立ち上げたサーバーにログインして作業を行なっていましたが、これらの背後にある仮想化技術や、コンテナ技術について詳細や原理を十分に理解せずに使っていました。
この記事では仮想化技術について基本的な概念をまとめ、理解を深めることを目的にしています。

この記事でまとめること

  • サーバー仮想化技術の概要
  • 仮想化技術のメリット・デメリット

この記事でまとめないこと

  • 仮想化ソフトウェアの使い方
  • ネットワーク仮想化

仮想化とは

仮想化とは一言で表現すると「物理マシン上に複数の仮想マシンを構築すること」です。
通常 PC では1台に1つの OS がインストールされ、その上にさまざまなソフトウェアをインストールして動作させています。
対して、仮想化技術を使うことによって1台の物理マシン上に、異なる OS がインストールされたマシンを動作させることが可能になります。

仮想化のイメージ
仮想化のイメージ

仮想化のメリット

ではサーバーの仮想化を行うことで何が嬉しいのでしょうか?
ここでは仮想化のメリットについてまとめます。

リソースの効率化

物理マシンのリソースが豊富な場合、普通に稼働しているだけだと多くのリソースを余らせてしまうことがあるかもしれません。
物理マシン上に複数の仮想マシンを稼働させることで、リソース(CPU やメモリ)を効率的に稼働させることができるようになります

柔軟性

サーバーを仮想化することによって、サーバーを増強する際に新しいハードウェアを準備する必要がなくなります。
必要に応じてスケールアウト(サーバーの台数を増やす)したり、逆にスケールイン(サーバーの台数を減らす)を行うことが可能です。
またサーバーそのものを増強するスケールアップも容易に行うことができます。

可用性

可用性とはどれだけシステムが故障せずに継続して稼働できるかの能力を表す指標です。
サーバーの仮想化を行うことによって、仮想環境ごとバックアップしておくことが可能になります。
もし仮想環境が故障しても復元を容易に行うことができます。

仮想化のデメリット

仮想化には多くのメリットがありますが、いくつかのデメリットも存在します。

パフォーマンスの低下

物理マシン直上で動作するシステムに比べて、仮想マシンはホストマシンのリソースを共有するため、パフォーマンスが低下することがあります。
特に、リソースが過剰に仮想化されている場合や、高負荷のアプリケーションを実行する際には、その影響が顕著になることがあります。

管理の複雑さ

仮想化環境は管理が複雑になることがあります。仮想マシンの数が増えると、それに伴う監視、メンテナンス、セキュリティの更新、パフォーマンスの最適化など、管理するべき項目が増えます。また物理環境とは異なるトラブルシューティングやスキルが求められることもあります。

物理マシンへの依存

全ての仮想マシンが一つの物理マシンに依存しているため、その物理マシンに障害が発生すると、影響を受ける仮想マシンの数が多くなります。
このような場合、障害の影響が広範囲に及び、システム全体のダウンタイムが発生するリスクが高まります。

仮想化の種類

一言に仮想化と言っても、仮想化するための方式は大きく分けて三つの種類があります。
ここではそれぞれの方式の基本的な仕組みを解説します。

ホスト OS 型仮想化

ホスト OS 型仮想化は、物理サーバーに OS をインストールした上で仮想サーバーを構築する方式です。物理サーバー上にインストールした OS にホスト OS 型仮想化ソフトウェアをインストールして仮想サーバーを起動します。
手軽に仮想環境を構築することができるため、検証環境を準備する際に便利です。

ホストOS型仮想化のイメージ

ハイパーバイザー型仮想化

ホスト OS 型がホスト OS を必要とするのに対して、ハイパーバイザ型仮想化ははホスト OS が不要となります。
物理マシン上に OS が必要ないため、OS のライセンスが不要であったり、ホスト OS を稼働させるリソースが不要になるというメリットがあります。

ハイパーバイザー型仮想化のイメージ

参考:AWS の EC2 はハイパーバイザー型仮想化の技術を使って提供されています。
https://pages.awscloud.com/rs/112-TZM-766/images/20221013_EC2_0_OPENING_AWS.pdf

コンテナ型仮想化

コンテナ型仮想化は OS 単位ではなく、アプリケーション単位で仮想化する技術です。
1コンテナで複数のアプリケーションを起動することも可能ですが、1コンテナ1アプリケーションで複数のコンテナを立ち上げて利用するのが一般的です。
ホスト OS 型やハイパーバイザー型と大きく異なる点は、コンテナ自体への OS のインストールが不要な点です。
コンテナはホスト OS(ホスト OS のカーネル)を利用して動作するため、CPU やメモリの利用を最小限に抑えることができます。
リソースの使用量が少ないことから起動・停止を高速に行うことができ、多くのコンテナを同時に稼働させることも容易になります。

コンテナ型仮想化のイメージ

疑問

コンテナに関して調べている中で一点疑問をいだきました。
コンテナ技術はホスト OS のカーネルを共有して動作しているのに、どうして Windows や MacOS で Linux のコンテナを起動することができるのでしょうか。
この疑問に関しては、すでに同様の解説をされている方がいらっしゃったので記事のリンクを貼らせていただきます。

https://zenn.dev/koya_tech/articles/9ba0df8ca3e4d0

噛み砕いて説明すると、コンテナを起動するために LinuxOS の仮想マシンが起動して、その上にコンテナが起動しているようです。

最後まで読んでいただきありがとうございます。

参考文献

Discussion