コンテナとは何ですか?

コンテナ

私たちは過去に、containerdのさまざまな機能、それがどのように設計されたか、そして途中で修正したいくつかの問題についていくつかの話をしました。 Containerdは、Docker、Kubernetes CRI、およびその他のいくつかのプロジェクトで使用されていますが、これは、これらのプラットフォーム内でcontainerdが実際に何をするのかわからない人のための投稿です。今後、containerdの機能セットとデザインについてさらに投稿したいと思いますが、今のところ、基本から始めます。

コンテナエコシステムは時々混乱する可能性があると思います。 特に私たちが使用する用語で。 これは何ですか? ランタイム。 でこれを。 ランタイム... 名前が示すようにcontainerdは、一部の人が私を荒らしたいようにオタクを含まない、コンテナデーモンです。もともとはruncなどのOCIランタイムの統合ポイントとして構築されましたが、過去6か月にわたって、DockerやKubernetesなどの最新のコンテナプラットフォームのニーズと同等にするための多くの機能が追加されました。

コンテナ

カーネル空間にはLinuxコンテナのようなものがないため、コンテナはさまざまなカーネル機能が結び付けられているため、大規模なプラットフォームまたは分散システムを構築する場合は、管理コードとシステムコールおよび機能のダクトテープの間に抽象化レイヤーが必要ですコンテナを実行します。それがコンテナが住んでいるところです。これは、プラットフォームがカーネルレベルにドロップダウンすることなく構築できるタイプのクライアントレイヤーを提供します。コンテナ、タスク、スナップショットの種類で作業する方が、clone()またはmount()の呼び出しを管理するよりもはるかに優れています。

Containerd は、Docker や Kubernetes のほか、システムコールや OS 固有の機能を抽象化して Linux、Windows、solaris、その他の OS 上でコンテナを実行するコンテナプラットフォームで使用するように設計されています。これらのユーザーを念頭に置いて、containerdには必要なものだけがあり、不要なものは何もないようにしたかったのです。現実的にはこれは不可能ですが、少なくともそれが私たちが試みていることです。ネットワーキングのようなものは、コンテナ化の範囲外です。その理由は、分散システムを構築する場合、ネットワークは非常に中心的な側面であるためです。今日のSDNとサービス検出では、ネットワークはLinuxでネットリンク呼び出しを抽象化するよりもはるかにプラットフォーム固有です。新しいオーバーレイ ネットワークのほとんどはルート ベースであり、新しいコンテナが作成または削除されるたびにルーティング テーブルを更新する必要があります。サービス検出、DNSなどにも、これらの変更を通知する必要があります。containerdにネットワークを追加した場合、これをサポートするために、さまざまなネットワークインターフェイス、フック、および統合ポイントをすべてサポートできるようにするには、コードの大きなチャンクになります。代わりに、複数のコンシューマーが関心のあるイベントをサブスクライブできるように、containerd内の堅牢なイベントシステムを選択しました。また、ユーザーが実行中のタスクを作成し、コンテナーのネットワーク名前空間にインターフェイスを追加して、コンテナーのライフサイクルのさまざまなポイントで複雑なフックを必要とせずにコンテナーのプロセスを開始できるタスク API も公開しています

過去数か月にわたってコンテナに追加された別の領域は、OCIとDockerの両方のイメージ形式をサポートする完全なストレージおよび配布システムです。コンテナ化されたAPI全体に完全なコンテンツアドレスストレージシステムがあり、画像だけでなく、メタデータ、チェックポイント、およびコンテナに添付された任意のデータに対しても機能します。

また、「グラフドライバー」の仕組みを再考するために時間をかけました。これらはオーバーレイまたはブロックレベルのファイルシステムであり、イメージにレイヤーを持たせ、効率的なビルドを実行できます。グラフドライバは、デバイスマッパーのサポートを追加したときに、最初にSolomonとIによって書かれました。当時、DockerはAUFSのみをサポートしていたため、オーバーレイファイルシステムの後にグラフドライバーをモデル化しました。しかし、devicemapper/lvm のようなブロックレベルのファイルシステムをオーバーレイ fillesystem のように振る舞わせることは、長期的にははるかに難しいことが判明しました。インターフェイスは、当初必要だと思っていたものとは異なる機能をサポートするために、時間の経過とともに拡張する必要がありました。containerdでは、オーバーレイファイルシステムをスナップショットのように動作させるのではなく、その逆を行うという別のアプローチを取りました。オーバーレイファイルシステムは、厳密な親子関係を持たないため、BTRFS、ZFS、デバイスマッパーなどのファイルシステムのスナップショットよりもはるかに柔軟性があるため、これははるかに簡単でした。これにより、スナップショット作成者用のより小さなインターフェイスを構築しながら、ビルダーなどに必要な要件を満たし、必要なコードの量を減らして、長期的な保守をはるかに簡単にすることができました。

では、コンテナを使用して実際に何が得られますか?プッシュ機能とプル機能、および画像管理を利用できます。コンテナライフサイクル API を使用して、コンテナとそのタスクを作成、実行、管理できます。 スナップショット管理専用の API 全体。基本的に、基盤となるOSの詳細を処理せずにコンテナプラットフォームを構築するために必要なすべてのもの。containerdの最も重要な部分は、バグ修正とセキュリティパッチがバックポートされたバージョン管理された安定したAPIを持つことだと思います。

コンテナ化の詳細については、以下を参照してください。

フィードバック

0 「コンテナとは何ですか?」についての考え