コンテナーとは何か

コンテナーとは何か、また一般的なコンテナー プラットフォームとの違いは何かについて説明します。

Sten Pittet Sten Pittet

コンテナーは、コード、ランタイム、構成、システム ライブラリなど、すべての依存関係を含むソフトウェアのパッケージであり、どのホスト システムでも実行できます。コンテナーには、実行時に CPU、RAM、ディスク、ネットワーキングなどのオペレーティング システム リソースの独立したスライスも付与されます。

コンテナーの構造を示す図

コンテナーが必要な理由

コンテナーは、多数のコードベースや開発者全体に DevOps の効率を拡大していくときに非常に役立ちます。コンテナーは、そのコンテナーがデプロイされている任意のマシン上でコンテナー化されたコードの動作に一貫性を持たせることによって、開発者の人数に合わせて拡張できます。新規採用の開発者は、作業するアプリケーションのコンテナーを取得すればすぐに開発を開始できます。

マイクロサービス アーキテクチャのような複数のコードベース シナリオは、各マイクロサービスの移植性を保ちながらコンテナーに分離することによってコンテナーのメリットを得られます。マイクロサービス コンテナーを堅牢なコンテナー管理プラットフォームと組み合わせることで、クラスターの管理と連携がはるかに容易になります。これによって、アプリケーションのトラフィックや負荷の増加に適応する動的スケーリング フィーチャーが可能になります。

その仕組みについて

最初にコンテナーを理解するには、仮想化について考える必要があります。仮想化とは、CPU、RAM、ディスク、ネットワーキングの共有コンピューティング リソースを元の共有スコープを意識しない、独立したリソースに分割することです。仮想マシン (VM) またはコンテナーを使用してマシンを仮想化する場合、ホスト マシンのリソースは基本的には仮想コンポーネントで使用するために細かく分割されます。

コンテナーは、ユーザー スペース レベルでマシンのオペレーティング システムを仮想化します。ユーザー スペースの仮想化には、オペレーティング システム上の個別のユーザー アカウントとプログラム間でシステム リソースを分割する既存のメカニズムを活用します。

コンテナー システムには通常、別の連携のためのユーティリティ コマンドまたはサーバー デーモンがあります。DevOps チーム メンバーは、連携のためのユーティリティを調整して個々のコンテナーを作成して管理します。連携のためのユーティリティは、ホスト オペレーティング システムのユーザー スペースのリソースを分けてそれらのリソースをコンテナーに割り当て、コンテナーを実行して監視します。

ユースケース

コンテナーは、ソフトウェア配布のエラーの典型的な原因の 1 つ「私のマシンでは動作しません」という問題を解決します。この残念なシナリオでは、アプリケーション コードはあるマシンで想定どおりに動作しますが別のマシンで実行すると失敗します。これは通常、2 台のマシンの微妙な違いによるものです。これらの違いは、依存関係のバージョンが一致しない場合やその他の構成の不一致である可能性があります。コンテナーでは、アプリケーション コードの実行に必要なすべての静的かつ反復可能なパッケージを作成することでこれを解決します。

コンテナーと VM の比較

コンテナーと仮想マシンは、非常に類似した目標があります。どちらも、繰り返し可能な独立パッケージでアプリケーション ソフトウェアを配布するのに役立ちます。この 2 つの違いは、仮想化しようとするハードウェア スタックの量です。VM はマシンとオペレーティング システム全体をシミュレートします。つまり、仮想マシンでは CPU、RAM、ファイル システム、ネットワーク リソースがシミュレートされています。

コンテナーは、既存のオペレーティング システムのユーザー スペースのみを仮想化します。その点では、コンテナーは仮想マシンよりもはるかに軽量です。コンテナーは、既存のホスト オペレーティング システムで利用できます。

コンテナー ランタイム ツール

コンテナー ランタイムは、コンテナーにパッケージ化する必要がある依存関係を指定するためのツール セットです。このランタイムがコンテナーをビルドして実行します。

Docker

Docker は、最も広く一般的に使用されているコンテナー ランタイムです。コンテナー ベース インフラストラクチャの最新の DevOps に、飛躍的な革新をもたらしました。Docker には、一般的なオープン ソース ツールを格納する大規模なコンテナーを揃えたパブリック リポジトリがあります。

Linux コンテナー - LXC

Linux コンテナーはネイティブのオープン ソース Linux ユーティリティのコレクションを使用して、コンテナー ランタイム エクスペリエンスを実現します。Linux コンテナーの目標は、コンテナー テクノロジーを開発するためのベンダー ニュートラルな環境を提供することです。実際に Docker は内部で LXC を使用しています。Linux コンテナーでは、コンテナー エクスペリエンスをできる限り VM に近い状態に保つことに重点を置いています。

CRI-O

軽量さを謳っている Kubernetes コンテナー管理システムをターゲットにした、新しいコンテナー規格です。CRI-O はオープン コンテナー イニシアチブ (OCI) を実装しており、OCI は Red Hat、Intel、IBM などの企業の有志によって開発された規格です。

Rkt と Rktlet

「ロケット」と呼ばれる RKT は、セキュリティを第一とするコンテナー規格です。RKT コンテナーは、ユーザーがセキュリティ フィーチャーを明示的に無効にしない限り、安全ではない機能を許可しません。RKT は Pod ネイティブであり、Kubernetes コンテナー管理システムに適しています。

コンテナー管理プラットフォーム

コンテナー管理プラットフォームは、ランタイム コンテナーのグループまたはクラスターの連携に使用されるより複雑ではないレベルのツールです。コンテナー管理プラットフォームでは、基盤となるコンテナー ランタイム システムを使用します。一部のコンテナー管理プラットフォームでは、複数のコンテナー ランタイムを組み合わせたコンパイルが可能です。

Kubernetes

Kubernetes は Google が設計してリリースしたオープン ソースのコンテナー管理システムであり、ホストされているコンテナーの分散クラスターの作成に使用されます。Kubernetes は、正常性の監視、デプロイ、フェイルオーバー、自動スケーリングを含む堅牢なコンテナー クラスターの連携ツールを提供します。

Docker

Docker は、コンテナーのクラスターを起動、連携、管理するためのユーティリティ スイートも提供しています。Docker は非常に広く使用されているため、そのコンテナー定義システムは Amazon ECS や Kubernetes のような多くのサードパーティ コンテナー管理システムでサポートされています。

Amazon ECS

Amazon Elastic Container Service は、クラスター内の Docker コンテナーを簡単に管理できる Amazon クラウド ベースのサービスです。強力な API を備える ECS は Amazon の他のクラウド スイートと緊密に統合されているため、強力な DevOps ワークフローを実現できます。

Openshift

Openshift コンテナー プラットフォームはエンタープライズ向け Red Hat Linux 製品であり、Kubernetes と Openshift クラウド統合を提供するハイブリッド製品です。Openshift は信頼できるエンタープライズ クラウド プラットフォームであり、他の Red Hat ツールと統合できます。

結論

コンテナーは、最新の DevOps ツール セットに不可欠のものです。どのランタイムまたはコンテナー プラットフォームを選択したとしても、チームのより効率的な実行にコンテナーのメリットが役立ちます。コンテナーはローカル開発プロセスとリモート デプロイ プロセスの両方を合理化しながら、顧客に提供できるソフトウェア製品の品質向上に役立ちます。