はじめに
仮想化技術とコンテナ技術について学ぶ機会を頂いたので、理解できたことを自分なりにまとめたいと思います。「Dockerって仮想化するやつでしょ?」程度の認識でなにもわからないままコンテナを操作していた状態から、少しでも前へ進むために学習を継続します。
仮想化技術
PCにおける仮想化技術とは、PC上に同じリソース(CPU,RAM)を利用した別のマシン(仮想マシン)をつくることです。PC本体をホストと呼び、仮想マシンはVMと呼びます。
仮想マシン(VM)
仮想マシンはホストとハードウェアは共有しますが、中身は完全に別物です。例えばWindowsPCに作成した仮想マシンでLinuxやMacを動かすこともできます。別のOSをインストールできるということになります。
仮想マシンはベアメタルハイパーバイザーとホスト型ハイパーバイザーに分けられます。
-
ホスト型ハイパーバイザー
ホストOSに仮想化ソフトウェアをインストールし、ホストOS上で仮想マシンを稼働させます。仮想マシンがハードウェアにアクセスする際にホストOSを経由するため、パフォーマンスが低下する場合があります(オーバーヘッドが発生する)。
環境構築がしやすく、Virtualboxなどを用いて個人の検証作業で使われます。 -
ベアメタルハイパーバイザー
ハイパーバイザーと呼ばれる仮想化ソフトウェアをハードウェア上に直接インストールし、そのOSの上で各仮想マシンを稼働させます。ホストOSは不要な設計です。これにy仮想マシンがハードウェアを直接制御できるのでオーバーヘッドが小さくなります(パフォーマンスが高い)。データセンターで利用される技術です。
別の物理サーバーに移行する際には、稼働中の仮想マシンを停止させることなく移行するライブマイグレーションと呼ばれる技術が使われます。
コンテナ技術
主にDockerで使われている仮想化技術の一種です(厳密には仮想化技術とは別の技術)。ホストPCのカーネル(Windows NTカーネルやLinuxカーネル)を共有したコンテナを作り、そこにOSをインストールします。カーネルを共有することでリソース(CPU・RAM)の消費が少なく済み、起動が速くオーバーヘッドが小さくなります。コンテナ上で実行されるアプリケーションはホストPCと分離されています(ユーザー空間が分離されている)。
一方、カーネルを共有しているためWindowsPC上にコンテナを作り、そのコンテナでMacを起動するといったことはできません。
DockerについてはLinuxがベースの技術となっており、Windowsで利用する場合はWSL2のインストールが必要となります。WSL2上でDockerが起動する形となるため、ホストPCとはLinuxカーネルを共有していることになります。
仮想化技術とコンテナ技術の違い
仮想化技術がOSそのものを分離しているのに対し、コンテナ技術はホストPCとOSのカーネルを共有しています。仮想化技術は相対的にオーバーヘッドが大きく起動に時間がかかる一方、OSが完全に分離しているため出来る事の幅が広くなります。コンテナ技術はオーバーヘッドが小さいため起動は速いですが、カーネルを共有しているため出来ることに制限があります。
※オーバーヘッドとは?
同じ結果を得るための工程が大きいか小さいかの違いのことです。例えば、みそ汁を作る時に出汁を取って作る場合はオーバーヘッドが大きい、出汁の素を使って作る場合はオーバーヘッドが小さいといえます。どちらが良い悪いというわけではなく、それぞれにメリット・デメリットがあると理解しました。
カーネルについて
カーネルとはコンピューターが動くために必要な最小限の機能のことです。カーネルはカーネル空間というもので、それとは別にユーザー空間というものがあります。
OSは動作の効率性・安全性を確保するためにこの二つの領域に分かれています。
-
カーネル空間
OSの中核部分(カーネル)が動作する領域で、メモリ管理、プロセス管理、ファイルシステム、ハードウェアの制御などの処理を行っています。高い権限を持っているため、エラーや悪意のある操作があると、システム全体に大きな影響を与えるリスクがあります。 -
ユーザー空間
一般的なアプリケーションプログラムが動作する領域です。カーネル空間の上に成り立っている空間で、カーネルからのシステムコールによってカーネル空間とやり取りを行います。ファイルを開く、ネットワーク通信を行う、メモリを割り当てるなどが該当します。
参考になったサイト