物理マシンから仮想マシンとコンテナへ
物理マシンをそのまま使う構成から始め、仮想マシンとコンテナが登場した理由をたどります。
このレッスンのメニュー
手元のパソコンも、データセンターに置かれたサーバーも、CPU、メモリ、ディスクなどの実物を持つコンピューターです。 この実物のコンピューターを物理マシンと呼びます。 仮想化の仕組みを使わず、物理マシンへ直接OSを入れて使う構成はベアメタルとも呼ばれます。
仮想マシンとコンテナは、この物理マシンをどのように使い分けるかを考える中で登場しました。
まず、物理マシンをそのまま使う
物理マシンへLinuxなどのOSを入れ、その上でアプリを動かすのが最も基本的な構成です。 OSが物理マシンのCPU、メモリ、ディスク、ネットワーク機器を直接管理します。
この構成は仕組みが少なく、物理マシンの性能や専用の機器をそのまま使えます。 一つのシステムがマシン全体を必要とする場合には、今も物理マシンが選ばれます。
複数のシステムを運用すると、次のような場面が出てきます。
- システムごとに異なるOSや設定を使いたい
- あるシステムの変更や再起動が、同じOS上の別のシステムへ影響するのを避けたい
- 1台分のCPUやメモリを使い切らないシステムを、別々の物理マシンへ置くと未使用の資源が増える
- 新しい環境が必要になるたびに、機器の調達やOSのインストールを待つことになる
物理マシンを増やす方法でも解決できますが、台数が増えるほど購入、設置、配線、故障対応の対象も増えます。
物理マシンを分けるハイパーバイザー
1台の物理マシンを複数のコンピューターとして使うには、実物の機器と、それを使うコンピューターの対応を管理する仕組みが必要です。 この仕事をするソフトウェアをハイパーバイザーと呼びます。
たとえば、利用者が「CPUを2個、メモリを4GB、ディスクを20GB持つコンピューターを作る」と設定します。 ハイパーバイザーは、その設定に合わせて仮想的なCPU、メモリ、ディスク、ネットワーク機器を用意します。 そのコンピューターのOSには、これらが自分の機器として見えます。
OSが仮想的なディスクを読み書きすると、ハイパーバイザーがその処理を物理マシンのディスク上のデータへ対応付けます。 メモリやネットワーク機器についても、同じように仮想的な機器と実物の資源の間を取り持ちます。 ハイパーバイザーは、作ったコンピューターの起動と停止や、互いに使うメモリを分ける処理も担当します。
データセンターでは、ハイパーバイザーを物理マシン上で直接動かす構成がよく使われます。 手元のパソコンでは、普段使っているWindows、macOS、Linux上のアプリとしてハイパーバイザーを動かすこともできます。 置かれる場所は違っても、仮想的な機器を用意して実物の資源へ対応付ける役割は共通しています。
ハイパーバイザー上に仮想マシンを作る
ハイパーバイザーがソフトウェアで作ったコンピューターを仮想マシン(VM)と呼びます。
仮想マシンには、それぞれOSをインストールします。 片方の仮想マシンを再起動しても、同じ物理マシンにある別の仮想マシンは動き続けられます。 システムごとに異なるOSや設定を持たせることもできます。
新しい仮想マシンは、機器を追加せずにソフトウェアから作成、削除、作り直しができます。 クラウドで画面やAPIから「新しいコンピューター」を用意できるのは、主にこの仕組みを使っているためです。
仮想マシンごとにOSを動かすため、そのOSが使うメモリやディスクも必要です。 物理マシン自体が故障すれば、その上で動く仮想マシンもまとめて停止します。
OSを共有してアプリを分ける
仮想マシンより小さな単位でアプリを分けたい場合には、コンテナを使えます。 コンテナでは、同じOSの中心部分を共有しながら、アプリのプロセスから見える範囲と使えるCPUやメモリを分けます。
OSの中心で、CPU、メモリ、ディスクなどを管理する部分をカーネルと呼びます。 仮想マシンはそれぞれ自分のカーネルを持ちます。 同じ物理マシンまたは仮想マシン上で動くコンテナは、一つのLinuxカーネルを共有します。
| 比べるもの | 物理マシン | 仮想マシン | コンテナ |
|---|---|---|---|
| OSとカーネル | 物理マシンに一つ入れる | 仮想マシンごとに持つ | 動かす場所のLinuxカーネルを共有する |
| 起動するもの | OSとアプリ | 仮想マシンごとにOSとアプリ | 主にアプリのプロセス |
| どこまで分けるか | ハードウェアを含めて一台を専有する | OSまで仮想マシンごとに分ける | 一つのOS上でプロセスや使用量を分ける |
| 用意する方法 | 機器を設置し、OSを入れる | ソフトウェアから仮想マシンを作り、OSを入れる | イメージからコンテナを起動する |
| 選ばれる場面 | マシン全体の性能や専用機器を使いたい | 異なるOSや設定を同じ物理マシン上で動かしたい | アプリを小さく配布し、短時間で起動したい |
物理マシン、仮想マシン、コンテナには、それぞれ使いやすい場面があります。 実際のクラウドでは、物理マシンの上に仮想マシンを作り、その仮想マシンの中で複数のコンテナを動かす構成もよく使われます。
Linuxがコンテナを分ける仕組み
Linuxは、次の機能を使ってコンテナごとにプロセスを分けます。
- namespace(名前空間):プロセスID、ファイル、ネットワーク機器など、プロセスから見える範囲を分ける
- cgroup(コントロールグループ):複数のプロセスをまとめ、CPUやメモリの使用量を記録したり制限したりする
Dockerなどのコンテナを扱うソフトウェアは、Linuxカーネルへこれらの設定を依頼します。 設定を受け取ったカーネルが、コンテナとして動かすプロセスへnamespaceとcgroupを適用します。
イメージから仮想マシンやコンテナを起動する
仮想マシンのイメージとコンテナイメージは、どちらも起動前のひな型です。 イメージから仮想マシンやコンテナを起動すると、実際に処理をする環境ができます。
設定を変えた環境を手作業で複製するより、ひな型を更新して新しい環境を起動するほうが同じ状態を再現しやすくなります。 この性質が、壊れた環境を修理し続ける代わりに、ひな型から作り直す運用につながります。
このレッスンは完了
このページで扱った流れを確認したら、次の内容へ進みます。