🍑あわもり教室🫧 クラウドの「手前」を、ちゃんとやる。 はじめる
SET 0015分

物理マシンから仮想マシンとコンテナへ

物理マシンをそのまま使う構成から始め、仮想マシンとコンテナが登場した理由をたどります。

このレッスンのメニュー

手元のパソコンも、データセンターに置かれたサーバーも、CPU、メモリ、ディスクなどの実物を持つコンピューターです。 この実物のコンピューターを物理マシンと呼びます。 仮想化の仕組みを使わず、物理マシンへ直接OSを入れて使う構成はベアメタルとも呼ばれます。

仮想マシンとコンテナは、この物理マシンをどのように使い分けるかを考える中で登場しました。

まず、物理マシンをそのまま使う

物理マシンへLinuxなどのOSを入れ、その上でアプリを動かすのが最も基本的な構成です。 OSが物理マシンのCPU、メモリ、ディスク、ネットワーク機器を直接管理します。

一台の物理マシンの中にCPU、メモリ、ディスクなどの機器があり、その機器を一つのOSが管理し、OS上で複数のアプリが動く構造
物理マシンをそのまま使う場合は、一つのOSが実物の機器を管理し、そのOS上でアプリが動きます。

この構成は仕組みが少なく、物理マシンの性能や専用の機器をそのまま使えます。 一つのシステムがマシン全体を必要とする場合には、今も物理マシンが選ばれます。

複数のシステムを運用すると、次のような場面が出てきます。

  • システムごとに異なるOSや設定を使いたい
  • あるシステムの変更や再起動が、同じOS上の別のシステムへ影響するのを避けたい
  • 1台分のCPUやメモリを使い切らないシステムを、別々の物理マシンへ置くと未使用の資源が増える
  • 新しい環境が必要になるたびに、機器の調達やOSのインストールを待つことになる

物理マシンを増やす方法でも解決できますが、台数が増えるほど購入、設置、配線、故障対応の対象も増えます。

物理マシンを分けるハイパーバイザー

1台の物理マシンを複数のコンピューターとして使うには、実物の機器と、それを使うコンピューターの対応を管理する仕組みが必要です。 この仕事をするソフトウェアをハイパーバイザーと呼びます。

たとえば、利用者が「CPUを2個、メモリを4GB、ディスクを20GB持つコンピューターを作る」と設定します。 ハイパーバイザーは、その設定に合わせて仮想的なCPU、メモリ、ディスク、ネットワーク機器を用意します。 そのコンピューターのOSには、これらが自分の機器として見えます。

OSが仮想的なディスクを読み書きすると、ハイパーバイザーがその処理を物理マシンのディスク上のデータへ対応付けます。 メモリやネットワーク機器についても、同じように仮想的な機器と実物の資源の間を取り持ちます。 ハイパーバイザーは、作ったコンピューターの起動と停止や、互いに使うメモリを分ける処理も担当します。

CPU、メモリ、ディスクの指定を受けたハイパーバイザーが仮想的な機器を用意し、仮想マシンのOSと物理マシンの機器の間を取り持つ流れ
仮想マシンのOSは仮想的な機器を使い、ハイパーバイザーがその処理を物理マシンの機器へ対応付けます。

データセンターでは、ハイパーバイザーを物理マシン上で直接動かす構成がよく使われます。 手元のパソコンでは、普段使っているWindows、macOS、Linux上のアプリとしてハイパーバイザーを動かすこともできます。 置かれる場所は違っても、仮想的な機器を用意して実物の資源へ対応付ける役割は共通しています。

ハイパーバイザー上に仮想マシンを作る

ハイパーバイザーがソフトウェアで作ったコンピューターを仮想マシン(VM)と呼びます。

仮想マシンには、それぞれOSをインストールします。 片方の仮想マシンを再起動しても、同じ物理マシンにある別の仮想マシンは動き続けられます。 システムごとに異なるOSや設定を持たせることもできます。

新しい仮想マシンは、機器を追加せずにソフトウェアから作成、削除、作り直しができます。 クラウドで画面やAPIから「新しいコンピューター」を用意できるのは、主にこの仕組みを使っているためです。

仮想マシンごとにOSを動かすため、そのOSが使うメモリやディスクも必要です。 物理マシン自体が故障すれば、その上で動く仮想マシンもまとめて停止します。

OSを共有してアプリを分ける

仮想マシンより小さな単位でアプリを分けたい場合には、コンテナを使えます。 コンテナでは、同じOSの中心部分を共有しながら、アプリのプロセスから見える範囲と使えるCPUやメモリを分けます。

OSの中心で、CPU、メモリ、ディスクなどを管理する部分をカーネルと呼びます。 仮想マシンはそれぞれ自分のカーネルを持ちます。 同じ物理マシンまたは仮想マシン上で動くコンテナは、一つのLinuxカーネルを共有します。

物理マシン、仮想マシン、コンテナの層構造。物理マシンは一つのOS上でアプリを動かし、仮想マシンはそれぞれOSを持ち、コンテナは一つのLinuxカーネルを共有する
物理マシンをそのまま使う構成から、OSごと分ける仮想マシン、アプリのプロセスを分けるコンテナへ進みます。
比べるもの物理マシン仮想マシンコンテナ
OSとカーネル物理マシンに一つ入れる仮想マシンごとに持つ動かす場所のLinuxカーネルを共有する
起動するものOSとアプリ仮想マシンごとにOSとアプリ主にアプリのプロセス
どこまで分けるかハードウェアを含めて一台を専有するOSまで仮想マシンごとに分ける一つのOS上でプロセスや使用量を分ける
用意する方法機器を設置し、OSを入れるソフトウェアから仮想マシンを作り、OSを入れるイメージからコンテナを起動する
選ばれる場面マシン全体の性能や専用機器を使いたい異なるOSや設定を同じ物理マシン上で動かしたいアプリを小さく配布し、短時間で起動したい

物理マシン、仮想マシン、コンテナには、それぞれ使いやすい場面があります。 実際のクラウドでは、物理マシンの上に仮想マシンを作り、その仮想マシンの中で複数のコンテナを動かす構成もよく使われます。

Linuxがコンテナを分ける仕組み

Linuxは、次の機能を使ってコンテナごとにプロセスを分けます。

  • namespace(名前空間):プロセスID、ファイル、ネットワーク機器など、プロセスから見える範囲を分ける
  • cgroup(コントロールグループ):複数のプロセスをまとめ、CPUやメモリの使用量を記録したり制限したりする

Dockerなどのコンテナを扱うソフトウェアは、Linuxカーネルへこれらの設定を依頼します。 設定を受け取ったカーネルが、コンテナとして動かすプロセスへnamespaceとcgroupを適用します。

イメージから仮想マシンやコンテナを起動する

仮想マシンのイメージとコンテナイメージは、どちらも起動前のひな型です。 イメージから仮想マシンやコンテナを起動すると、実際に処理をする環境ができます。

設定を変えた環境を手作業で複製するより、ひな型を更新して新しい環境を起動するほうが同じ状態を再現しやすくなります。 この性質が、壊れた環境を修理し続ける代わりに、ひな型から作り直す運用につながります。

このレッスンは完了

このページで扱った流れを確認したら、次の内容へ進みます。