コンテナ

Linux コンテナとは

Linux® コンテナとは、システムの他の部分とは分離された一連のプロセスです。これらのプロセスを実行するために必要なファイルはすべて個別のイメージから提供されます。つまり、Linux コンテナは、開発からテスト、最終的には本番環境へ移行するまで移植性と一貫性を維持します。この特色によって、従来のテスト環境をレプリケートすることに依存する開発パイプラインよりも開発速度が向上します。

コンテナとは

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

アプリケーションを内包するコンテナには、必要なライブラリ、依存関係、ファイルが含まれているので、煩わしい副作用なしに、コンテナを本稼働へと進めることができます。実際、コンテナイメージの内容は Linux ディストリビューションのインストールと見なすことができます。RPM パッケージ、設定ファイルなどが完全に揃っているからです。ただし、コンテナイメージのディストリビューションは、オペレーティングシステムの新しいコピーをインストールするよりも簡単です。これで、危機的な問題をうまく回避できます。

これは一般的な例ですが、極めて高い移植性、構成可能性、独立性が必要な場合、Linux コンテナをさまざまな方法で活用して問題に対処できます。Linux コンテナの特色となる点は、開発期間を短縮できることと、新しいビジネスニーズにすばやく対応できることです。Apache Kafka によるリアルタイムデータストリーミングなどの場合は、コンテナは不可欠で、アプリケーションに必要なスケーラビリティを提供する唯一の手段となります。インフラストラクチャの形態がオンプレミス、クラウド、ハイブリッドのいずれであれ、コンテナはあらゆる要求に対応します。もちろん、適切なコンテナ・プラットフォームを選ぶことは、コンテナそのものと同様に重要です。

コンテナと仮想化の違い

この二者は同じものではありません。仮想化とコンテナについては、単に相互に補完するものとしてではなく、以下のように考えると簡単です。

  • 仮想化では、複数のオペレーティング・システム (Windows または Linux) を単一のシステム上で同時に実行できます。
  • コンテナは同じオペレーティング・システム・カーネルを共有し、アプリケーション・プロセスをシステムの他の部分から独立させます。たとえば、ARM Linux システムは ARM Linux コンテナを実行し、x86 Linux システムは x86 Linux コンテナを実行します。また x86 Windows システムは x86 Windows コンテナを実行します。Linux コンテナは極めて移植性に優れていますが、基盤システムと互換性がなければなりません。

仮想化とコンテナ

これはつまり、どういうことでしょうか。第一に、仮想化はハイパーバイザーを使用してハードウェアをエミュレートします。それにより、複数のオペレーティングシステムを並列で実行できるようになります。しかし、この方法はコンテナを使用した場合ほど軽量ではありません。しかし、リソースや能力が限られている場合、高密度でデプロイできる、軽量なアプリケーションが必要になります。Linux コンテナは単一のオペレーティングシステムでネイティブに実行され、すべてのコンテナは同じシステムを共有します。アプリもサービスも軽量で済み、並列実行の負荷もかかりません。

Linux コンテナは、アプリケーションを開発、デプロイ、そして管理する革新的な方法の一つです。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 からネットワーク名に至るあらゆるものを Linux カーネルで仮想化できます。新たな機能のユーザー名前空間によって、「ユーザーとグループ ID の名前空間ごとのマッピングが可能になります。コンテナに関して言うと、これは、ユーザーやグループにコンテナ内で特定の操作権限を与え、コンテナ外ではその権限を与えないということです」。その後の Linux コンテナプロジェクト (LXC) では、テクノロジーの進歩に合わせてツール、テンプレート、ライブラリや言語バインディングが加わり、コンテナを使用する際のユーザーエクスペリエンスが向上しました。LXC を使用することによって、簡単なコマンドライン・インタフェースでコンテナを開始できるようになりました。

Docker の登場

2008 年、Docker が (dotCloud を介して) その名前を冠したコンテナ・テクノロジーを開発しました。Docker テクノロジーによって多数の新しい概念やツールが加えられました。たとえば、新しいレイヤーイメージ、サーバーデーモン、構成済みコンテナイメージのライブラリを実行および構成するための簡単なコマンドライン・インタフェース、レジストリサーバーの概念などです。こうしたテクノロジーを組み合わせることにより、新しいレイヤーコンテナを迅速に構成し、他のユーザーと簡単に共有できます。

Red Hat はこの新しいエコシステムにおけるコラボレーションの利点を認識し、OpenShift コンテナ・プラットフォームで基礎となるテクノロジーを使用してきました。そのような重要なテクノロジーが 1 つのベンダーの制御下に置かれるという懸念を払拭するため、Docker Inc. は多数の基盤コンポーネントをコミュニティ主導のオープンソース・プロジェクトに寄贈しました (runc は Open Containers Initiative の一部で、containerd は CNCF に移行されました)。

コンテナテクノロジーの相互運用性を確保するため、OCI イメージ、ディストリビューション、ランタイムの仕様という 3 つの主要な標準があります。これらの仕様を組み合わせることによって、コミュニティ・プロジェクト、商用製品、クラウドプロバイダーは相互運用可能なコンテナテクノロジーを構築できます (カスタムビルドのイメージをクラウドプロバイダーのレジストリサーバーにプッシュすることを考えてください。これが機能する必要があります)。Red Hat と Docker は、コンテナテクノロジーのオープンな業界標準化を可能にしている Open Container Initiative (OCI) のメンバーでもあります。


コンテナのセキュリティについて

コンテナは人気がありますが、安全性についてはどうでしょうか?コンテナのセキュリティにはさまざまな不確定要素があります。コンテナのパイプラインとアプリケーション、開発環境、インフラストラクチャを保護しなければなりません。また、組織のセキュリティツールとポリシーと統合させるための計画も必要になります。その計画の立案を、Red Hat がお手伝いします。


Red Hat がお手伝いします。

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

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

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