Docker と Kubernetes とは何ですか?
Docker と Kubernetes は、チームでアプリケーション開発について考えるとき両方セットで話題になることが多いものですが、同じものではありません。Docker はアプリケーションのパッケージ化と運用に関するしくみです。一方 Kubernetes はアプリケーションの運用が始まった後の管理に関するしくみであり、特に、システムが大規模化、複雑化するにつれて重要性が増します。
Docker と Kubernetes は、チームでアプリケーション開発について考えるとき両方セットで話題になることが多いものですが、同じものではありません。Docker はアプリケーションのパッケージ化と運用に関するしくみです。一方 Kubernetes はアプリケーションの運用が始まった後の管理に関するしくみであり、特に、システムが大規模化、複雑化するにつれて重要性が増します。
開発者は、アプリケーションの構築と実行をコンテナー内で行うことがよくあります。このコンテキストにおけるコンテナーとは、アプリケーションとその実行に必要なライブラリ、依存関係、設定ファイルなどを含んだパッケージを意味します。コンテナーは、ソフトウェアが開発環境、テスト環境、運用環境 (クラウド サーバー上を含む) で一貫した形で動作するための助けとなります。
Docker と Kubernetes は、どちらもこの分野で広く使われているテクノロジです。Docker とKubernetes の違いを理解するための第一歩は、それぞれが何を目的として設計されているかを知ることです。
Docker と Kubernetes はどちらもコンテナーベースの環境で使われますが、使用目的が異なります。
Docker の目的はコンテナー化です。アプリケーションとその依存関係をまとめ、標準のコンテナー形式にパッケージ化することで、開発者のノート PC でも運用環境でも一貫した形で動作するようにします。Docker は基本からアプリケーション レベルで動作し、Docker を利用できる場所であれば、どこでもコンテナー イメージを作成することや、それらのイメージを確実に実行することができます。
Kubernetes はコンテナーのオーケストレーションを行うために設計されています。インフラストラクチャ レベルで運用され、多数のマシンからなるクラスター上でコンテナーの展開、スケーリング、保守を管理できます。Kubernetes は、分散アプリケーションが円滑に動作し続けるように、利用可能なリソースに基づいてコンテナーをスケジューリングし、アプリケーションの正常性を監視し、停止したコンテナーを再起動し、ネットワークの通信を取り扱います。
要するに、Docker はコンテナーを準備および実行するものであり、Kubernetes は実行されたコンテナーを管理するものです。
両者の役割が補完的な関係であるため、Docker と Kubernetes はしばしば併用されます。コンテナー イメージの構築は Docker で行われ、展開後は Kubernetes がそれらを引き継いで、環境全体のコンテナー群の調整と監視を行います。
Kubernetes は Docker 専用ではないことに注意してください。互換性がある他のランタイムで作成されたコンテナーについても、Kubernetes は標準のコンテナー ランタイム インターフェイスを介してオーケストレーションできます。この柔軟性により、Docker を直接使っていない環境でも、Kubernetes はコンテナー化されたワークロードを Docker なしで管理できます。
Kubernetes と Docker のどちらかを選ぶ、または両方を選ぶ判断の際には、通常、アプリケーションの複雑さ、展開スケールや、以後ワークロードを管理していくために必要な自動化の量などを考慮します。環境によっては単純なコンテナー化だけでもメリットがある一方、多数のシステムを含めた横断的なオーケストレーションが必須である場合もあります。
Docker の主要なテーマは、コンテナーの作成と実行です。アプリケーションのパッケージ作業をシンプル化して、開発環境、テスト環境、運用環境のいずれでも同じように実行できるようにすることです。その主なメリットは以下のとおりです。
これらは、ソフトウェアのパッケージ化と実行をシンプルにする能力であり、チームにおけるアプリケーション構築と出荷をより効率的するための助けになります。
Kubernetes は、展開後のコンテナーを、特に、複数台のマシンにまたがる展開において便利に管理できます。分散環境でアプリケーションの可用性と信頼性を維持するために役立つ自動化機能を備えています。その主なメリットは以下のとおりです。
これらの能力は、インフラストラクチャ全体の中でワークロードの規模変化や変更に対応しながらアプリケーションのスムーズな稼働を維持するために役立ちます。
Kubernetes では、Docker に直接依存せずコンテナー オーケストレーションを行うこともできます。複数種類のコンテナー ランタイムをサポートしているため、互換性のあるテクノロジを使って構築されたコンテナー化ワークロードであれば管理可能です。
Docker と Kubernetes の組み合わせは、アプリケーションが単一コンテナー展開の範囲を超え、環境全体の協調管理が必要になった場合によく使われます。
CI/CD パイプラインにおいて、Docker は、アプリケーション コードと依存関係をまとめた一貫性のある実行環境をパッケージ化する移植可能なコンテナーの機能を提供します。Kubernetes は、それらのコンテナーを展開時に管理します。利用可能なインフラストラクチャの上でワークロードの割り当てのスケジューリングとパフォーマンスの監視を行う機能を提供します。
また、クラウドネイティブ アプリケーションも、これら 2 つのテクノロジの連携を前提にして機能します。Docker を使ってアプリケーション コンポーネントをパッケージ化したコンテナーが、Kubernetes による調整の下でクラスター環境で動作することにより、可用性が維持され、需要の変化に応じたスケーリングがサポートされます。
複数のシステムをまたいで複数のコンテナーを動作させる分散アーキテクチャにおいては、管理の自動化が必要不可欠です。Docker はコンテナー化ワークロードを展開向けに準備し、Kubernetes はそれらのワークロードの実行、通信、障害復旧をインフラストラクチャ全体にわたって管理します。
Kubernetes と Docker は、両者の組み合わせにより、アプリケーションのライフサイクル全体にわたる協調的なコンテナー管理をサポートします。
コンテナー ライフサイクル内で Docker と Kubernetes は別々の段階をサポートしますが、それらの段階はつながっているため、モダンなアプリケーション アーキテクチャにおいては両者がしばしば併用されます。
Docker は、アプリケーションとその依存関係をまとめて移植可能なコンテナーとしてパッケージ化し、さまざまな環境で一貫した形で実行できるようにします。そのしくみを基盤にして、Kubernetes は、大規模なコンテナー管理と、分散システム内での展開、ネットワーク化、監視、回復の調整を行います。
この組み合わせは、アプリケーションの設計と運用のあり方が大局的に変化した状況を象徴するものといえます。クラウドネイティブ アーキテクチャでは、マイクロサービス、展開パイプラインの自動化や、需要の変化に適応できるインフラストラクチャの重要性が高まっています。
組織にハイブリッドおよびマルチクラウド戦略の採用が広がる状況を、コンテナーのパッケージ化による一貫性と、さまざまな環境への柔軟な対応を可能にするオーケストレーション プラットフォームが支えています。Kubernetes は単一コンテナーの範疇を超えてランタイムの機能を拡大し、1 つのツールに縛られないオープン スタンダードによるコンテナー化ワークロードのオーケストレーション手段を提供しています。
こうしたトレンドによって、クラウド プラットフォームがコンテナーベースのアプリケーション デリバリーをサポートするしくみが形成されてきました。たとえば、Microsoft Azure は、異なるコンテナーの成熟度レベルに応じて利用できるマネージド サービスを提供しています。Azure Kubernetes Service (AKS) のマネージド Kubernetes クラスターでは、チームがアプリケーションの展開と運用に集中でき、基盤となるインフラストラクチャを自力で管理する必要はありません。完全なオーケストレーションが必須でないシナリオの場合は、Azure Container Apps の組み込みスケーリングおよび管理機能を使うと、運用の複雑さの大部分を意識せずにコンテナー化アプリケーションを実行できます。
Docker と Kubernetes の組み合わせは、アプリケーションのパッケージ化手法であったコンテナー テクノロジが進化して本格的なインフラストラクチャ管理機能を備えた結果の姿だといえます。分散アーキテクチャが当たり前の形態になってきている中、オーケストレーション プラットフォームやマネージド クラウド サービスは、スケーラブルで信頼性が高いコンテナーベース システムの実現をサポートする上でますます重要な中心的役割を担っています。