|
モノのインターネット(IoT)の台頭に伴い、この分野の先駆的な企業は、DevOpsのメリットを組み込み開発システム特有のニーズにまで拡張するため、コンテナの活用を検討しています。企業がIoT環境における機能拡張を目指す中で、LXCやLinuxコンテナ、Dockerといった人気のコンテナ技術が最前線に立っています。 コンテナの簡単な歴史コンテナは、仮想マシン(VM)の軽量な代替手段として人気が高まっています。仮想マシンとは、ユーザーが既存のホストOS上にゲストOSをインストールして実行できる仮想化されたハードウェアサーバーです。つまり、あらゆるOS環境で開発されたアプリケーションを、あらゆるシステムで実行できるということです。 しかし、仮想マシンはオーバーヘッドが高く、メンテナンスコストが高く、イメージサイズが大きいため、仮想マシン上で実行されるオペレーティングシステムの各インスタンスにリソースが過剰に割り当てられる可能性があります。一方、コンテナは、アプリケーションコードとその依存関係をパッケージ化した仮想化されたソフトウェア環境です。これにより、アプリケーションは任意のホスト上で独立して並列実行され、必要に応じてリソースが割り当てられます。 LXCとLXD – オペレーティングシステムのコンテナ化コンテナ技術は、2001年にJacques Gélinas氏のLinuxVServerプロジェクトを通じて初めて導入されました。この初期のコンテナ技術は、仮想マシンを起動することなくリソース(CPU、メモリ、ブロックI/O、ネットワーク)の制限と優先順位付けを可能にするcgroup機能の追加や、プロセスツリー、ネットワーク、ユーザーID、マウントされたファイルシステムや名前空間など、アプリケーションから見た動作環境の完全な分離を可能にする名前空間分離など、幾度かの再設計を経てきました。 2008 年、IBM のエンジニアは、組み込み開発者にとってこのテクノロジをより魅力的なものにするために、ユーザー空間ツールのレイヤーを追加しました。 2014 年、LXC バージョン 1.0 では、seccomp や SELinux などの既存の Linux テクノロジを活用して、コンテナーから溢れた悪意のあるコードによって引き起こされる DoS 攻撃を制御および防止することで、LXC のセキュリティ問題にさらに対処しました。 LXCコンテナは、オペレーティングシステムレベルの仮想化を採用することで動作し、共有ハードウェアとLinuxベースのオペレーティングシステムカーネル上で複数のLinux仮想環境を同時に実行できます。これによりオーバーヘッドコストが削減され、様々なデバイスタイプで使用できるアプリケーションを構築できます。LXCは基本的にシステムレベルおよびオペレーティングシステムレベルのコンテナ化に重点を置いており、まさにこの点がLXCの優れた点です。 LXD-LXCコンテナのアップグレードLXDは次世代のシステムコンテナと称されています。LXCライブラリに接続できるREST APIを通じて、システムレベルのコンテナ化を強化します。Go言語で記述されたLXDは、アプリケーションがHTTPS経由のUNIXソケット経由でアクセスできるシステムデーモンを作成し、分散システムの移植性をさらに高めます。LXDはLXCをベースに構築されており、オペレーティングシステムから独立して機能拡張するのではなく、カーネルを通じて機能を拡張します。その動作はハイパーバイザーを備えたVMと非常に似ていますが、リソースオーバーヘッドは発生しません。 Docker – コンテナ化されたアプリケーションLinuxコンテナは主にシステムレベルで動作しますが、Dockerはアプリケーションのコンテナ化に重点を置いています。2013年にリリースされたDockerは、当初はLXCをベースとしていましたが、大規模な仮想マシンの代替を求める組み込み開発者向けに、ユーザーフレンドリーなツールを追加しました。最終的に、Dockerは独自のコンテナ化アーキテクチャを開発することで、LXCとの差別化を図りました。 DockerとLXCは、実行中のプロセスがリソースを過剰に消費しないようにするためのセキュリティとプロセス分離機能を備えています。しかし、実際には両者は大きく異なる技術です。Dockerコンテナはそれぞれ単一の仮想化アプリケーションエンジンを実行しますが、LXCはLinuxオペレーティングシステムのユーザー領域の異なるコンポーネントをコンテナ化します。 Dockerコンテナは、ゲストOSではなく、単一のアプリケーションまたはアプリケーションコンポーネントをパッケージ化し、ホストOS上で直接Dockerデーモンを実行します。さらに、組み込み開発においては、コンテナ化された各アプリケーションは独立して実行され、ホスト上で同時に実行されている他のアプリケーションに影響を与えることはありません。 |