コンテナ化技術と仮想化技術は、アプリケーションと基盤の間を分離するための技術です。両者はリソースの利用効率の向上やアプリケーションのデプロイと管理の簡素化などの利点を持っています。主な違いは、仮想化技術がハードウェアレベルで仮想化を行い、コンテナ化技術がオペレーティングシステムレベルで仮想化を行うことです。仮想化技術は仮想マシン(VM)を作成することで仮想化を実現します。VM は物理コンピュータを模倣するソフトウェアプログラムです。VM には独自のオペレーティングシステム、CPU、メモリ、ストレージ、ネットワークリソースがあります。一方、コンテナ化技術はコンテナを作成することで仮想化を実現します。コンテナは軽量な仮想化環境であり、ホストのオペレーティングシステムカーネルを共有します。コンテナにはアプリケーションのコード、ランタイム環境、依存関係などが含まれます。
アーキテクチャ分析#
仮想化技術は、ハイパーバイザを使用して仮想マシンとハードウェアを切り離します。仮想マシンはハイパーバイザレイヤに依存しています。ハイパーバイザ(仮想マシンモニタ)は、物理サーバとオペレーティングシステムの間で実行される中間ソフトウェアレイヤであり、複数のオペレーティングシステムとアプリケーションがハードウェアを共有できるようにします。ハイパーバイザ仮想マシンは、マシンのハードウェアリソースをシミュレートし、仮想マシン間の隔離を実現します。各仮想マシンには、実行するアプリケーション、依存するバイナリとライブラリリソース、完全なオペレーティングシステムが含まれており、仮想マシンが実行されると、割り当てられたリソースはすべて使用されます。
コンテナは VM とは異なり、アプリケーションと依存ライブラリのみを含み、アプリケーションに独立した実行スペースを提供します。コンテナは同じ上位オペレーティングシステムカーネルを共有し、コンテナ内のリソース制限とコンテナ間の隔離を実現するために、Linux の Namespace と CGroups 技術に基づいています。
Namespace の目的は、抽象化を使用して Namespace 内のプロセスが独自の隔離されたグローバルシステムリソースインスタンスを持っているように見えるようにすることです。
Linux カーネルは 6 つの Namespace を実装しています:マウント Namespace、UTS Namespace、IPC Namespace、PID Namespace、ネットワーク Namespace、ユーザ Namespace。それぞれの機能は、ファイルシステムの隔離、ホスト名とドメイン名の定義、特定のプロセス間通信リソース、独立したプロセス ID 構造、独立したネットワークデバイス、ユーザーとグループ ID スペースです。
コンテナ化技術の代表である Docker を例にとると、Docker はコンテナを作成する際に、上記の 6 つの Namespace インスタンスを作成し、隔離されたシステムリソースをそれぞれの Namespace に配置します。これにより、各コンテナは独自のシステムリソースしか見ることができません。
Docker は CGroups を使用してリソースの制限を行います。CGroups(Control Groups)は Linux カーネルで提供されるメカニズムで、CPU、メモリ、IO、ネットワークなど、プロセスが使用する物理リソースを制限、記録、隔離するための機能を提供します。簡単に言えば、CGroups は呼び出しを受け取ると、指定されたプロセスにフックを設定し、リソースが使用されるとフックがトリガーされ、リソースのカテゴリに応じて、CPU、メモリ、IO などの適切な方法で制限が行われます。
CGroups にはサブシステム(Subsystem)と呼ばれる用語があります。これはリソーススケジューリングコントローラであり、CPU サブシステムは CPU の時間配分を担当し、メモリサブシステムはメモリの使用量を制御します。Docker はコンテナを起動すると、/sys/fs/cgroup ディレクトリにこのコンテナの ID を持つフォルダを作成し、そのフォルダには CGroups の設定ファイルがあります。これにより、CGroups を使用してコンテナのリソース使用率を制限することができます。
隔離性に関して#
仮想化技術は、仮想マシンモニタ(VMware や KVM など)によって物理ハードウェア上に完全な仮想マシンを作成し、各仮想マシンには独自のオペレーティングシステムとアプリケーションがあり、ハードウェアレベルでの完全な隔離を実現していますが、管理の複雑さが高いです。一方、コンテナ化技術(Docker など)はオペレーティングシステムレベルでの隔離を行い、複数のコンテナが同じホストのオペレーティングシステムとカーネルを共有し、独立したアプリケーションとサービスを実行することができます。軽量で効率的なアプリケーションのパッケージング方法を提供し、迅速なデプロイと管理に適しています。
パフォーマンスの負荷とリソースの専有#
コンテナは追加のオペレーティングシステムのロードを必要としないため、起動速度が速く、リソース消費が少ないため、パフォーマンスの負荷面では従来の仮想化技術よりも優れています。仮想化技術では、各仮想マシンが完全なオペレーティングシステムを実行する必要があるため、リソースの使用率と起動時間が高くなり、リソースの浪費を引き起こす可能性があります。
適用シナリオ#
仮想化技術は、高い隔離性とセキュリティが必要なシナリオに適しています。データセンターやクラウドコンピューティング、サーバーホスティングなどが該当します。一方、コンテナ化技術は、軽量で迅速なアプリケーションの開発とデプロイが必要なシナリオに適しています。Web サーバーやマイクロサービスアーキテクチャ、継続的インテグレーション / 継続的デプロイ(CI/CD)などが該当します。軽量で迅速な起動とポータビリティの特徴から、コンテナ化技術は現代の DevOps プラクティスで非常に人気があります。
管理と監視#
仮想マシンの管理と監視は通常、専用のツールやプラットフォーム(OpenStack など)によって処理され、豊富な管理と監視機能が提供されます。コンテナ化技術の管理と監視は、コンテナオーケストレーションツール(Kubernetes など)を使用して実現できます。これらのツールはコンテナ化ワークロードに特化しており、自動デプロイ、スケーリング、運用の機能を提供します。
仮想化技術はより強力な隔離性と広範なオペレーティングシステムのサポートを提供し、高度な隔離性と特定のオペレーティングシステム環境が必要な場合に適しています。一方、コンテナ化技術は軽量で迅速で一貫性があり、現代のクラウド環境やマイクロサービスアーキテクチャに適しています。技術の進歩に伴い、これらの 2 つの技術は統合と最適化が進んでおり、実際のデプロイでは通常、2 つの技術を組み合わせて 1 つの仮想マシンで複数のコンテナを実行し、優れた隔離性とセキュリティを確保しながら、迅速なスケーリング、柔軟性、使いやすさを実現しています。