🚀 ニフティ’s Notion

仮想化

仮想化の概要

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

仮想化の種類

  • 主に以下の3種類が上げられるが、さらにその中でも仮想マシンを立ち上げるホスト型・ハイパーバイザ型と、コンテナを立ち上げるコンテナ型の2種類に分類できる
    image block
  • コンテナとは
    • アプリケーションの起動に必要なアプリケーション本体・必要なライブラリ・設定ファイルなどをひとまとめにしたもの
    • 仮想マシンを立ち上げる場合とは異なり、ゲストOSを必要としない
ホスト型
image block
  • ホストOS上に仮想化ソフトウェアをインストールし、そのソフトウェア上で仮想マシンを稼動させる
    • 代表的なソフトウェアはVirtualBox、KVM、VMWare Fusion、Parallelsなど
  • ホストOS
    • 仮想マシンを構築する際の基盤となるOSのこと
  • ゲストOS
    • 仮想マシン環境にインストールして稼働するOSのこと
  • ホスト型のメリット
    • ソフトウェアをインストールするだけで手軽に導入できる
  • ホスト型のデメリット
    • ホストOSの動作にリソースを喰われるため、仮想マシンの動作速度が遅い
    • ホストOSを動作させるための物理リソース(メモリなど)が必要である
ハイパーバイザ型
image block
  • 物理サーバー上に仮想化ソフトウェアを直接インストールし、そのソフトウェア上で仮想マシンを稼動させる
    • 代表的なソフトウェアはXen、VMWare ESXi、Hyper-V など
  • ハイパーバイザー型のメリット
    • 動作速度がホスト型よりも早い
      • ホストOSのオーバーヘッドが無い
  • ハイパーバイザー型のデメリット
    • 導入に手間がかかる
      • 専用の物理サーバーで稼働させることが多い
コンテナ型
image block
  • Linuxカーネルの機能を利用し、プロセスごとに利用するファイルシステムやネットワークを独立させたり、利用するリソース(CPUやメモリなど)を制限したりする
    • 代表的なソフトウェアはDocker、LXC、OpenVZなど
    • Windowsにも一応似た機能はある
  • コンテナ型のメリット
    • 動作速度がハイパーバイザー型よりも早い
      • 仮想HWやゲストOSのオーバーヘッドが無い
      • 起動や停止も高速
    • リソースをより効率的に利用できる
      • ゲストOS稼働のためのリソースが不要
  • コンテナ型のデメリット
    • カーネルが異なるOSの起動ができない
      • Linux上でWindowsコンテナを動作させることができない
      • 逆も然りでWindows上で直接Linuxコンテナも動作させることができない
      • ディストリビューションは異なっていてもOK
    • セキュリティリスク
      • カーネルをホストOSと共有するため、ホスト型・ハイパーバイザー型と比べてホストからの独立度合いが低い
      • Docker やコンテナランタイムに脆弱性があると他のコンテナやホストOSに被害が及ぶケースもある
⚠️
カーネルとは

カーネルは、オペレーティングシステム(OS)の中心部分で、アプリケーションソフトウェアとハードウェアによるデータ処理の間を仲介する役割を果たします。システムリソースを管理し、ハードウェアとソフトウェアの間のインターフェースとして機能します。

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