Docker と Kubernetes とは何ですか?
Docker と Kubernetes は、チームでアプリケーション開発について考えるとき両方セットで話題になることが多いものですが、同じものではありません。Docker はアプリケーションのパッケージ化と実行に関するしくみに主眼を置いています。一方 Kubernetes はアプリケーションの使用が始まった後の管理に関するしくみに主眼を置いています。特にシステムが大規模化、複雑化していく場合です。
Azure
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 の組み合わせは、単純なアプリケーションのパッケージ化手法であったコンテナー テクノロジが進化して本格的なインフラストラクチャ管理機能を備えた結果の姿だといえます。分散アーキテクチャが当たり前の形態になってきている中、オーケストレーション プラットフォームやマネージド クラウド サービスは、スケーラブルで信頼性が高いコンテナーベース システムをサポートする上でますます中心的な役割を担っています。