This is the Trace Id: f21ff3394772412f6f4a987d87ba98a2
メイン コンテンツへスキップ
Azure

Kubernetes とDocker: 両者の違いは?

Docker と Kubernetes が機能するしくみ、両者の違いや、チームがアプリケーションを構築、展開、管理する中でそれぞれをどのような場合に利用するかを説明します。

Docker と Kubernetes とは何ですか?

Docker と Kubernetes は、チームでアプリケーション開発について考えるとき両方セットで話題になることが多いものですが、同じものではありません。Docker はアプリケーションのパッケージ化と運用に関するしくみです。一方 Kubernetes はアプリケーションの運用が始まった後の管理に関するしくみであり、特に、システムが大規模化、複雑化するにつれて重要性が増します。

重要なポイント

  • Docker と Kubernetes は異なる問題への解決策としてよく併用されるものであり、競合するテクノロジではありません。
  • Docker は、開発環境と運用環境の両方において、一貫してアプリケーションのパッケージ化と実行に主眼を置いています。
  • Kubernetes は、大規模なアプリケーション管理と、システムの成長に応じた可用性、調整、信頼性の取り扱いに主眼を置いています。
  • コンテナーは、マイクロサービス アーキテクチャや DevOps ワークフローを含めたモダンな開発手法をサポートします。
  • コンテナー テクノロジは、組織において、セキュリティ、移植性、スケーラビリティを備えたクラウドネイティブ アプリケーションを構築するために使われています。
  • Docker と Kubernetes の組み合わせは、アプリケーションのパッケージ化手法であったコンテナー テクノロジが進化してスケーラブルなマネージド インフラストラクチャになった結果の姿だといえます。

Kubernetes とDocker の違い

開発者は、アプリケーションの構築と実行をコンテナー内で行うことがよくあります。このコンテキストにおけるコンテナーとは、アプリケーションとその実行に必要なライブラリ、依存関係、設定ファイルなどを含んだパッケージを意味します。コンテナーは、ソフトウェアが開発環境、テスト環境、運用環境 (クラウド サーバー上を含む) で一貫した形で動作するための助けとなります。

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 なしで管理できます。

Docker と Kubernetes のメリットとユース ケース

Docker と Kubernetes のメリットとユース ケース

Kubernetes と Docker のどちらかを選ぶ、または両方を選ぶ判断の際には、通常、アプリケーションの複雑さ、展開スケールや、以後ワークロードを管理していくために必要な自動化の量などを考慮します。環境によっては単純なコンテナー化だけでもメリットがある一方、多数のシステムを含めた横断的なオーケストレーションが必須である場合もあります。

Docker のメリット

Docker の主要なテーマは、コンテナーの作成と実行です。アプリケーションのパッケージ作業をシンプル化して、開発環境、テスト環境、運用環境のいずれでも同じように実行できるようにすることです。その主なメリットは以下のとおりです。

  • 標準化されたアプリケーション パッケージ化。Docker では、1 つのアプリケーションとその依存関係をまとめて 1 つのコンテナー イメージにパッケージ化します。これにより、どこに展開してもアプリケーションを同じように動作させることができ、開発時とリリース時における環境関連の問題を軽減しやすくなります。
  • ローカル環境と運用環境の一貫性。開発者は、ローカル環境でのアプリケーション構築とテストにも、運用環境での実行にも、同じコンテナー イメージを使用できます。この一貫性により、チームが問題を早い段階で発見しやすく、開発から運用への引き継ぎを効率的に行いやすくなります。
  • 軽量で移植性の高いコンテナー ランタイム。Docker コンテナーは起動が速く、従来の仮想マシンよりも少ない消費リソースで動作します。これにより、進化するアプリケーション開発への対応や迅速な反復に適しています。

これらは、ソフトウェアのパッケージ化と実行をシンプルにする能力であり、チームにおけるアプリケーション構築と出荷をより効率的するための助けになります。

Docker のユース ケース

  • アプリケーション開発とテスト。開発チームは、ソフトウェアの構築とテストのために、再現可能な環境を Docker で作成します。アジャイルや DevOps ワークフローでは変更が頻繁に発生し、それらを迅速に検証する必要があるため、この手法が一般的に使われます。
  • マイクロサービスベースのアプリケーション。アプリケーションが小規模のサービスに分割されている場合、Docker を使って各サービスを独立的にパッケージ化することがよく行われます。そうすると、システム全体に影響を及ぼすことなくチームが各コンポーネントを開発、更新、展開できます。
  • 継続的インテグレーションと継続的デリバリー (CI/CD) パイプライン。Docker コンテナーは、継続的インテグレーションと継続的デリバリーのパイプラインで一般的に使われています。自動化システムにより、コンテナー イメージの構築、テストの実行、アプリケーションの展開準備を一貫した形で実行できます。

Kubernetes のメリット

Kubernetes は、展開後のコンテナーを、特に、複数台のマシンにまたがる展開において便利に管理できます。分散環境でアプリケーションの可用性と信頼性を維持するために役立つ自動化機能を備えています。その主なメリットは以下のとおりです。

  • 需要に応じた自動でのアプリケーション スケーリング。Kubernetes はワークロードを監視し、実行するコンテナーの数を需要の変化に応じて調整します。これにより、トラフィックの急増時にも手作業での対応なしにパフォーマンスを維持できます。
  • コンテナーの交換による自己修復。コンテナーが故障した場合や応答しなくなった場合には、Kubernetes が問題を検出して自動的にコンテナーを置き換えます。この継続的な監視により、個々のコンポーネントが故障した場合にもアプリケーションの可用性を保ちやすくなります。
  • ローリング展開による更新プログラム適用の制御。Kubernetes は、定義された順序に従ってコンテナーを置き換えることで段階的に更新プログラムを導入します。アクティブなワークロードを中断させず、ダウンタイムを減らし、継続的なデリバリーをサポートします。

これらの能力は、インフラストラクチャ全体の中でワークロードの規模変化や変更に対応しながらアプリケーションのスムーズな稼働を維持するために役立ちます。

Kubernetes のユース ケース

  • 複数のサービスからなる分散アプリケーション。多数の相互接続されたコンポーネントで構成されるアプリケーションにおいては、システム間の調整が必要です。たとえば、eコマース プラットフォームでは、支払い、在庫、顧客アカウントの処理をそれぞれ別個のコンテナーで運用する場合があります。Kubernetes は、それらのサービス間の展開と相互通信を管理できます。
  • 高可用性が要求される運用システム。リアルタイムのユーザー アクティビティをサポートするアプリケーションには、ダウンタイムを最小限に抑えるための自動化が必要です。ストリーミング プラットフォーム、金融サービス、コラボレーション ツールでは、ワークロードを監視して故障に対応するために Kubernetes がよく使われています。
  • トラフィック パターンを予測できないワークロード。使用状況が変動するアプリケーションにおいては自動スケーリングが効果を発揮します。季節限定セール時の小売サイトや、イベント リリース時のチケット プラットフォームでは、需要の変化に応じてリソースを調整するために Kubernetes がよく使われています。

Kubernetes では、Docker に直接依存せずコンテナー オーケストレーションを行うこともできます。複数種類のコンテナー ランタイムをサポートしているため、互換性のあるテクノロジを使って構築されたコンテナー化ワークロードであれば管理可能です。

Docker と Kubernetes の併用

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 の組み合わせは、アプリケーションのパッケージ化手法であったコンテナー テクノロジが進化して本格的なインフラストラクチャ管理機能を備えた結果の姿だといえます。分散アーキテクチャが当たり前の形態になってきている中、オーケストレーション プラットフォームやマネージド クラウド サービスは、スケーラブルで信頼性が高いコンテナーベース システムの実現をサポートする上でますます重要な中心的役割を担っています。

グラデーション背景
リソース

開発者向けリソースを見る

学生およびプロフェッショナル向けの多彩なリソースで、最新の開発者テクノロジに関する情報をご覧ください。
コード ソフトウェアを表示した 3 台のモニターの前に座っている女性
Azure リソース

Azure リソース センターにアクセスする

無料の Azure トレーニングおよび認定プログラム、使い方動画、アナリスト レポート、電子書籍をご利用ください
自宅オフィスでノート PC を使っている男性
学生開発者向けリソース

テクノロジー業界のキャリアを順調にスタート

学生向けのツールとプログラムを使用して、クラウド テクノロジーについて学び、開発者スキルを養います。
会議室で、人々がプレゼンテーションを見ながらノート PC を使っています
Azure のイベント

Azure のイベントおよびウェビナーの情報を見る

デジタル イベント、対面イベント、仮想トレーニングで、Azure のエキスパートや開発者と交流しましょう。
よくあるご質問

よく寄せられる質問

  • Docker と Kubernetes は担う役割が異なりますが、補完的な関係にあります。Docker はアプリケーションのパッケージ化と運用に関するしくみです。一方 Kubernetes はアプリケーションが展開された後の管理に関するしくみであり、特に、システムが複雑化するにつれて重要性が増します。一言でいえば、Docker は一貫した形で実行できるようにアプリケーションを準備するものであり、Kubernetes はそれらを環境全体にわたって大規模に管理するものです。
  • Docker と Kubernetes は競合するテクノロジではないため、どちらか一方を選ぶというチームはほとんどありません。Docker はアプリケーションのライフサイクルの早い段階でパッケージ化と実行に使われることが多いのに対し、Kubernetes は、後の段階で、運用環境においてそれらのアプリケーションを管理するために使われます。何を選ぶのが最適かは、アプリケーションの複雑さ、スケール、運用ニーズによって異なります。
  • Kubernetes は Docker とは異なる機能を担うものであるため、Docker の代替にはなりません。Kubernetes は展開後のコンテナーをオーケストレーションする目的で設計されており、アプリケーションのパッケージ化や構築のためではありません。Kubernetes では他のランタイムを使って作成されたコンテナーの管理も可能ですが、開発とデリバリーのワークフローでは、現在も Docker のようなツールがコンテナー イメージの準備によく使われています。
  • はい。Kubernetes なしで Docker を使うことは可能であり、特に、シンプルな環境では容易です。本格的なオーケストレーションを必要としないチームでは、アプリケーションの開発、テスト、または小規模な展開に Docker を単独で使うことはよくあります。その場合には、Kubernetes クラスターの管理という複雑な要素を加えることなく、Docker によるシンプルな方法でアプリケーションをパッケージ化して実行できます。