コンテナ

Linux コンテナとは

Linux® コンテナとは、システムのその他の部分から分離された一連のプロセスであり、そのプロセスのサポートに必要なすべてのファイルを提供する個別のイメージから実行されます。アプリケーションのすべての依存関係を含むイメージを提供することで、開発からテスト、本番稼働へと進む過程において、移植性と一貫性を保つことができます。

コンテナとは

たとえば、アプリケーションを開発しているとします。作業はノートパソコンで行っており、開発環境は特定の構成になっています。他の開発者とは、やや異なる構成かもしれません。開発中のアプリケーションはその構成を利用し、特定のファイル複数に依存しています。一方で、会社のテスト環境および本番環境は、独自の構成と独自のサポートファイル群に基づき標準化されています。これらの環境をできるだけローカルでエミュレートしたいものの、サーバー環境を再現するためのオーバーヘッドは避けたいと考えています。では、開発したアプリケーションがこれらの環境でも動作し、品質保証テストにも合格し、多大な労力を要する書き換えや修正なしにデプロイできるようにするにはどうすればよいでしょうか?これを解決するのが、コンテナです。アプリケーションを内包するコンテナには、必要な構成とファイルが含まれているので、煩わしい副作用なしに、コンテナを開発からテスト、さらに本番稼働へと進めることができます。これで、危機的な問題をうまく回避できます。

この例は単純化されていますが、極めて高い移植性、構成可能性、独立性が必要な場合、Linux コンテナをさまざまな方法で活用して問題に対処できます。インフラストラクチャの形態がオンプレミス、クラウド、ハイブリッドのいずれであれ、コンテナはあらゆる要求に対応します。もちろん、適切なコンテナ・プラットフォームを選ぶことは、コンテナそのものと同様に重要です。

コンテナと仮想化の違い

コンテナ技術はただの仮想化であるとも、そうではないとも言えます。仮想化とコンテナについては、以下のように考えると簡単です。

  • 仮想化では、複数のオペレーティングシステムを単一のシステム上で同時に実行できます。
  • コンテナは同じオペレーティング・システム・カーネルを共有し、アプリケーション・プロセスをシステムの他の部分から独立させます。

仮想化とコンテナ

これはつまり、どういうことでしょうか。まず、仮想化を可能にする「ハイパーバイザー」というソフトウェア上で複数のオペレーティング・システムを実行する場合、コンテナを使用するよりも負荷がかかります。しかし、リソースや能力が限られている場合、高密度でデプロイできる、軽量なアプリケーションが必要になります。同一のオペレーティング・システム上で実行されるコンテナはすべて、単一のオペレーティング・システムを共有するため、アプリもサービスも軽量で済み、低負荷で並列実行されます。


コンテナの歴史

コンテナの進化:ダウンロードボタン

現在でいうところのコンテナ技術は、2000 年に登場した FreeBSD jail から始まりました。このテクノロジーは、 FreeBSD  システムを複数の「jail」と呼ばれるサブシステムへとパーティション化するものでした。jail は、システム管理者が組織内外の複数のユーザーと共有できる安全な環境として開発されました。jail の目的は、ファイルシステム、ネットワーク、およびユーザーへのアクセスが仮想化される、修正された  chrooted  環境でプロセスを作成し、プロセスの脱出やシステム全体の脆弱化を防ぐことでした。jail の実装は限定的で、その後 jail 環境からの脱出方法も発見されました。

しかし、そのコンセプトは魅力的であったと言えます。

2001 年には、Jacques Gélinas 氏の  VServer プロジェクトを通じて、Linux にも隔離環境の実装が登場しました。Gélinas 氏自身の言葉によれば、これは「高度の独立性とセキュリティを確保しながら複数の汎用 Linux サーバーを単一の箱の中で実行させる」試みでした。Linux で複数の制御されたユーザー空間を使用する、という基盤ができた後、現在の Linux コンテナへと発展していきました。

コンテナがより実用的に

他のテクノロジーを組み合わせることで、この独立したアプローチはすぐに実現に近づきました。コントロールグループ (cgroups) とは、プロセスまたはプロセスのグループによるリソース使用を制御および制限するカーネル機能のことです。 systemd は、ユーザー空間をセットアップしてプロセスを管理する初期化システムで、これらの隔離されたプロセスをより細かく制御するために cgroups によって使用されます。これらのテクノロジーは、Linux の全体的な制御性を向上させながら環境の分離性を維持する方法の枠組みとなりました。

ユーザー名前空間が進化したことで、コンテナはさらに発展を遂げました。ユーザー名前空間によって、「ユーザーとグループ ID の名前空間ごとのマッピングが可能になります。コンテナに関して言うと、これは、ユーザーやグループにコンテナ内で特定の操作権限を与え、コンテナ外ではその権限を与えないということです」。これは jail のコンセプトと似ていますが、jail の「修正された環境」という概念とは対象的に、プロセスの分離性の向上により、セキュリティが高まります。

その後の Linux コンテナプロジェクト (LXC) では、テクノロジーの進歩に合わせてツール、テンプレート、ライブラリや言語バインディングが加わり、コンテナを使用する際のユーザーエクスペリエンスが向上しました。

Docker の登場

2008 年、Docker が (dotCloud を介して) その名前を冠したコンテナ・テクノロジーを開発しました。Docker テクノロジーは、強化された開発者向けツールを LXC と組み合わせたもので、コンテナの使いやすさが向上しています。Docker はオープンソース・テクノロジーであり、現在では Linux コンテナをデプロイして管理するためのプロジェクトや手法のうち、最もよく知られたものとなっています。

Red Hat と Docker は、コンテナ・テクノロジーのオープンな業界標準化に向けて作業している Open Container Initiative (OCI) のメンバーでもあります。


標準化と Open Container Initiative

Linux Foundation の一部である Open Container Initiative (OCI) は 2015 年に設立されました。その目的は、「コンテナの形式やランタイムに関するオープンな業界標準を作る」ことです。このプロジェクトは現在、ランタイムとイメージという、2 つの分野における仕様を決定することに注力しています。

ランタイムの仕様では、ファイルシステムのバンドルに関するオープンスタンダード、コンテナ内のサポートファイルやアーティファクトの構造、そして準拠するランタイムでそのバンドルを展開する方法を設定します。つまりこの仕様の目的は、コンテナが想定どおりに機能すること、およびすべてのサポートアセットが適切な場所で利用可能になることを保証することです。

OCI のイメージ仕様は、コンテナのイメージがどのように作成されるかを定義します。作成により、「イメージのマニフェスト、ファイルシステムのシリアル化、およびイメージの構成」が生成されます。

これらの仕様が連動して、コンテナのイメージに含まれる内容と、イメージの正常な実行に必要な依存関係、環境、引数などを定義します。


抽象化としてのコンテナ

Linux コンテナは、アプリケーションを開発、デプロイ、そして管理する革新的な方法の一つです。Linux コンテナのイメージは、移植性とバージョン管理を実現することにより、開発者のノートパソコンで動作するアプリケーションが本番環境でも確実に動作するものになるよう助けます。

Linux コンテナの実行時には、仮想マシンほどリソースが必要となりません。さらに、アプリケーションの分離性がかなり保持され、より大きなアプリケーションの一部として管理しやすくなります。

Linux コンテナは、どのソフトウェアを作業に使用するかではなく、開発のスピードアップを図りビジネスニーズに即座に対応することを重視しています。「コンテナとは 1 つのアプリケーションが入っているものである」という固定概念に縛られる必要はありません。コンテナには、アプリケーションの一部や、複数のサービスを入れることも可能です。そして、Kubernetes などの他のテクノロジーを使って、コンテナ化されたアプリを自動化し、オーケストレーションすることができます。コンテナはアプリケーション・ロジック、ランタイム、および依存関係のホストとなります。そのため、コンテナにすべてのものを入れることも、マイクロサービスとして動作する複数のコンテナからなるアプリケーションを構築することもできます。


本番環境におけるコンテナ

コンテナは、よりスピーディにソフトウェアやアプリケーションをお客様に提供するための優れた方法です。その場合、コンテナを本番環境で使用することになり、コンテナ上で実行されるプロセスのリスクが高まります。

そこで Red Hat の登場です。Red Hat は長年にわたりオープンソース・コミュニティに参加して、コンテナなどのテクノロジーの安全性、安定性、信頼性の向上に貢献してきました。それが Red Hat の役目です。多くのテクノロジーをサポートしています。あなたのサポートもお任せください。

Red Hat のテクノロジーを活用すれば、試行錯誤することなくコンテナを使用できるようになります。開発者チームをコンテナ向けプラットフォームに移行させる。最高クラスのオペレーティング・システム上でコンテナ・インフラストラクチャを稼動させる。コンテナが生成する大規模データのストレージ・ソリューションを提供する。あらゆるコンテナ・ソリューションに、Red Hat をご活用ください。

コンテナについてさらに詳しく知る