コンテナ

Linux コンテナとは

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

コンテナとは

より具体的に理解するため、アプリケーションを開発している場面を想像してください。あなたはノートパソコンで作業をしており、開発環境には特定の設定があります。他の開発者とは、やや異なる環境設定かもしれません。現在開発中のアプリケーションはその設定を利用しており、いくつかの特定のファイルに依存しています。それと同時に、会社のテスト環境および運用環境は、独自の設定と独自のサポートファイルのセットに準じて標準化されています。これらの環境を、サーバー環境を再現するためのオーバーヘッドなしで、できるだけローカルでエミュレートしたいと考えています。では、開発したアプリケーションがこれらの環境でも動作し、品質保証テストにも合格し、多大な労力を要する書き換えや修正なしにデプロイできるようにするにはどうすればよいでしょうか?その解決策こそが、コンテナです。アプリケーションを入れるコンテナに、必要な構成(およびファイル)が含まれているので、煩わしい副次的影響なしでコンテナを開発からテスト、さらに稼働へと進めることができます。これで、危機的な問題をうまく回避できます。

これは簡単な例でしたが、究極の可搬性、構成可能性、独立性が必要な場面で、Linux コンテナをいろいろな方法で応用して問題に対処できます。インフラストラクチャがオンプレミスでも、クラウドでも、またはその 2 つのハイブリッドでも、コンテナはニーズに対応します。

これは単なる仮想化ですか?

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

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

仮想化 対 コンテナ

どういう意味かそもそも、仮想化を可能にするハイパーバイザーというソフトウェア上に複数のオペレーティングシステムを実行するのは、コンテナを使用するより負荷がかかります。リソースや能力が限られている場合、高密度でデプロイできる、軽量なアプリケーションが必要になります。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 ソリューションをご活用ください。

コンテナのその他の多くの特徴