過去 10 年間、コンテナはより高いレベルの一貫性とスケーラビリティを導入することで 、ソフトウェア開発に革命をもたらしました 。 これにより、開発者は依存関係の管理、環境の一貫性、コラボレーション ワークフローなどの課題から解放されます。
開発者がコンテナ化について調べるとき、コンテナの内部、アーキテクチャ、およびすべてがどのように組み合わされているかについて学ぶことができます。 そして、最終的には、containerdとDockerの違いと、それらが互いにどのように関連しているかについて疑問に思うかもしれません。
このブログ記事では、containerdとは何か、Dockerとcontainerdがどのように連携するか、そしてそれらの長所を組み合わせることで開発者のエクスペリエンスがどのように向上するかについて説明します。
コンテナとは
containerdが何であるかに飛び込む前に、コンテナとは何かを簡単に確認する必要があります。 簡単に言えば、 コンテナ は分離とリソース管理が追加されたプロセスです。 コンテナには、ホストシステムリソースにアクセスできる独自の仮想化オペレーティングシステムがあります。
コンテナーは、オペレーティング システムのカーネル機能も使用します。 名前空間を使用して分離を提供し、cgroup を使用して CPU、メモリ、ネットワーク帯域幅などのリソースを制限および監視します。 ご想像のとおり、コンテナの内部は複雑であり、誰もが低レベルのビットの専門家になるための時間やエネルギーを持っているわけではありません。 ここで役立つのが、containerd のようなコンテナー ランタイムです。
containerdとは何ですか?
要するに、containerdはコンテナを実行するために構築されたランタイムです。 この オープンソースツールは 、オペレーティングシステムのカーネル機能の上に構築されており、名前空間、cgroup、ユニオンファイルシステム、ネットワーク機能などを管理する抽象化レイヤーを使用してコンテナ管理を改善します。 これにより、開発者は複雑な問題を直接処理する必要がなくなります。
2017年3月、Dockerはコアコンテナランタイムをcontainerdというスタンドアロンプロジェクトに取り込み、Cloud Native Computing Foundation(CNCF)に寄贈した。2019年2月までに、containerdはCNCF内の段階的成熟度レベルに達し、その重要な開発、採用、およびコミュニティサポートを表しています。今日、開発者はcontainerdを、そのスケーラビリティ、パフォーマンス、安定性で知られる業界標準のコンテナランタイムとして認識しています。
Containerd は、多くのユースケースを持つ高レベルのコンテナー ランタイムです。 小規模なデプロイでコンテナのワークロードを処理するのに最適ですが、大規模なエンタープライズレベルの環境(Kubernetesを含む)にも適しています。
containerdの堅牢性の重要な要素は、 Open Container Initiative (OCI)準拠のランタイムをデフォルトで使用していることです。 containerdは、runc(低レベルのコンテナランタイム)などのランタイムを使用することで、コンテナ化された環境での標準化と相互運用性を確保します。また、コンテナの作成、起動、停止など、コンテナのライフサイクルにおけるコア操作を効率的に処理します。
containerdはDockerとどのように関連していますか?
しかし、containerdはDockerとどのように関連していますか? これに答えるために、Dockerのアーキテクチャを大まかに見てみましょう(図 1)。
containerdは、オペレーティングシステムと直接連携することで、コンテナの操作を容易にします。 Docker Engine は containerd の上にあり、追加の機能と開発者エクスペリエンスの強化を提供します。
Docker と containerd の相互作用
この相互作用をよりよく理解するために、コマンドを実行し docker run
たときに何が起こるかについて説明しましょう。
- Enter キーを選択すると、 Docker CLI は、
run
REST API 呼び出しを介してコマンドとコマンドライン引数を Docker デーモン (dockerd) に送信します。 - dockerdはリクエストを解析して検証し、コンテナイメージなどがローカルで利用可能かどうかをチェックします。 そうでない場合は、指定されたレジストリからイメージがプルされます。
- イメージの準備が整うと、dockerd は制御を containerd に移し、イメージからコンテナーを作成します。
- 次に、containerdがコンテナ環境を設定します。 このプロセスには、コンテナー・ファイル・システム、ネットワーク・インターフェース、その他の分離機能のセットアップなどのタスクが含まれます。
- containerd は、shim プロセスを使用して、コンテナーの実行を runc に委任します。 これにより、コンテナーが作成され、起動します。
- 最後に、コンテナが実行されると、containerdはコンテナのステータスを監視し、それに応じてライフサイクルを管理します。
Docker と containerd: 相乗効果
Dockerは、containerdの設立からCNCFへの寄贈、そしてそれ以降に至るまで、containerdの作成と採用において重要な役割を果たしてきました。 この関与は、コンテナランタイムを標準化し、containerdの開発へのオープンソースコミュニティの関与を強化するのに役立ちました。 Dockerは、containerdを継続的に維持および進化させることで、オープンソースコンテナエコシステムの進化をサポートし続けています。
containerd は、実行中のコンテナーのコア機能に特化しています。 これは、低レベルのコンテナ内部やその他の高度な機能にアクセスする必要がある開発者に最適です。 Docker は containerd 上に構築され、コンテナーを構築、実行、テスト、検証、共有するためのまとまりのある開発者エクスペリエンスと包括的なツールチェーンを作成します。
ビルド + 実行
開発環境では、Docker Desktop、Docker CLI、Docker Compose などのツールを使用すると、開発者は単一または複数のコンテナー環境を簡単に定義、構築、実行し、お気に入りのエディターや IDE、さらには CI/CD パイプラインとシームレスに統合できます。
試験
開発者エクスペリエンスの最大の問題点の 1 つは、テストと環境の一貫性です。 Testcontainers を使用すると、開発者は環境 (開発、ステージング、テスト、運用など) 間の再現性について心配する必要はありません。また、Testcontainers を使用すると、開発者はコンテナーを使用して、分離された依存関係の管理、並列テスト、CI/CD 統合の簡素化を行うことができます。
検証
Docker Scoutは、コンテナイメージを分析し、ソフトウェア部品表(SBOM)を作成することで、Docker Desktop、Docker Hub、またはDocker CLIと連携して、組織のシフトレフトを支援します。また、開発者はコンテナイメージ内のソフトウェアの脆弱性を見つけて修正し、安全なソフトウェアサプライチェーンを確保することができます。
共有
Docker Registry は、開発者がコンテナイメージを共有リポジトリに安全にプッシュするためのストアとして機能します。 この機能により、イメージの共有が合理化され、開発と展開のワークフローの一貫性と効率の維持が容易になります。
Dockerがcontainerd上に構築されているため、ソフトウェア開発ライフサイクルは、本番環境への安全なデプロイのための内部ループとテストの恩恵を受けます。
まとめ
この記事では、Docker と containerd の関係について説明しました。 分離されたプロセスとしてのコンテナが、オペレーティングシステムの機能を活用して、効率的でスケーラブルな開発およびデプロイソリューションを提供する方法を示しました。 また、containerdとは何か、Dockerがスタックでcontainerdをどのように活用するかについても説明しました。
Dockerはcontainerd上に構築され、開発者のエクスペリエンスを向上させ、コンテナの構築、実行、検証、共有、テストにわたる開発ライフサイクル全体に対応する包括的なツールスイートを提供します。
Dockerの オープンソースプロジェクト と 最も人気のあるオープンソースツールをチェックして、containerdやその他のコンテナコンポーネントを使用して次のプロジェクトを開始します。
さらに詳しく
- Docker Newsletter を購読してください。
- Docker デスクトップの最新リリースを入手します。
- 質問がありますか? Docker コミュニティがお手伝いします。
- ドッカーは初めてですか? 始めましょう。