仮想化の概要
- 1台の物理マシン上に複数の仮想的なマシンを稼働させる技術
- 仮想化のメリット
- リソースを効率的に利用でき、コスト削減につながる
- サーバーの情報をファイルとして管理できる
- ハードウェアへの依存を無くすことができる
仮想化の種類
- 主に上の3種類が挙げられるが、さらにその中でも仮想マシンを立ち上げるホスト型・ハイパーバイザ型と、コンテナを立ち上げるコンテナ型の2種類に分類できる
- コンテナとは
- アプリケーションの起動に必要なアプリケーション本体・必要なライブラリ・設定ファイルなどをひとまとめにしたもの
- 仮想マシンを立ち上げる場合とは異なり、ゲストOSを必要としない
ホスト型
- ホストOS上に仮想化ソフトウェアをインストールし、そのソフトウェア上で仮想マシンを稼動させる
- ホストOS
- 仮想マシンを構築する際の基盤となるOSのこと
- ゲストOS
- 仮想マシン環境にインストールして稼働するOSのこと
- ホストOS
- 代表的なソフトウェアはVirtualBox、KVM、VMWare Fusion、Parallelsなど
- ホスト型のメリット
- ソフトウェアをインストールするだけで手軽に導入できる
- ホスト型のデメリット
- ホストOSの動作にリソースを喰われるため、仮想マシンの動作速度が遅い
- ホストOSを動作させるための物理リソース(メモリなど)が必要である
ハイパーバイザ型
- 物理サーバー上に仮想化ソフトウェアを直接インストールし、そのソフトウェア上で仮想マシンを稼動させる
- 代表的なソフトウェアはXen、VMWare ESXi、Hyper-V など
- ハイパーバイザー型のメリット
- 動作速度がホスト型よりも早い
- ホストOSのオーバーヘッドが無い
- 動作速度がホスト型よりも早い
- ハイパーバイザー型のデメリット
- 導入に手間がかかる
- 専用の物理サーバーで稼働させることが多い
- 導入に手間がかかる
⚠️
オーバーヘッドとは
コンピュータで何らかの処理を行う際に必要となる付加的、間接的な処理や手続きのことです。あるいは、そのために機器やシステムへかかる負荷、余分に費やされる処理時間などのことを指す場合もあります。
コンテナ型
- Linuxカーネルの機能を利用し、プロセスごとに利用するファイルシステムやネットワークを独立させたり、利用するリソース(CPUやメモリなど)を制限したりする
- 代表的なソフトウェアはDocker、LXC、OpenVZなど
- Windowsにも一応似た機能はある
⚠️
カーネルとは
カーネルは、オペレーティングシステム(OS)の中心部分で、アプリケーションソフトウェアとハードウェアによるデータ処理の間を仲介する役割を果たします。システムリソースを管理し、ハードウェアとソフトウェアの間のインターフェースとして機能します。
- コンテナ型のメリット
- 動作速度がハイパーバイザー型よりも早い
- 仮想HWやゲストOSのオーバーヘッドが無い
- 起動や停止も高速
- リソースをより効率的に利用できる
- ゲストOS稼働のためのリソースが不要
- 動作速度がハイパーバイザー型よりも早い
- コンテナ型のデメリット
- カーネルが異なるOSの起動ができない
- Linux上でWindowsコンテナを動作させることができない
- 逆も然りでWindows上で直接Linuxコンテナも動作させることができない
- ディストリビューションは異なっていてもOK
- セキュリティリスク
- カーネルをホストOSと共有するため、ホスト型・ハイパーバイザー型と比べてホストからの独立度合いが低い
- Docker やコンテナランタイムに脆弱性があると他のコンテナやホストOSに被害が及ぶケースもある
- カーネルが異なるOSの起動ができない
ローカル開発環境
- 簡単かつ高速に開発環境が構築できる
- Dockerなら
docker compose upで即時に環境を整えられる
- Dockerなら
- コンテナ内に依存関係を含めることができる
- ミドルウェアやライブラリのバージョンの差異で動かない、などということもなくなる
- 構築手順がコード化される
- DockerならDockerfileを見れば構築手順が分かる
- さらにDockerfileを配布すれば、他の人も同じ環境をすぐに立ち上げられる
- gitで変更履歴を管理できる
本番環境
- リリースサイクルを高速化できる
- 簡単に環境を作ったり壊したりできるのでCI/CDと相性がよい
- コードのビルド、テスト、デプロイを自動で行うこと
- 簡単に環境を作ったり壊したりできるのでCI/CDと相性がよい
⚠️
CI/CDとは
「CI」とは「Continuous Integration(継続的インテグレーション)」の略で、コードに変更が加えられるたびに、自動でビルドやテストを行う手法です。
「CD」とは「Continuous Delivery(継続的デリバリー)」の略で、CIでテストをパスしたソフトウェアを、本番環境にリリースできる状態に自動で準備する手法です。