こんにちは。八谷です。
先日、社内研修でDockerで環境を構築する機会がありました。
ネットコムに入って業務でDockerを使っていましたが手順書通りの作業しかしていないのと、前職ではVMwareを使用していたため、Dockerを改めて勉強しながら違いを比較してみました。
はじめに
みなさんは開発の際にどんな仮想化ソフトウェアを使っていますか?
開発に使われる仮想化ソフトウェアはVMware、Hyper-V、VirtualBox、Docker...など様々なものがあります。
Q . VMwareってなに?
A . VMware社が提供する仮想マシン型仮想化のこと。
物理サーバ上に仮想ハードウェアを構築し、その上でオペレーティングシステム(OS)を動作させます。
Q . Dockerってなに?
A . Docker社が提供するコンテナ型仮想化のこと。
ホストOSのカーネルを共有し、コンテナ毎に必要なライブラリや依存関係を入れることで、独立の実行環境を構築できます。
VMwareは仮想マシン型仮想化、Dockerはコンテナ型仮想化と分類されるので、 今回は仮想マシン型仮想化とコンテナ型仮想化を比較していきたいと思います。
Q . パフォーマンスはどっちがいい?
A . コンテナ型仮想化のほうが速い。
コンテナは軽量で、ホストOSのカーネルを共有するため、リソースの消費が少なく、高速に起動・終了します。
一方、仮想マシン型仮想化はそれぞれの環境でOSを持ち、コンテナよりもメモリやディスク容量を多く消費するため、起動に時間がかかります。
Q . セキュリティ面はどうなの?
コンテナ型仮想化はカーネルを共有するため、カーネルレベルでの脆弱性が悪用されると、コンテナ間での隔離に影響が出る場合があります。
仮想マシン型仮想化は完全に独立したOSを持つため、仮想マシン間での隔離はコンテナよりも強力で、1つの仮想マシンが破損しても他の仮想マシンに影響を与えることは少ないです。
しかし、OSのメンテナンスの観点では、コンテナ型仮想化はホストOSの管理だけで済みますが、仮想マシン型仮想化はそれぞれのOSの管理が必要になります。
用途やプロジェクトの方針によって使い分けるのがよさそうです。
Q . サポートするOSは?
仮想マシン型仮想化は様々なOS(Linux、Windows、その他)をホストOSとしてサポートし、各仮想マシンに異なるOSをインストールして実行できます。
一方、コンテナ型仮想化のコンテナはLinuxのカーネル上で動かすのが前提です。WindowsやMacではDocker Desktop をインストールする必要があります。(内部でLinux VMが起動される)
まとめ
特徴 | コンテナ型仮想化 | 仮想マシン仮想化 |
---|---|---|
パフォーマンス | 高い(軽量で高速) | 低い(メモリやディスク使用量が多く低速) |
セキュリティ隔離 | カーネルの脆弱性による | 完全な隔離が可能 |
サポートOS | 主にLinux(WindowsやmacOSでも可能) | Linux、Windows、その他 |
自分だったらどう使う?
コンテナ型仮想化は、特にマイクロサービスのアプリケーション開発に向いているなと感じました。
複数のサービスが組み合わさったアプリケーションの場合、それぞれのサービスで変更やバージョンアップを一気に行うと不具合が起きる可能性があります。 Dockerを使ってコンテナ毎に変更を行えば、うまくいかなかった場合に原因のあるサービスを特定しやすく、環境をクリーンな状態を保つことができ、安全に開発ができます。
一方、仮想マシン型仮想化は、異なるOSを動作させたい場合などで使用したいと感じました。
例えば、様々なOSを使用してテストをしたい場合、 起動に時間はかかりますが、それぞれの仮想環境をVMwareなどで作成しテストしたほうがより本番環境に近い状態で検証できます。
他にも、レガシーシステムを仮想化したり、オンプレを仮想化する際にも利用できるようです。
用途に応じてうまく使い分けていきたいです。