🚀 ニフティ’s Notion

仮想化

仮想化の概要

  • 1台の物理マシン上に複数の仮想的なマシンを稼働させる技術
  • 仮想化のメリット
    • リソースを効率的に利用でき、コスト削減につながる
    • サーバーの情報をファイルとして管理できる
    • ハードウェアへの依存を無くすことができる

仮想化の種類

主に以下VM型と、コンテナを立ち上げるコンテナ型の2種類に分類できる

仮想マシン(VM)型

  • ホストOS
    • 仮想マシンを構築する際の基盤となるOSのこと
  • ゲストOS
    • 仮想マシン環境にインストールして稼働するOSのこと
動作

VM型は、一台の物理ハードウェア上で複数の仮想化マシンを動かす技術です。各仮想マシンは、自分自身が独立したコンピュータであるかのように動作します。

これは、ハードウェアをエミュレートする「ハイパーバイザ」により実現されます。

ハイパーバイザは、ホストマシンのリソース(CPU、メモリ、ストレージなど)をゲストマシンに割り当て、各ゲストマシンが互いに干渉することなく独立して動作するように制御します。
各ゲストマシンは、それぞれのOSを持ち、アプリケーション、ライブラリ、必要な依存関係などを含む完全なシステムスタックを実行します。

代表的なソフトウェア
  • VirtualBox
    • インストールしたPC上で仮想マシンを作成し、別OSを実行できるソフト
    • PCに接続したUSB機器をそのまま仮想マシン内でも使用できる
    • Oracle社製

image block
  • VMWare
    • 正確には「VMware vSphere」
    • ハイパーバイザー型の仮想化製品
    • 複数の仮想マシンをvCenter Serverで一括管理できるか
    • VMware社製
image block
ホスト型のメリット
  • ソフトウェアをインストールするだけで手軽に導入できる
ホスト型のデメリット
  • 仮想マシンの動作速度が遅い
  • ゲストOSを動作させるための物理リソースが必要である
コンテナ型

コンテナとは
  • アプリケーションの起動に必要なアプリケーション本体・必要なライブラリ・設定ファイルなどをひとまとめにしたもの
  • 仮想マシンを立ち上げる場合とは異なり、ゲストOSを必要としない
動作

コンテナ型は、アプリケーションを軽量な「コンテナ」にパッケージングし、一台のマシン上で複数のコンテナを分離して実行します。

コンテナはアプリケーションとその依存関係を一緒にパッケージングします。

各コンテナは、ホストマシンのOSカーネルを共有しますが、それ以外のシステムリソース(CPU、メモリ、ネットワーク、ストレージなど)は互いに隔離されています。
このため、コンテナは独立した実行環境を提供しながら、VM型よりもはるかに少ないリソース消費で、素早く起動し、パフォーマンスのオーバーヘッドも小さくなります。

代表的なソフトウェア
  • Docker
    • コンテナソフトウェアのデファクトスタンダード
    • docker image を作成し、作成したimageを実行して仮想環境を作る
    • dockerのイメージ置き場としてdocker hub が提供されている
    • 大手クラウドベンダーからもdockerのイメージ置き場(レジストリ)として各種サービスが提供されている
image block
  • LXC
    • Linux環境で実行される
    • Linuxカーネルホスト上で、複数の隔離されたLinuxシステムを動作させる
    • 性質上、dockerに比べてイメージサイズが大きくなりがち
    • かなり低レイヤの部分まで仮想環境から操作できる
image block

コンテナ型のメリット
  • 動作速度がVM型よりも早い
    • 仮想HWやゲストOSのオーバーヘッドが無い
    • 起動や停止も高速
  • リソースをより効率的に利用できる
    • ゲストOS稼働のためのリソースが不要
コンテナ型のデメリット
  • カーネルが異なるOSの起動ができない
    • Linux上でWindowsコンテナを動作させることができない
    • 逆も然りでWindows上で直接Linuxコンテナも動作させることができない
    • ただし、現在はWindowsでもWSL2を使うことで、Linuxコンテナを動作することが可能なのでそこまで気にすることはない
ローカル開発環境

  • 簡単かつ高速に開発環境が構築できる
    • Dockerなら docker compose up で即時に環境を整えられる
  • コンテナ内に依存関係を含めることができる
    • ミドルウェアやライブラリのバージョンの差異で動かない、なんてこともなくなる
  • 構築手順がコード化される
    • DockerならDockerFileを見れば構築手順が分かる
    • さらにDockerFileを配布すれば、他の人も同じ環境をすぐに立ち上げられる
    • gitで変更履歴を管理できる
本番環境

  • リリースサイクルを高速化できる
    • 簡単に環境を作ったり壊したりできるのでCI/CDと相性がよい