はじめに
コンテナーのデプロイは、DevOpsの世界で移植性、スケーラビリティ、敏捷性を確保するための実用的な方法です。テストから本番まで、コンテナはソフトウェア開発プロセス全体を容易にします。
コンテナの管理とオーケストレーションのためのプラットフォームは、エンドユーザーにとって直感的でわかりやすいように設計されています。ただし、プラットフォーム自体は複雑で、複数の調整されたプロジェクトで構成されています。
この記事では、コンテナー管理エコシステムの3つの重要な部分(Docker、containerd、CRI-O)の違いについて説明します。
コンテナエコシステム
DockerとKubernetesは、コンテナーエコシステムの2つの主要なプラットフォームです。相互運用性を確保するために、コミュニティはいくつかの基準に合意しました。
最も重要な2つの基準は次のとおりです。
- CRI -コンテナランタイムインターフェイス。これにより、Kubernetesは、Dockerの containerdを含むさまざまなコンテナーランタイムと互換性があります。 。
- OCI -OpenContainerInitiative。コンテナイメージとランタイムを標準化します。
次のインフォグラフィックは、CRIとOCIがKubernetesとDockerの接続にどのように役立つかを示しています。
Docker
Dockerは、Dockerという会社が運営する一連のコンテナー管理プロジェクトです。これらのプロジェクトは連携して、コンテナ展開のための包括的なプラットフォームを提供します。
最も重要なプロジェクトは次のとおりです。
- ドッカーCLI -コマンドラインインターフェイスプログラム。ユーザーは、docker CLIコマンドを発行して、Dockerコンテナーを作成および管理します。
- コンテナ -ユーザーコマンドをリッスンするデーモン。要求された画像をプルして保存し、コンテナのライフサイクルを制御します。
- runC -軽量でポータブルなコンテナランタイム。 runCは、Dockerがローカルシステムと対話するために必要なコンポーネントを統合する低レベルのコンポーネントです。このツールが作成するコンテナはOCI互換です。
Docker画像
Dockerイメージは、アプリケーションコードと、アプリケーションが正しく機能するために必要なライブラリ、ツール、およびその他の依存関係を含む読み取り専用テンプレートです。ユーザーがDockerでrunコマンドを発行すると、イメージテンプレートを使用してアプリコンテナーがデプロイされます。
Dockerイメージは、必要なイメージ情報を含むテキストドキュメントであるDockerfileを使用して作成されます。 build
コマンドはDockerfileとコンテキストを使用してイメージを作成します。
KubernetesのDocker
Container Runtime Interfaceは、Kubernetesが他のコンテナランタイムと通信できるようにするプラグインです。ただし、DockerはCRIを実装していないため、Kubernetesは dockershimと呼ばれる互換性レイヤーを導入しました 。このレイヤーは2つのAPIを橋渡しします。
バージョン1.23以降、KubernetesではランタイムがCRI互換である必要があります。これは、dockershimが非推奨になり、DockerEngineがランタイムとしてサポートされなくなったことを意味します。ただし、Kubernetesはcontainerdを介してDockerと通信できます。これは、プラグインに準拠したCRIである可能性があります。
Container Runtime Interface(CRI)
Kubernetesはコンテナオーケストレーションプラットフォームですが、最下位レベルでは、コンテナを作成して管理する必要もあります。これを実現するために、Kubernetesはコンテナランタイムを使用します。
当初、DockerEngineはプラットフォームで利用可能な唯一のランタイムでした。しかし、コンテナ化の人気により、競合するソリューションが発生し、Kubernetesがそれらすべてをサポートする必要がありました。 コンテナランタイムインターフェイスを使用 プラグイン、Kubernetesはすべての主要なランタイムと通信できます。
container
containerdは、Docker製のランタイムソリューションです。このデーモンは、LinuxおよびWindowsOSで使用できます。 Dockerプロジェクトの一環として、containerdはイメージの転送とストレージ、およびコンテナーの作成、実行、監視を管理します。
Kubernetesは、containerdを使用するためにDockerプラットフォーム全体を必要としません。 CRI互換性プラグインを使用すると、Kubernetesとcontainerdは直接通信できます。
CRI-O
CRI-Oは、CRIのOCI互換の軽量実装です。 DockerEngineの代替として作成されました。
CRI-Oを使用すると、Kubernetesポッドを起動して、必要な画像をプルできます。ただし、これはランタイムではありません。代わりに、runCやKataなどの他の低レベルのOCI互換ランタイムを起動するために使用されます。
Open Container Initiative(OCI)
Dockerおよびその他の重要なコンテナー業界の関係者は、2015年にOpen Container Initiative(OCI)を設立しました。OCIは、コンテナー形式とランタイムの標準を作成することを目的としています。現在、OCIには2つの仕様があります。
- image-spec -OCI準拠のイメージを作成する方法の概要を示すイメージ仕様。
- ランタイム仕様 -ファイルシステムバンドルを解凍するためのランタイム仕様。
runC
runCは、Dockerによって作成されたユニバーサルコンテナランタイムです。これはDockerツールセットの一部ですが、Dockerプラットフォームを実行する必要はありません。
runCのいくつかの重要な機能は次のとおりです。
- 完全なLinux名前空間のサポート。
- AppArmor、SELinuxなどのLinuxセキュリティ機能のネイティブサポート
- Windows10コンテナーのネイティブサポート。
- runCが作成および管理するコンテナは、OCIに準拠しています。